详解vue 计算属性与方法跟侦听器区别(面试考点)


Posted in Javascript onApril 23, 2018

计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如:

<div id="example">
 {{ message.split('').reverse().join('') }}
</div>

在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中多次引用此处的翻转字符串时,就会更加难以处理。

所以,对于任何复杂逻辑,你都应当使用计算属性。

基础例子

<div id="app">
 {{fullName}}
</div>
  
  
var vm = new Vue({
 el: '#app',
 data: {
  firstName: "王",
  lastName: "小智",
  age: 28
 },
 // 计算属性
 computed: {
   fullName: function () {
     console.log("计算了一次")
     return this.firstName + " " + this.lastName
   }
 }
})

结果:

王小智

然后我们通过浏览器改变age属性的值,让页面重新渲染:

详解vue 计算属性与方法跟侦听器区别(面试考点)

大家可以看到,我们改变了age值计算属性的方法没有被调用,那如果计算属性的值发生了改变,如lastName或者firstName改变,打印结果又会怎么样呢?

详解vue 计算属性与方法跟侦听器区别(面试考点)

大家可以看到,当他依赖的发生变化的时候,计算属性会重新计算一次。

计算属性缓存 vs 方法

你可能已经注意到我们可以通过在表达式中调用方法来达到同样的效果:

<p>Reversed message: "{{ fullName() }}"</p>


// 在组件中
methods: {
 fullName: function () {
  console.log("计算了一次")
  return this.firstName + " " + this.lastName;
 }
}

结果:

王小智

同样参照上面,我们通过浏览器改变age属性的值,让页面重新渲染:

详解vue 计算属性与方法跟侦听器区别(面试考点)

可以看出,我们页面只要重新渲染,方法都会执行一次,而计算属性只有在它的相关依赖发生改变时才会重新求值。

我们为什么需要缓存?假设我们有一个性能开销比较大的的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于A 。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用方法来替代。

计算属性 vs 侦听属性

你可能已经注意到我们还可以通过侦听属性达到同样的效果:

var vm = new Vue({
 el: '#app',
 data: {
  firstName: "王",
  lastName: "小智",
  age: 28,
  fullName
 },
 // 计算属性
 watch: {
   firstName: function () {
    console.log("计算了一次");
    this.fullNmae = this.firstName + this.lastName;
   },
   lastName: function () {
    console.log("计算了一次")
    this.fullNmae = this.firstName + this.lastName;
   }
 }
})

结果:

王小智

同样参照上面,我们通过浏览器改变age属性的值,让页面重新渲染:

详解vue 计算属性与方法跟侦听器区别(面试考点)

大家可以看到,和fullname不相关的改变,fullName没有变化,跟计算属性类似,会有缓存,只有在它的相关依赖发生改变时才会重新求值,将它与计算属性的版本进行比较,好得多了,不是吗?

当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch——特别是如果你之前使用过
AngularJS。然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery Post处理后不进入回调的原因及解决方法
Jul 15 Javascript
基于Jquery代码实现手风琴菜单
Nov 19 Javascript
浅谈JavaScript对象与继承
Jul 10 Javascript
JS转换HTML转义符的方法
Aug 24 Javascript
D3.js中强制异步文件读取同步的几种方法
Feb 06 Javascript
Vue的Flux框架之Vuex状态管理器
Jul 30 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
Dec 15 Javascript
React Native自定义控件底部抽屉菜单的示例
Feb 08 Javascript
VUE简单的定时器实时刷新的实现方法
Jan 20 Javascript
解决vant中 tab栏遇到的坑 van-tabs
Nov 04 Javascript
详解如何在Canvas中添加事件的方法
Apr 17 Javascript
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
May 25 Vue.js
JavaScript变量声明var,let.const及区别浅析
Apr 23 #Javascript
Node.js应用设置安全的沙箱环境
Apr 23 #Javascript
vue-devtools的安装步骤
Apr 23 #Javascript
使用Vue组件实现一个简单弹窗效果
Apr 23 #Javascript
深入理解JavaScript和TypeScript中的class
Apr 22 #Javascript
原生JS进行前后端同构
Apr 22 #Javascript
如何以Angular的姿势打开Font-Awesome详解
Apr 22 #Javascript
You might like
咖啡的种类和口感
2021/03/03 新手入门
IIS7.X配置PHP运行环境小结
2011/06/09 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
PHP自定义错误用法示例
2016/09/28 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python微信公众号开发简单流程
2018/03/23 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
Python数据正态性检验实现过程
2020/04/18 Python
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
售后专员岗位职责
2013/12/08 职场文书
财务会计自荐信范文
2014/02/21 职场文书
人代会标语
2014/06/30 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
2014年销售员工作总结
2014/12/01 职场文书
2015年高三毕业班班主任工作总结
2015/10/22 职场文书
python 中的@运算符使用
2021/05/26 Python
只用Python就可以制作的简单词云
2021/06/07 Python
图文详解matlab原始处理图像几何变换
2021/07/09 Python
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL