Vue中computed和watch有哪些区别


Posted in Vue.js onDecember 19, 2020

计算属性computed:

  • 支持缓存,只有依赖数据发生改变,才会重新进行计算
  • 不支持异步,当computed内有异步操作时无效,无法监听数据的变化
  • computed 属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过或者父组件传递的props中的数据通过计算得到的值
  • 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对一或者一对一,一般用computed
  • 如果computed属性属性值是函数,那么默认会走get方法;函数的返回值就是属性的属性值;在computed中的,属性都有一个get和一个set方法,当数据变化时,调用set方法。
var vm = new Vue({
 el: '#app',
 data: {
  message: 'hello'
 },
 template: `
 <div> <p>我是原始值: "{{ message }}"</p> <p>我是计算属性的值: "{{ computedMessage}}"</p> // computed 在 DOM 里直接使用不需要调用 </div> `,
 computed: {
  // 计算属性的 getter   computedMessage: function () {
   // `this` 指向 vm 实例    return this.message.split('').reverse().join('')
  }
 }
})

结果:

我是原始值: "Hello"
我是计算属性的值: "olleH"

如果不使用计算属性,那么 message.split('').reverse().join('') 就会直接写到 template 里,那么在模版中放入太多声明式的逻辑会让模板本身过重,尤其当在页面中使用大量复杂的逻辑表达式处理数据时,会对页面的可维护性造成很大的影响

而且计算属性如果依赖不变的话,它就会变成缓存,computed 的值就不会重新计算

所以,如果数据要通过复杂逻辑来得出结果,那么就推荐使用计算属性

侦听属性watch

  • 不支持缓存,数据变,直接会触发相应的操作。
  • watch支持异步;监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;
  • 当一个属性发生变化时,需要执行对应的操作;一对多;
  • 监听数据必须是data中声明过或者父组件传递过来的props中的数据,当数据变化时,触发其他操作,函数有两个参数:
new Vue({
 data: {
  n: 0,
  obj: {
   a: "a"
  }
 },
 template: `
 <div> <button @click="n += 1">n+1</button> <button @click="obj.a += 'hi'">obj.a + 'hi'</button> <button @click="obj = {a:'a'}">obj = 新对象</button> </div> `,
 watch: {
  n() {
   console.log("n 变了");
  },
  obj:{
   handler: function (val, oldVal) { 
   console.log("obj 变了")
  },
   deep: true // 该属性设定在任何被侦听的对象的 property 改变时都要执行 handler 的回调,不论其被嵌套多深   },
  "obj.a":{
   handler: function (val, oldVal) { 
   console.log("obj.a 变了")
  },
   immediate: true // 该属性设定该回调将会在侦听开始之后被立即调用   }
 }
}).$mount("#app");

不应该使用箭头函数来定义 watcher 函数,因为箭头函数没有 this,它的 this 会继承它的父级函数,但是它的父级函数是 window,导致箭头函数的 this 指向 window,而不是 Vue 实例

  • deep 控制是否要看这个对象里面的属性变化
  • immediate 控制是否在第一次渲染是执行这个函数

vm.$watch() 的用法和 watch 回调类似

  • vm.$watch('data属性名', fn, {deep: .., immediate: ..})
vm.$watch("n", function(val, newVal){
   console.log("n 变了");
},{deep: true, immediate: true})

总结

  • 如果一个数据需要经过复杂计算就用 computed
  • 如果一个数据需要被监听并且对数据做一些操作就用 watch

以上就是Vue中computed和watch有哪些区别的详细内容,更多关于Vue中computed和watch的区别的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
Vue3+elementui plus创建项目的方法
Dec 01 Vue.js
在vue项目中封装echarts的步骤
Dec 25 Vue.js
vue使用transition组件动画效果的实例代码
Jan 28 Vue.js
vue 根据选择的月份动态展示日期对应的星期几
Feb 06 Vue.js
如何在 Vue 中使用 JSX
Feb 14 Vue.js
vue-router路由懒加载及实现的3种方式
Feb 28 Vue.js
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
vue实现移动端div拖动效果
Mar 03 Vue.js
Vue中Object.assign清空数据报错的解决方案
Mar 03 Vue.js
VUE使用draggable实现组件拖拽
Apr 06 Vue.js
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
vue-cli3.x配置全局的scss的时候报错问题及解决
Apr 30 Vue.js
Vue与React的区别和优势对比
Dec 18 #Vue.js
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 #Vue.js
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 #Vue.js
vue 数据操作相关总结
Dec 17 #Vue.js
Vue 组件注册全解析
Dec 17 #Vue.js
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 #Vue.js
vue实现图片裁剪后上传
Dec 16 #Vue.js
You might like
正则表达式语法
2006/10/09 Javascript
php短信接口代码
2016/05/13 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
js取值中form.all和不加all的区别介绍
2014/01/20 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
TensorFlow 合并/连接数组的方法
2018/07/27 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
PyQt5实现简易计算器
2020/05/30 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
竞争上岗演讲稿
2014/01/05 职场文书
校园奶茶店创业计划书
2014/01/23 职场文书
银行服务感言
2014/03/01 职场文书
企业贷款委托书格式
2014/09/12 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
先进党员事迹材料
2014/12/24 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫