详解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 相关文章推荐
javascript定时保存表单数据的代码
Mar 17 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
Jun 29 Javascript
用console.table()调试javascript
Sep 04 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
Apr 02 Javascript
jquery实现表单验证并阻止非法提交
Jul 09 Javascript
原生js的数组除重复简单实例
May 24 Javascript
JavaScript 五大常见函数
Mar 23 Javascript
详解Vue源码学习之callHook钩子函数
Jul 25 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
Apr 15 Javascript
jquery实现垂直手风琴菜单
Mar 04 jQuery
vue使用map代替Aarry数组循环遍历的方法
Apr 30 Javascript
vue.js实现双击放大预览功能
Jun 23 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比较多维数组中值的大小排序实现代码
2012/09/08 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
Python实现抓取百度搜索结果页的网站标题信息
2015/01/22 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
python运行其他程序的实现方法
2017/07/14 Python
python学习必备知识汇总
2017/09/08 Python
解决python线程卡死的问题
2019/02/18 Python
python conda操作方法
2019/09/11 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
2020/03/18 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
C#笔试题和英文面试题
2013/02/07 面试题
机械绘图员岗位职责
2013/11/19 职场文书
编辑找工作求职信范文
2013/12/16 职场文书
领导检查欢迎词
2014/01/14 职场文书
大学生职业生涯规划书范文
2014/01/14 职场文书
洗发露广告词
2014/03/14 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
2014年城管个人工作总结
2014/12/08 职场文书
参观邀请函范文
2015/02/02 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
财务管理制度范本
2015/08/04 职场文书
文明礼貌主题班会
2015/08/14 职场文书