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 相关文章推荐
prototype1.4中文手册
Sep 22 Javascript
一段好玩的JavaScript代码
Dec 01 Javascript
Visual Studio中的jQuery智能提示设置方法
Mar 27 Javascript
JQuery获取文本框中字符长度的代码
Sep 29 Javascript
jsp+javascript打造级连菜单的实例代码
Jun 14 Javascript
Jquery跳到页面指定位置的方法
May 12 Javascript
swtich/if...else的替代语句
Aug 16 Javascript
js实现Select头像选择实时预览代码
Aug 17 Javascript
JS实现带鼠标效果的头像及文章列表代码
Sep 27 Javascript
微信小程序日期选择器实例代码
Jul 18 Javascript
vue-resource:jsonp请求百度搜索的接口示例
Nov 09 Javascript
用React Native制作一个简单的游戏引擎
May 27 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
PHP执行zip与rar解压缩方法实现代码
2010/12/05 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
PHP join()函数用法与实例讲解
2019/03/11 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
2019/10/20 PHP
自己动手开发jQuery插件教程
2011/08/25 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
JavaScript截屏功能的实现代码
2017/07/28 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
javascript实现简单页面倒计时
2021/03/02 Javascript
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
Python计算回文数的方法
2015/03/11 Python
python决策树之CART分类回归树详解
2017/12/20 Python
python实时监控cpu小工具
2018/06/21 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
Python中logging实例讲解
2019/01/17 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android
如何使用python包中的sched事件调度器
2022/04/30 Python