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 相关文章推荐
vue中echarts的用法及与elementui-select的协同绑定操作
Nov 17 Vue.js
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 Vue.js
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
基于vue的video播放器的实现示例
Feb 19 Vue.js
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 Vue.js
Vue多选列表组件深入详解
Mar 02 Vue.js
Vue实现下拉加载更多
May 09 Vue.js
如何理解Vue前后端数据交互与显示
May 10 Vue.js
vue组件的路由高亮问题解决方法
May 11 Vue.js
Vue Mint UI mt-swipe的使用方式
Jun 05 Vue.js
Vue router配置与使用分析讲解
Dec 24 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类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
解决laravel session失效的问题
2019/10/14 PHP
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
JavaScript如何操作css
2020/10/24 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
[02:11]2014DOTA2 TI专访VG战队Fenrir:队伍气氛良好
2014/07/11 DOTA
浅谈Python爬取网页的编码处理
2016/11/04 Python
利用Python操作消息队列RabbitMQ的方法教程
2017/07/19 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
django跳转页面传参的实现
2020/09/17 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
大一自我鉴定范文
2013/10/04 职场文书
关爱老人标语
2014/06/21 职场文书
学术会议通知
2015/04/15 职场文书
未中标通知书
2015/04/17 职场文书
2015年酒店销售部工作总结
2015/07/24 职场文书