详解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下jstree简单应用 - v1.0
Apr 14 Javascript
javascript模拟select,jselect的方法实现
Nov 08 Javascript
jquery怎样实现ajax联动框(二)
Mar 08 Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 Javascript
jQuery表单验证插件解析(推荐)
Jul 21 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
Dec 09 Javascript
JS填写银行卡号每隔4位数字加一个空格
Dec 19 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
Jan 25 Javascript
Vue获取DOM元素样式和样式更改示例
Mar 07 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
May 26 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
Jun 01 Javascript
element el-input directive数字进行控制
Oct 11 Javascript
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
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
2014/06/25 PHP
浅谈thinkphp的nginx配置,以及重写隐藏index.php入口文件方法
2019/10/12 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
2019/10/17 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
仿JQuery输写高效JSLite代码的一些技巧
2015/01/13 Javascript
jQuery学习笔记之基础中的基础
2015/01/19 Javascript
JavaScript基本语法讲解
2015/06/03 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
jquery鼠标悬停导航下划线滑出效果
2017/09/29 jQuery
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
python列表操作实例
2015/01/14 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
python输出100以内的质数与合数实例代码
2018/07/08 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
YUV转为jpg图像的实现
2019/12/09 Python
python实现logistic分类算法代码
2020/02/28 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
Kusmi茶美国官网:优质散叶茶和茶包
2019/10/13 全球购物
商务会议邀请函
2014/01/09 职场文书
医务工作者先进事迹材料
2014/01/26 职场文书
合作意向协议书范本
2014/03/31 职场文书
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android
Python中re模块的元字符使用小结
2022/04/07 Python