Vue中的methods、watch、computed的区别


Posted in Javascript onNovember 26, 2018

看到这个标题就知道这篇文章接下来要讲的内容,我们在使用vue的时候methods、watch、computed这三个特性一定经常使用,因为它们是非常的有用,但是没有彻底的理解它们的区别和各自的使用场景,也很难用好它们,希望接下来的介绍为你答疑解惑。

computed

我们先来看计算属性:computed,光看名字也知道是用来干什么的,计算属性当然是用来计算的,但是是怎么计算的呢?计算属性有两个显著的特点:

  • 计算属性计算时所依赖的属性一定是响应式依赖,否则计算属性不会执行
  • 计算属性是基于依赖进行缓存的,就是说在依赖没有更新的情况,调用计算属性并不会重新计算,可以减少开销

我们来看一个相关的例子:

<div id="app">
 <div>{{ arr.join('') }}</div>
 <div>{{ arr1 }}</div>
 <div>{{ getDate }}</div>
 <div>{{ getDate1 }}</div>
</div>
var app = new Vue({
 el: '#app',
 data: {
  date: '',
  arr: ['a', 'b', 'c']
 },
 computed: {
  getDate () {
   return Date.now()
  },
  getDate1 () {
   return this.date
  },
  arr1 () {
   return this.arr.join('')
  }
 },
 created () {
  setInterval(() => {
   this.date = Date.now()
  }, 1000)
 }
})

看上面的例子,我们在写vue的时候,经常会碰到要对data的值进行操作的情况,为了方便,总是会有人直接在模版中对data的值进行计算操作,就像我上面例子中写的在模版中将数组转化为字符串,这样写有问题吗?语法没有问题,但是在模版中使用太多的计算,维护会是个问题,换个人来看代码的时候会很痛苦,这种写法就好像在html中插入js的逻辑运算,可维护性极差。另外一个展示的就是computed的响应式依赖的问题,当我们调用getDate的时候返回的Date.now()返回的是一个非响应式的依赖因此getDate返回的值不会变。

应用场景

看了computed的特点之后,那么它的应用场景是什么呢?个人看法,但不限于以下场景:

  • 复杂的渲染数据计算,用computed计算属性可以减少一定计算开销,增加可维护性
  • 从Vuex Store中收集相关信息,对Vuex中的数据做计算的时候的要特别注意computed的缓存属性,在对Vuex中的对象值进行属性修改的时候,并不会触发computed的中值的变化,这时需要Object.assign({},obj)对依赖对象进行跟新返回一个新对象触发依赖跟新
  • 表单校验,这个应用场景应该是比较常见的,利用正则表达式对每个表单项的实时监控,判断表单是否可以提交

methods

methods大家应该都会用,是vue中的方法属性,所有的方法调用都会写到这里面,大家用的最多也是在累似@click这样事件调用中使用,但是很多人都忽视methods的另一个用法,就是在模版中使用methods,下面来看一个例子:

<div id="app">
 <div v-for="(item, idx) in arr">
  {{ matching(item) }}
 </div>
</div>
var app = new Vue({
 el: '#app',
 data: {
  arr: ['a', 'b', 'c'],
  obj: {a: 'hello', b: 'world'}
 },
 methods: {
  matching (key) {
   if (this.obj[key]) {
    return this.obj[key]
   } else {
    return 'not found'
   }
  }
 }
})

Vue中的methods、watch、computed的区别

上面的例子就是methods在模版中常常使用的一个场景,当模版中的某个循环的值需要进行一定逻辑运算时,这时候你就可以使用methods方法,将对应的值传入,然后计算出结果返回到模版显示,这个时候用computed是没法实现的,computed中你无法传参,methods和computed除了这个不一样之外,还有就是在methods中的计算是不会做缓存的,也就是你调用多少次就会计算多少次,相对computed的开销要大一些。

watch

侦听属性是专门用来观察和响应vue实例上的数据变动,能使用watch属性的场景基本上都可以使用computed属性,而且computed属性开销小,性能高,因此能使用computed就尽量使用computed属性,那么watch属性是不是就没用武之地了呢?当执行异步操作的时候你可能就必须用watch而不是computed了,下面看一个例子:

<div id="app">
 <div>{{ obj1.a }}</div>
</div>
var app = new Vue({
 el: '#app',
 data: {
  obj: {a: 'hello'},
  obj1: {a: 'hello'},
  test: 'aaa'
 },
 computed: {
  getObj () {
   setTimeout(() => {
    this.obj.a = this.test + 'word'
    return this.obj
   }, 1000)
  }
 },
 watch: {
  test () {
   setTimeout(() => {
    this.obj1.a = this.test + 'word'
   }, 1000)
  }
 },
 mounted () {
  this.test = 'hello'
 }
})

上述例子中,当在模版中调用getObj.a时,如果没有setTimeout这异步操作,直接返回一个值是可以直接在模版中显示的,但是由于加异步操作就会导致没有返回值同时调用对象的属性,就会报错,而调用obj1.a却不一样,模版会先显示hello,然后在触发了watch属性时,setTimeout触发,一秒钟之后模版会显示helloword,这就watch中可以使用异步函数,而computed不行的原因

总结

希望看了这篇文章能对你区分methods、computed、watch的用法能有所帮助。

这篇文章如果有错误或不严谨的地方,欢迎批评指正,如果喜欢,欢迎点赞收藏

Javascript 相关文章推荐
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
May 25 Javascript
JSP跨iframe如何传递参数实现代码
Sep 21 Javascript
js取整数、取余数的方法
May 11 Javascript
node.js实现逐行读取文件内容的代码
Jun 27 Javascript
写jQuery插件时的注意点
Feb 20 Javascript
10道典型的JavaScript面试题
Mar 22 Javascript
Bootstrap常用组件学习(整理)
Mar 24 Javascript
利用babel将es6语法转es5的简单示例
Dec 01 Javascript
layui中使用jquery控制radio选中事件的示例代码
Aug 15 jQuery
使用p5.js临摹动态图形
Oct 23 Javascript
layui清除radio的选中状态实例
Nov 14 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
Sep 02 Javascript
vue-router懒加载速度缓慢问题及解决方法
Nov 25 #Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
Nov 25 #Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
Nov 25 #Javascript
vue中tab选项卡的实现思路
Nov 25 #Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
Nov 25 #Javascript
vscode 开发Vue项目的方法步骤
Nov 25 #Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
Nov 25 #Javascript
You might like
用cookies来跟踪识别用户
2006/10/09 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
2013/11/07 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
javascript面向对象之定义成员方法实例分析
2015/01/13 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
Python数据结构之Array用法实例
2014/10/09 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
python实现简单日期工具类
2019/04/24 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
2019/06/12 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
python db类用法说明
2020/07/07 Python
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
党员承诺书内容
2014/03/26 职场文书
大学新生入学教育方案
2014/05/16 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书
2019垃圾分类宣传口号汇总
2019/08/16 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers