Vue.js 计算属性
vue.js推出了computed属性,用于计算复杂业务逻辑,把复杂逻辑抽取,实现维护方便;
比如看如下,复杂的运算放html里,很不好
<div id="example">
{{ message.split('').reverse().join('') }}
</div>
我们用计算属性的话:
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})
<div id="example">
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
这样看起来非常爽;
计算属性缓存 vs 方法
在某些时候,看起来计算属性和方法的话 效果一样,但是本质上,计算属性多了一个缓存;
我们来看下
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <div> {{ message.split('').reverse().join('') }} </div> <h2>计算属性</h2> <div> <p>Original message: "{{ message }}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p> <button @click="change()">改变</button> </div> <h2>计算属性缓存 vs 方法</h2> <p>Computed reversed message: "{{ reversedMessage }}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p> <p>Reversed message: "{{ reversedMessage2() }}"</p> <p>Reversed message: "{{ reversedMessage2() }}"</p> </div> <script type="text/javascript" src="js/vue2.6.js"></script> <script type="text/javascript"> let count=1; let vm=new Vue({ el:'#app', data:{ message: 'Hello' }, computed:{ // 计算属性的 getter reversedMessage(){ count++; // `this` 指向 vm 实例 return count+''+this.message.split('').reverse().join('') } }, methods:{ change(){ this.message="fdafdafsda"; }, reversedMessage2() { count++; return count+''+this.message.split('').reverse().join('') } } }) </script> </body> </html>
我们发现计算属性的计数没有变化,因为有缓存;
最后一个,就是计算属性还有一个setter方法,默认的是getter;
我们可以通过setter来重新进行设置和计算,偶尔用到;
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="app"> <div> {{ message.split('').reverse().join('') }} </div> <h2>计算属性</h2> <div> <p>Original message: "{{ message }}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p> <button @click="change()">改变</button> </div> <h2>计算属性缓存 vs 方法</h2> <p>Computed reversed message: "{{ reversedMessage }}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p> <p>Reversed message: "{{ reversedMessage2() }}"</p> <p>Reversed message: "{{ reversedMessage2() }}"</p> <h2>计算属性set</h2> <p>Computed reversed message: "{{ reversedInfo }}"</p> <button @click="change2()">重新计算处理</button> </div> <script type="text/javascript" src="js/vue2.6.js"></script> <script type="text/javascript"> let count=1; let vm=new Vue({ el:'#app', data:{ message: 'Hello', info:'Hello' }, computed:{ // 计算属性的 getter reversedMessage(){ count++; // `this` 指向 vm 实例 return count+''+this.message.split('').reverse().join('') }, reversedInfo:{ get(){ return this.message.split('').reverse().join(''); }, set(newValue){ console.log(newValue); console.log('重新做一些计算处理'); } } }, methods:{ change(){ this.message="fdafdafsda"; }, change2(){ vm.reversedInfo='fdafdfdafdas222'; }, reversedMessage2() { count++; return count+''+this.message.split('').reverse().join('') } } }) </script> </body> </html>
上一篇:es6模版字符串
下一篇:es6箭头函数以及this