计算属性关键词: computed
。计算属性在处理一些复杂逻辑时是很有用的。
一、基本使用
下面案例,在computed
中定义了一个计算属性,名为:fullName
,其所依赖的属性为:firstName
和 lastName
。
并且定义了getter
,如果getter
被调用,会打印出:get被调用了!
<div id="root">
<div class="row">姓:<input type="text" v-model="firstName">div>
<div class="row">名:<input type="text" v-model="lastName">div>
div>
<script>
const vm = new Vue({
el:'#root',
data:{
firstName: '小',
lastName: '三'
},
computed:{
fullName:{
get() {
console.log('get被调用了!');
// console.log(this);
return this.firstName+'-'+this.lastName
}
}
}
});
script>
打开控制台,输入vm
回车,会发现计算属性fullName
已经在vm
实例上了。并且会发现此时该属性的值,看不到,有三个点...
,点击才能看到,也就是getter
被调用了。
打开控制台,我们可以很方便的看到data
和computed
的属性
下面案例中,get
只会被调用一次,其余的会从缓存中读取。控制台只会打印出一次get被调用了!
<div id="root">
<div class="row">姓:<input type="text" v-model="firstName">div>
<div class="row">名:<input type="text" v-model="lastName">div>
<div class="row">全名:<span>{{fullName}}span>div>
<div class="row">全名:<span>{{fullName}}span>div>
<div class="row">全名:<span>{{fullName}}span>div>
<div class="row">全名:<span>{{fullName}}span>div>
div>
<script>
const vm = new Vue({
el:'#root',
data:{
firstName: '小',
lastName: '三'
},
computed:{
fullName:{
get() {
console.log('get被调用了!');
// console.log(this);
return this.firstName+'-'+this.lastName
}
}
}
});
script>
setter
的定义控制台
修改计算属性fullName
此时会看到setter
被调用了,并修改了所依赖的属性firstName
和lastName
。对于Vue
来讲,data
中的任何一个数据发生变化的时候,Vue
的模板都会重新解析一遍。因此,由于这两个属性发生了变化,其对应getter
就会被调用。<div id="root">
<div class="row">姓:<input type="text" v-model="firstName">div>
<div class="row">名:<input type="text" v-model="lastName">div>
<div class="row">全名:<span>{{fullName}}span>div>
<div class="row">全名:<span>{{fullName}}span>div>
<div class="row">全名:<span>{{fullName}}span>div>
<div class="row">全名:<span>{{fullName}}span>div>
div>
<script>
const vm = new Vue({
el:'#root',
data:{
firstName: '小',
lastName: '三'
},
computed:{
fullName:{
get() {
console.log('get被调用了!');
// console.log(this);
return this.firstName+'-'+this.lastName
},
set(value) {
console.log('set',value);
const arr = value.split("-");
this.firstName = arr[0];
this.lastName = arr[1];
}
}
}
});
script>
我们在控制台中,输入vm.fullName='李-四'
回车,就会看到如下效果。
计算属性
一般不做修改。如果只读不改,计算属性
就可以写成简写
的形式。这时不再是一个对象了,而是用函数代替且就为get
函数。
<div id="root">
<div class="row">姓:<input type="text" v-model="firstName">div>
<div class="row">名:<input type="text" v-model="lastName">div>
<div class="row">全名:<span>{{fullName}}span>div>
div>
<script>
const vm = new Vue({
el:'#root',
data:{
firstName: '小',
lastName: '三'
},
computed:{
fullName() {
console.log('get被调用了!');
return this.firstName+'-'+this.lastName
}
}
});
script>
二、案例的其他实现
在methods
中定义了fullName
函数来实现
<div id="root">
<div class="row">姓:<input type="text" v-model="firstName">div>
<div class="row">名:<input type="text" v-model="lastName">div>
<div class="row">全名:<span>{{fullName()}}span>div>
div>
<script>
const vm = new Vue({
el:'#root',
data() {
// data中的任何一个数据发生变化的时候,Vue的模板都会重新解析一遍
return {
firstName: '小',
lastName: '三'
};
},
methods:{
fullName(){
// this就是vm实例
// console.log(this);
console.log("fullName函数被调用了!");
return this.firstName+"-"+this.lastName;
}
}
});
script>
通过直接在Vue
模板里拼接来实现
<div id="root">
<div class="row">姓:<input type="text" v-model="firstName">div>
<div class="row">名:<input type="text" v-model="lastName">div>
<div class="row">全名:<span>{{firstName}}-{{lastName}}span>div>
div>
<script>
const vm = new Vue({
el:'#root',
data() {
return {
firstName: '小',
lastName: '三'
};
},
});
script>
三、体会计算属性的好处
如下代码是反转字符串的例子,这个时候,模板变的很复杂,不容易看懂和理解。
<div id="app">
{{ message.split('').reverse().join('') }}
div>
对于上述问题,我们使用计算属性
来解决。
<div id="app">
<p>原始字符串: {{ message }}p>
<p>计算后反转字符串: {{ reversedMessage }}p>
div>
<script>
var vm = new Vue({
el: '#app',
data: {
message: 'Runoob!'
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split('').reverse().join('')
}
}
})
script>
我们可以使用 methods
来替代 computed
,效果上两个都是一样的,但是 computed
是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods
,在重新渲染的时候,函数总会重新调用执行。
可以说使用 computed
性能会更好,但是如果你不希望缓存,你可以使用 methods
属性。
methods: {
reversedMessage2: function () {
return this.message.split('').reverse().join('')
}
}
四、计算属性汇总
计算属性
,就是要用的属性不存在,要通过已有的属性加工、计算生成一个全新的属性。对于Vue
来说,data
中配置的就是属性。计算属性
与data
中定义的属性分开。Object.defineProperty()
方法提供的getter
和setter
。get
函数的作用计算属性
时,get
就会被调用,且返回值就作为计算属性
的值。即计算属性
是实时计算的属性。Vue
做了缓存,当所依赖的数据没有发生变化,读取的时候会从缓存中取值。不会调用get
Vue
已经将get中this
维护好了,就是vm
实例get
函数什么时候执行?set
函数什么时候调用?计算属性
被修改时被调用methods
实现相比,内部有缓存机制,效率更高,调试方便。计算属性
最终会出现在vm
上,直接读取使用即可。计算属性
要被修改,那必须写set
函数去响应修改,且set
中要引起计算时依赖的数据发生改变。计算属性
一般不做修改。这个时候,只读不改可以有简写
的形式,不再是一个对象了,而是用函数代替且就为get
函数。