计算属性是一个很邪门的东西,只要在它的函数里引用了 data 中的某个属性,当这个属性发生变化时,函数仿佛可以嗅探到这个变化,并自动重新执行。

  上述代码会源源不断的打印出 b 的值。如果希望 a 依赖 data 中的 x 而变化,只需保证 a 函数中有 this.x 即可。如果函数中没有出现 data 中的属性,那么无论 data 中的属性怎么变,a 对应的函数一次也不会执行。

Vue 怎么知道计算属性在函数中引用了哪个 data 属性?这个函数又是怎么知道 data 属性变了,而且只关心它内部引用的那个属性,别的都不管?

  官方文档对计算属性的描述是:

  模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。所以,对于任何复杂逻辑,你都应当使用计算属性。

  你可以像绑定普通属性一样在模板中绑定计算属性。Vue 知道 vm.reversedMessage 依赖于 vm.message,因此当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新。而且最妙的是我们已经以声明的方式创建了这种依赖关系:计算属性的 getter 函数是没有副作用 (side effect) 的,这使它更易于测试和理解。

1、computed VS methods

  你可能已经注意到我们可以通过在表达式中调用方法来达到同样的效果,我们可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的依赖进行缓存的。计算属性只有在它的相关依赖发生改变时才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。(缓存的效果)这也同样意味着下面的计算属性将不再更新,因为 Date.now() 不是响应式依赖:

computed: {now: function () {return Date.now()}
}

  相比之下,每当触发重新渲染时,调用方法将总会再次执行函数。

  我们为什么需要缓存?假设我们有一个性能开销比较大的的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A 。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用方法来替代。

2、计算属性缓存

  在 0.12.8 之前,计算属性仅仅体现为一个取值的行为 —— 每次你访问它的时候,getter 都会重新求值。在 0.12.8 中对此做了改进 —— 计算属性的值会被缓存,只有在其某个反应依赖改变才会重新计算。设想我们有一个开销很大的计算属性 A,它需要循环一个大数组并且完成很多运算。并且我们还有一个依赖 A 的计算属性。如果没有缓存,我们对 A 的 getter 不必要的过度调用就会导致潜在的性能问题。而有了缓存,A 的值会被缓存起来,除非其依赖发生了变化,这样访问它再多次也不会导致大量的不必要运算了。

  然而,我们还是应该理解什么会被视为“反应式依赖”:

var vm = new Vue({data: {msg: 'hi'},computed: {example: {return Date.now() + this.msg}}
})

  在上面的例子中,计算属性依赖 vm.msg。因为这是一个在 Vue 实例中被观察的数据属性,那么它就被视为了一个反应式依赖。无论何时 vm.msg 改变,vm.example 的值都会被重新计算。然而,Date.now()并不是反应式依赖,因为它没有和 Vue 的数据观察系统发生任何关系。因此,当你在程序中访问vm.example时,你会发现除非vm.msg触发了一次重新计算,否则时间戳始终是相同的值

  有的时候你需要保留简单获取数据的模式,每次你访问 vm.example 的时候都希望触发重新计算。从 0.12.11 开始,你可以为一个特殊的计算属性开关缓存支持:

computed: {example: {cache: false,get: function () {return Date.now() + this.msg}}
}

  现在,每次你访问 vm.example 的时候,时间戳都会及时更新。然而,要注意这只发生在 JavaScript 程序内部访问的时候,数据绑定还是依赖驱动的。当你在模板中绑定一个 {{example}} 的计算属性时,这点需要注意:DOM 只会在反应式依赖改变时才会更新

3、computed VS watch

  Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch——特别是如果你之前使用过 AngularJS。然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。细想一下这个例子:

<div id="demo">{{ fullName }}</div>var vm = new Vue({el: '#demo',data: {firstName: 'Foo',lastName: 'Bar',fullName: 'Foo Bar'},watch: {firstName: function (val) {this.fullName = val + ' ' + this.lastName},lastName: function (val) {this.fullName = this.firstName + ' ' + val}}
})

  上面代码是命令式且重复的。将它与计算属性的版本进行比较,会发现计算属性好多了。

var vm = new Vue({el: '#demo',data: {firstName: 'Foo',lastName: 'Bar'},computed: {fullName: function () {return this.firstName + ' ' + this.lastName}}
})

  虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,watch这个方式是最有用的。

4、计算属性默认只有 getter ,不过在需要时你也可以提供一个 setter :

computed: {fullName: {// getterget: function () {return this.firstName + ' ' + this.lastName},// setterset: function (newValue) {var names = newValue.split(' ')this.firstName = names[0]this.lastName = names[names.length - 1]}}
}

  现在再运行 vm.fullName = 'John Doe' 时,setter 会被调用,vm.firstNamevm.lastName 也会相应地被更新。

5、计算属性禁用箭头函数

  注意,不应该使用箭头函数来定义计算属性函数 (例如 aDouble: () => this.a * 2)。理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.a 将是 undefined

  当然有很多this需要指向vue实例的时候,都需要慎用箭头函数

转载于:https://www.cnblogs.com/goloving/p/8964602.html

理解Vue的计算属性相关推荐

  1. 深入理解 Vue Computed 计算属性

    Computed 计算属性是 Vue 中常用的一个功能,我们今天来说一下他的执行过长 拿官网简单的例子来看一下: <div id="example"><p> ...

  2. 17.Vue的计算属性

    目录 1.姓名案例插值语法实现 2.姓名案例methods实现 3.姓名案例计算属性实现 4.get什么时候会被调用? 5.set什么时候会被调用? 6.计算属性简写 7.总结 我们这一节将通过一个小 ...

  3. Vue的计算属性、侦听属性与过滤器解析

    文章目录 知识点 计算属性 计算属性的基本使用 计算属性的 setter 和 getter 侦听属性 计算属性与侦听属性对比 过滤器 过滤器使用方法 过滤器应用场景 综合小练习 知识点 计算属性 计算 ...

  4. 【Vue】—计算属性缓存VS方法以及侦听器的区别

    [Vue]-计算属性缓存VS方法以及侦听器的区别

  5. 【Vue】—计算属性

    [Vue]-计算属性

  6. Vue的计算属性computed和监听属性watch

    Vue的计算属性computed 定义 通过已有属性计算生成一个新的组合属性. 原理 底层借助了Object.defineproperty方法提供的getter和setter来实现. 性质 计算属性的 ...

  7. vue 的计算属性报错Computed property “disa“ was assigned to but it has no setter.

    原因: vue的计算属性不能设置,只能读取 解决:

  8. vue computed计算属性

    文章目录 前言 一.计算属性介绍 二.使用步骤 1.template中绑定计算属性 2.script中定义计算属性 3.计算属性的配置项 4.计算属性的简写 总结 前言 Vue中的计算属性(comup ...

  9. vue的计算属性computed

    计算属性的应用场景 从已有的数据A中计算等到的新的数据B,使用计算属性 如果一个结果需要依赖data中的数据,但是需要经过一些逻辑处理,才能得到你想要的数据.此时就可以使用计算属性. 定义格式 计算属 ...

最新文章

  1. 2021年大数据Flink(二十九):Flink 容错机制 Savepoint
  2. MutipartFile使用过程中遇到的坑
  3. Jenkins 设置镜像_我常用的SpringBoot+Jenkins自动化部署技巧,贼好用,推荐给大家...
  4. 【 .NET Core 3.0 】框架之九 || 依赖注入 与 IoC
  5. Java 比较两个版本号的大小 (通用)
  6. [vue] 你了解什么是高阶组件吗?可否举个例子说明下?
  7. 干货-iOS、mac开源项目及库,以后我也会持续更新。
  8. 彻底删除 mysql 5.7_Ubuntu16.04彻底删除MySQL5.7
  9. Laravel测试驱动开发--反向单元测试
  10. 按顺序插入图片_MysqlInnodb特性之插入缓存
  11. SQLite的使用一
  12. matlab仿真三相整流电路设计,基于MATLAB的三相整流电路仿真研究毕业设计
  13. 应用程序开发选择工具应注重运行效率还是易用性
  14. 日语动词+动词类型+动词活用
  15. IT人员升职必会的软技能
  16. Odoo-----在Form视图中添加Chatter
  17. 鞋子微商怎么做qq引流?微商如何通过QQ空间引流
  18. (一)Android基础界面设计
  19. 二维坐标系,求解一个点旋转到另外一个点的映射矩阵
  20. 写今目标自动签退的记录

热门文章

  1. Java 项目中一种简单的动态修改配置即时生效的方式 WatchService
  2. perl中替换文本一例
  3. 精通 R plot—第1部分:颜色,图例和线
  4. shell脚本工具之awk命令
  5. Winform模态窗体关闭时赋值给打开自身的窗体(C# 事件委托版)
  6. SQL2005学记笔记(4)
  7. 【Vegas原创】重建Exchange 2007 OWA的虚拟目录
  8. 北京欢迎你 (歌词)
  9. ubuntu安装mysql没反应_Ubuntu安装mysql三种安装方式
  10. Vmware Linux 固定IP配置(CenOS7)