computed 和 watch 的区别

101 阅读2分钟

computed

computed : 计算属性(别人变化影响我自己)

  • 计算属性是由data中的已知值,得到的一个新值。这个新值只会根据已知值的变化而变化,其他不相关的数据的变化不会影响该新值。
  • 计算属性不在data中,计算属性新值的相关已知值在data中。
  • 计算结果会被缓存,computed的值在getter执行后是会缓存的,只有在它依赖的属性值改变之后,下一次获取computed的值时才会重新调用对应的getter来计算

computed应用场景

适用于重新计算比较费时不用重复数据计算的环境。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。如果一个数据依赖于其他数据,那么把这个数据设计为computed

watch

watch:监听数据的变化(我的变化影响别人)

  • 监听data中数据的变化,监听的数据就是data中的已知值,默认情况下, watch只在被监听的属性值发生变化时执行.
  • immediate: true选项, 这样它会在组件创建时立即执行
  • deep:true, 默认值为: false, 即是否需要开启深度监听,开启的话对象中任何一个属性改变都会触发监听器中的处理函数

watch例子:

export default {
  data: () => ({
    dog: ""
  }),
  watch: {
    dog(newVal, oldVal) {
      console.log(`Dog changed: ${newVal}`);
    }
  }
};

如上代码所示, 只有当dog的值有发生改变时, watch中的dog函数才会执行.

总结:

功能上:computed是计算属性,也就是依赖其它的属性计算所得出最后的值。watch是去监听一个值的变化,然后执行相对应的函数

使用上:computed中的函数必须要用return返回;watch的回调里面会传入监听属性的新旧值,通过这两个值可以做一些特定的操作,不是必须要用return

性能上:computed中的函数所依赖的属性没有发生变化,那么调用当前的函数的时候会从缓存中读取,而watch在每次监听的值发生变化的时候都会执行回调

场景上:computed:当一个属性受多个属性影响的时候,例子:购物车商品结算;watch:当一条数据影响多条数据的时候,例子:搜索框