详解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实现的网页局布刷新效果
Dec 01 Javascript
jQuery插件开发全解析
Oct 10 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
Nov 09 Javascript
微信小程序 底部导航栏目开发资料
Dec 05 Javascript
JavaScript数组复制详解
Feb 02 Javascript
Bootstrap显示与隐藏简单实现代码
Mar 06 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
Apr 27 Javascript
使用Vue写一个datepicker的示例
Jan 27 Javascript
微信小程序 组件的外部样式externalClasses使用详解
Sep 06 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
Mar 10 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
Feb 25 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公用函数列表[正则]
2007/02/22 PHP
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
浅析php中jsonp的跨域实例
2013/06/21 PHP
ThinkPHP的L方法使用简介
2014/06/18 PHP
php命令行用法入门实例教程
2014/10/27 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
JS调用页面表格导出excel示例代码
2014/03/18 Javascript
AngularJS语法详解
2015/01/23 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
javascript函数的节流[throttle]与防抖[debounce]
2017/11/15 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
vue组件之间的数据传递方法详解
2019/04/19 Javascript
React优化子组件render的使用
2019/05/12 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
学生信息管理系统python版
2018/10/17 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
公司部门司机岗位职责
2014/01/03 职场文书
超市开店计划书
2014/09/15 职场文书