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 20 Vue.js
vue element实现表格合并行数据
Nov 30 Vue.js
vue+element_ui上传文件,并传递额外参数操作
Dec 05 Vue.js
vue实现图片裁剪后上传
Dec 16 Vue.js
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
在vue项目中封装echarts的步骤
Dec 25 Vue.js
为什么推荐使用JSX开发Vue3
Dec 28 Vue.js
梳理一下vue中的生命周期
Dec 30 Vue.js
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
vue自定义右键菜单之全局实现
Apr 09 Vue.js
vue实力踩坑之push当前页无效
Apr 10 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
php4的session功能评述(三)
2006/10/09 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
JavaScript学习笔记之定时器
2015/01/22 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
python解析模块(ConfigParser)使用方法
2013/12/10 Python
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
Sanic框架流式传输操作示例
2018/07/18 Python
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
基于python3生成标签云代码解析
2020/02/18 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
django 模型字段设置默认值代码
2020/07/15 Python
详解Python中的编码问题(encoding与decode、str与bytes)
2020/09/30 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
软件配置管理有什么好处
2015/04/15 面试题
心得体会开头
2014/01/01 职场文书
实习生评语
2014/04/26 职场文书
大学生创业事迹材料
2014/12/30 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
Golang实现AES对称加密的过程详解
2021/05/20 Golang
MySQL 全文索引使用指南
2021/05/25 MySQL