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防抖与节流
Nov 24 Vue.js
vue中defineProperty和Proxy的区别详解
Nov 30 Vue.js
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
vuex Module将 store 分割成模块的操作
Dec 07 Vue.js
vue 使用class创建和清除水印的示例代码
Dec 25 Vue.js
vue watch监控对象的简单方法示例
Jan 07 Vue.js
vue使用transition组件动画效果的实例代码
Jan 28 Vue.js
详解vue身份认证管理和租户管理
May 25 Vue.js
Vue + iView实现Excel上传功能的完整代码
Jun 22 Vue.js
Vue实现跑马灯样式文字横向滚动
Nov 23 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
vue使用element-ui按需引入
May 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制作静态网站的模板框架
2006/10/09 PHP
php获取服务器信息的实现代码
2013/02/04 PHP
PHP 类相关函数的使用详解
2013/05/10 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
php和js对数据库图片进行等比缩放示例
2014/04/28 Javascript
AngularJS内置指令
2015/02/04 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
用jquery的attr方法实现图片切换效果
2017/02/05 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
Python 初始化多维数组代码
2008/09/06 Python
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
Python tkinter常用操作代码实例
2020/01/03 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
Python常用外部指令执行代码实例
2020/11/05 Python
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
成人大专自我鉴定范文
2013/10/19 职场文书
会计专业自荐信范文
2013/12/02 职场文书
药学专业个人的自我评价
2013/12/31 职场文书
大学生职业生涯规划方案
2014/01/03 职场文书
分享一些Java的常用工具
2021/06/11 Java/Android
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python