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