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组件中节流函数的失效的原因和解决方法
Dec 02 Vue.js
在vue中动态修改css其中一个属性值操作
Dec 07 Vue.js
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
Dec 15 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
vue 导航守卫和axios拦截器有哪些区别
Dec 19 Vue.js
Vue实现省市区三级联动
Dec 27 Vue.js
Vue常用API、高级API的相关总结
Feb 02 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
详解Vue的sync修饰符
May 15 Vue.js
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 Vue.js
vue封装数字翻牌器
Apr 20 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
PHP中常用数组处理方法实例分析
2008/08/30 PHP
php中计算程序运行时间的类代码
2012/11/03 PHP
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
2018/01/17 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
Python科学画图代码分享
2017/11/29 Python
python 读取文件并替换字段的实例
2018/07/12 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
python线程中的同步问题及解决方法
2019/08/29 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
Python新手学习装饰器
2020/06/04 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
Django中ORM的基本使用教程
2020/12/22 Python
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
家长给小学生的评语
2014/01/30 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS