详解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的inputlimiter 实现字数限制功能
May 30 Javascript
初窥JQuery(二)事件机制(2)
Dec 06 Javascript
js 使用form表单select类实现级联菜单效果
Dec 19 Javascript
JavaScript实现的一个日期格式化函数分享
Dec 06 Javascript
Angular的$http的ajax的请求操作(推荐)
Jan 10 Javascript
Webpack打包慢问题的完美解决方法
Mar 16 Javascript
解读ES6中class关键字
Nov 20 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
Jan 23 Javascript
说说如何在Vue.js中实现数字输入组件的方法
Jan 08 Javascript
Vue动态面包屑功能的实现方法
Jul 01 Javascript
extjs4图表绘制之折线图实现方法分析
Mar 06 Javascript
详解TypeScript的基础类型
Feb 18 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项目中类的自动加载实例讲解
2019/09/12 PHP
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
Node.js编码规范
2014/07/14 Javascript
js清空表单数据的两种方式(遍历+reset)
2014/07/18 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
2017/12/31 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
Vue2.0学习系列之项目上线的方法步骤(图文)
2018/09/25 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
python写入中英文字符串到文件的方法
2015/05/06 Python
替换python字典中的key值方法
2018/07/06 Python
对Python中for复合语句的使用示例讲解
2018/11/01 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
python的scipy.stats模块中正态分布常用函数总结
2021/02/19 Python
HTML5 history新特性pushState、replaceState及两者的区别
2015/12/26 HTML / CSS
Andrew Marc官网:设计师外套的领先制造商
2019/10/30 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
四年的大学生生活自我评价
2013/12/09 职场文书
决定成败的关键——创业计划书
2014/01/24 职场文书
翻译学院毕业生自荐书
2014/02/02 职场文书
高级工程师英文求职信
2014/03/19 职场文书
《观舞记》教学反思
2014/04/16 职场文书
开学典礼演讲稿
2014/05/23 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
2015国庆节感想
2015/08/04 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS