computed与watch对比

computed计算属性和watch侦听属性都是vue内常用的两个方法,其中computed计算属性依赖其它的属性计算所得出最后的值,watch侦听属性是监听一个值的变化,然后执行相对应的函数。

computed 计算属性

计算属性将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。
1. 支持缓存,只有依赖数据发生改变,才会重新进行计算
2. 不支持异步,当computed内有异步操作时无效,无法监听数据的变化
3. computed 属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过或者父组件传递的props中的数据通过计算得到的值
4. 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对一或者一对一,一般用computed
5.如果computed属性属性值是函数,那么默认会走get方法;函数的返回值就是属性的属性值;在computed中的,属性都有一个get和一个set方法,当数据变化时,调用set方法。

这里我们使用官方的案例:

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: {
    // getter
    get: function () {
      return this.firstName + ' ' + this.lastName
    },
    // setter
    set: function (newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
  }
})

这里我们可以发现fullName = firstName + lastNamefullName是没有定义到data中的,同时我们需要展示的也是fullname。
computed一般默认是只使用getter,那么此时computer是只能获取值不能更改值的,不过有需要的时候可以添加上setter,例如上面代码添加了setter的值,当fullName改变之后处理改变的新值并且传给data中的属性。

computed的值在getter执行后是会缓存的,只有在它依赖的属性值改变之后,下一次获取computed的值时才会重新调用对应的getter来计算。

所以上面代码的逻辑可以理解如下:

  1. 首先fullName = FooBar
  2. 之后再某一个地方修改了fullName的值,就调用了computer的setter,同时更改了firstName和lastName
  3. 更改了fullName的computer依赖的属性值之后,就会重新调用computer的getter,重新获取值,完成一次数据的更新

所以如果一个值依赖多个属性(多对一)的时候,就用computer

watch侦听属性

一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个 property。
1. 不支持缓存,数据变,直接会触发相应的操作;
2. watch支持异步;
3. 监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;
4. 当一个属性发生变化时,需要执行对应的操作;一对多;
5. 监听数据必须是data中声明过或者父组件传递过来的props中的数据,当数据变化时,触发其他操作,函数有两个参数,
  immediate:组件加载立即触发回调函数执行,
  deep: 深度监听,为了发现对象内部值的变化,复杂类型的数据时使用,例如数组中的对象内容的改变,注意监听数组的变动不需要这么做。注意:deep无法监听到数组的变动和对象的新增,参考vue数组变异,只有以响应式的方式触发才会被监听到。

  data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  },
  watch: {
     firstName: function (val)  {
       this.fullName = val + ' ' + this.lastName
     },
     lastName: function (val) {
       this.fullName = this.firstName + ' ' + val
      }
  }

通过代码可以发现,watch是监听已经存在的数据firstNamelastName并且修改的fulName都是已经在data中定义的数据。同时watcher还会获取监听对象改变前后的值,并且做出一些处理。

watch: {
// 监听数据a   
a: {
   // 数据改变后执行的函数可以获取到newVal改变后的值和oldVal改变前的值,并且做一些炒作
   handler(newVal,oldVal) {}
   // 深度监听,为了发现对象内部值的变化,但是无法监听到具体对象里面那个属性的变化
   deep: true,
   // 组件加载立即触发回调函数执行
   immediate: true
   }
}

如果一个值变化后会引起一系列操作,或者一个值变化会引起一系列值的变化(一对多)的时候就是用watch

你可能感兴趣的:(computed与watch对比)