详解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 相关文章推荐
Jsonp 跨域的原理以及Jquery的解决方案
May 18 Javascript
JS模块与命名空间的介绍
Mar 22 Javascript
javascript字母大小写转换的4个函数详解
May 09 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
Aug 18 Javascript
Javascript无参数和有参数类继承问题解决方法
Mar 02 Javascript
jquery实用技巧之输入框提示语句
Jul 28 Javascript
详解vue.js移动端导航navigationbar的封装
Jul 05 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
Oct 17 Javascript
浅谈React中的元素、组件、实例和节点
Feb 27 Javascript
JS实现显示当前日期的实例代码
Jul 03 Javascript
微信小程序webview 脚手架使用详解
Jul 22 Javascript
html实现随机点名器的示例代码
Apr 02 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对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
推荐5款跨平台的PHP编辑器
2014/12/25 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
JS的replace方法详细介绍
2012/11/09 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
JavaScript事件委托的技术原理探讨示例
2014/04/17 Javascript
告诉你什么是javascript的回调函数
2014/09/04 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
2016/08/08 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
2017/08/19 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
Python下singleton模式的实现方法
2014/07/16 Python
Python实现统计代码行的方法分析
2017/07/12 Python
python aiohttp的使用详解
2019/06/20 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
露营世界:Camping World
2017/02/02 全球购物
校园活动策划书范文
2014/01/10 职场文书
幼儿园个人师德总结
2015/02/06 职场文书
抢劫罪辩护词
2015/05/21 职场文书
python基础详解之if循环语句
2021/04/24 Python
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js
Java 定时任务技术趋势简介
2022/05/04 Java/Android
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers