详解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 $.each的用法说明
Mar 22 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
Dec 11 Javascript
绑定回车enter事件代码
May 18 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
Jul 02 Javascript
14个有用的Jquery技巧分享
Jan 08 Javascript
原生javascript实现图片弹窗交互效果
Jan 12 Javascript
EasyUI中datagrid在ie下reload失败解决方案
Mar 09 Javascript
JS实现的仿QQ空间图片弹出效果代码
Feb 23 Javascript
AngularJS应用开发思维之依赖注入3
Aug 19 Javascript
Node.js批量给图片加水印的方法
Nov 15 Javascript
js实现1,2,3,5数字按照概率生成
Sep 12 Javascript
openlayers4实现点动态扩散
Aug 17 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
PHP递归创建多级目录
2015/11/05 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
PHP实现的同步推荐操作API接口案例分析
2016/11/30 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
解析Javascript中中括号“[]”的多义性
2013/12/03 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
每天一篇javascript学习小结(Function对象)
2015/11/16 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
微信小程序 Windows2008 R2服务器配置TLS1.2方法
2016/12/05 Javascript
JS中type=&quot;button&quot;和type=&quot;submit&quot;的区别
2017/07/04 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
[00:48]完美“圣”典2016风云人物:xiao8宣传片
2016/11/30 DOTA
python socket 超时设置 errno 10054
2014/07/01 Python
Python-嵌套列表list的全面解析
2016/06/08 Python
Python 多线程实例详解
2017/03/25 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
简单了解python的内存管理机制
2019/07/08 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
初中优秀班集体申报材料
2014/05/01 职场文书
英语三分钟演讲稿
2014/08/19 职场文书
授权委托书
2014/09/17 职场文书
机关作风建设剖析材料
2014/10/11 职场文书
前台文员岗位职责
2015/02/04 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
会议通知范文
2015/04/15 职场文书
2016年元旦致辞
2015/08/01 职场文书
党章党规党纪学习心得体会
2016/01/14 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers