详解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 相关文章推荐
JS 打印功能代码可实现打印预览、打印设置等
Oct 31 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
Dec 29 Javascript
js实现漫天星星效果
Jan 19 Javascript
vue生成token保存在客户端localStorage中的方法
Oct 25 Javascript
Vue配合iView实现省市二级联动的示例代码
Jul 27 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
Sep 19 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
Nov 02 Javascript
js实现简单模态框实例
Nov 16 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
Dec 13 Javascript
js Math数学简单使用操作示例
Mar 13 Javascript
微信小程序picker组件两列关联使用方式
Oct 27 Javascript
gojs实现蚂蚁线动画效果
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边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
2015/09/06 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
[46:57]EG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python正则表达式match和search用法实例
2015/03/26 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
Python 写了个新型冠状病毒疫情传播模拟程序
2020/02/14 Python
python利用xpath爬取网上数据并存储到django模型中
2021/02/26 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
Noon埃及:埃及在线购物
2019/11/26 全球购物
大学毕业感言一句话
2014/02/06 职场文书
《藤野先生》教学反思
2014/02/19 职场文书
技校学生个人职业生涯规划范文
2014/03/03 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
教师节横幅标语
2014/10/08 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
SQL Server内存机制浅探
2022/04/06 SQL Server