vue 核心之一 计算属性computed 和侦听属性watch

戴宗
• 阅读 2388

对于很多初学vue的初级前端开发工程而言,在了解了vue双向数据绑定v-model、模板语法、实例创建等基础的知识之后,对于一些复杂的数据操作还无从下手。

首先,什么是计算属性?

在vue官方文档中,对计算属性的初衷是由于模板内部的表达式虽然已经很便利,但是它只能进行简单的运算,而且面对复杂逻辑的时候,模板过重并且难以维护,所以官方给的建议是对于任何复杂的逻辑都应当使用计算属性。

那么,我们为什么要使用计算属性呢?它到底有什么好处,可以给我们带来哪些便利呢?
我们一起来看下以下代码

<div id="app">
  {{ message.split('').reverse().join('') }}
</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  }
})

对于初学着来说,如果要拆分对message进行处理或者其他的复杂操作,我们可能会想到上面这种形式去处理,但是如果说,要实行for循环呢?

有人会说,我可以在`methods: {
reversedMessage: function () {

return this.message.split('').reverse().join('')

}
}`
这样写,
但是,如果我需要这个message动态的去改变呢?
为了适应复杂的业务逻辑,计算属性cumputed就横空出世了,虽然cumputed和methods可以完成同样的事情,但是copmputed是基于依赖进行缓存的,然而methods需要每一次的去进行计算。
我们可以改写这个例子

<div id="app">
  <h1>{{ reversedMessage}}"</h1>
</div>
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 app 实例
      return this.message.split('').reverse().join('')
    }
  }
})

我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。此时你可以动态的去修改message的值,可以动态的看到reversedMessage再动态的更新。

其次:计算属性是没有setter的,默认的情况下只有getter

不过你可以添加一个setter进去。
例子:

<div id="app">{{ allName }}</div>
// 用computed实现
var vm = new Vue({
  el: '#app',
  data: {
    her: '尼古拉斯赵四',
    he: '刘英'
  },
  computed: {
    allName: function () {
        get: function () {
          return this.her+ ' 的女儿是' + this.lastName
        },
         // setter
        set: function (newValue) {
          var names = newValue.split(' ')
          this.her= names[0]
          this.he= names[names.length - 1]
        }
    }
  }
})

现在运行vm.allName时,setter也会执行,vm.her和vm.she也会被更新

Watch

虽然计算属性很强大,但是面对复杂的业务需求和奇特的产品经理(虽然很多时候你都想狠狠地胖揍他一顿)的时候,我们也需要一个自定义的侦听器去检测数据的动态变化,当数据进行异步或者数据的开销比较庞大的时候,这个时候watch就显得比较有用了
`<div id="app">
<button @click="add">add</button>
<p>点击次数:{{num}}</p>
</div>

var vm = new Vue({
el: '#app',
data: {

num: 10

},
watch: {

// 监听数据的变化做出对应的改变,并不会生成新的属性
num (val) {
    if (val< 5) this.alert()
}

},
methods: {

alert () {
  alert('点击次数达到'+this.number+'次啦')
},
add () {
  this.number -= 1
}

}
})`

当你点击的时候执行add方法,改变num的值,而watch正在监听num的变化,此时当num<5时,即刻执行alert方法,点击次数到达了4次啦。
在我们需要依赖动态的去改变data的值之后进行逻辑其他逻辑操作的时候以及我们需要监听数据结构层次比较高的时候可以使用deep属性进行深度监听。

好了,喜欢的朋友请关注下方公众号,每天不定期更新更多前沿前端技术内容。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
4年前
Vue 的计算属性如何实现缓存?(原理深入揭秘)
前言很多人提起Vue中的computed,第一反应就是计算属性会缓存,那么它到底是怎么缓存的呢?缓存的到底是什么,什么时候缓存会失效,相信还是有很多人对此很模糊。本文以Vue2.6.11版本为基础,就深入原理,带你来看看所谓的缓存到底是什么样的。注意本文假定你对Vue响应式原理已经有了基础的了解,如果对于Wat
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
4年前
thinkphp3.2.3模板渲染支持三元表达式
thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这