使用vue框架已经一年多的时间了,虽然踩了很多的坑,可是 有些错误是常常性的。正好利用如今的空余时间,对本身所学的,所用的东西进行整理,总结。避免下次在采坑,也但愿本身的总结,可以带给别人一些启发。html
当其依赖的属性的值发生变化时,计算属性会从新计算,反之,则使用缓存中的属性值。vue
首先,经过vue官方文档的案例,来解释一下,为何要使用computed。咱们都知道,在模板内的表达式很是遍历的,可是,有时候,咱们会在模板内的放入太多逻辑的东西。会让模板变重,且难于维护。缓存
<div id="example"> {{ message.split('').reverse().join('') }} </div>
在这模板中的代码中,其实,咱们须要花费上一小段时间去理解,这块渲染的是什么---message的翻转字符串。然而,当初模板中使用表达式的初衷时为了简单运算的。因此,从这点出发,咱们是否是就不建议在模板中使用过于复杂的表达式了。此时,计算属性就横空出世了。计算属性就是当依赖的属性的值发生变化的时候,才会触发他的更改,若是依赖的值,不发生变化的时候,使用的是缓存中的属性值。框架
<div id="example"> <p>Original message: "{{ message }}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p> </div> var vm = new Vue({ el: '#example', data: { message: 'Hello' }, computed: { // 计算属性的 getter reversedMessage: function () { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } } })
在vue中,computed的属性能够被视为是data同样,能够读取和设值。所以,在computed中能够分为getter(读取)和setter(设值),通常状况下,是没有setter的,computed只是预设了getter,也就是只能读取,不能够改变设值。因此,computed默认格式(是不代表getter函数的):
html:函数
<div> message: {{message}} </div> <!-- 计算属性 --> <div> 计算属性: {{updateMessage}} </div>
computed: { updateMessage(): { console.log('计算属性', this.message) return this.message } }
等价于post
computed: { updateMessage: { get: function() { console.log('计算属性', this.message) return this.message } } },
发现了一个小小的惊喜:当模板中不使用updateMessage,即便message发生改变以后,也不会走computed。神奇不神奇??哈哈哈测试
在这里,就须要咱们注意一下,不是说咱们更改了getter中使用的变量(即依赖的属性),就会触发computed的更新,他有一个前提是computed里的值必需要在模板中使用才能够。可是会触发生命周期的updated()this
当赋值给计算属性的时候,将调用setter函数。多用于在模板组件中须要修改计算属性自身的值的时候。code
computed: { updateMessage: { get: function() { console.log('计算属性', this.message) return this.message }, set: function(newVal) { this.message = newVal console.log('newVal', newVal) } } }, mounted () { this.updateMessage = '222' console.log('测试:', this) },
只有当计算属性中的属性被直接赋值的时候,才会走setter函数,并且,setter函数和getter函数是相互独立的,不是说,走setter函数,就必须走getter函数。上面的案例,打印结果是htm
newVal: 222, 计算属性: 222
是由于,在setter中触发了message的更改,当message发生改变的时候,getter函数中就会改变。
computed: { updateMessage: { get: function() { console.log('计算属性', this.message) return this.message }, set: function(newVal) { console.log('newVal', newVal) } } }, mounted () { console.log('测试:', this) },
这种状况下,打印结果是:
newVal 222
此时,就只是单单的走了setter的函数,而没有走getter函数。
这篇文章呢,主要是介绍一下关于computed的基本构成和使用,也算是,本身对computed的一个简单的总结把。不会让本身在作项目的过程当中,碰见关于相似的问题,而没法解决。不知道如何使用。而后呢,等撸vue的源码的时候,在深刻的写一篇关于computed的原理的文章。由于有些神奇的现象是必需要经过原理来解释的。
https://juejin.im/post/5a6f21...
https://knownsec-fed.com/2018...
https://www.jianshu.com/p/56f...
很感谢你们利用这么长时间来读这篇文章,文章中如有错误请在下方留言,会尽快作出修改。