1. 程式人生 > >vue.js計算屬性computed

vue.js計算屬性computed

Vue 中,computed 的屬性可以被視為是 data 一樣,可以讀取和設值,因此在 computed 中可以分成 getter(讀取) 和 setter(設值),一般情況下是沒有 setter 的,computed 預設只有 getter ,也就是隻能讀取,不能改變設值。

vue.js計算屬性預設只有 getter,因為是預設值所以我們也常常省略不寫,如下程式碼:

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

其實computed裡的程式碼完整的寫法應該是:

 computed: {
    fullName: {
      get(){
         return this.firstName + ' ' + this.lastName
      }
    }
  }

計算屬性getter的觸發時間

<template>
 	<div id="demo">
  		<p> {{ fullName }} </p> 
  		<input type="text" v-model="firstName"> 
  		<input type="text" v-model="lastName">
   </div>
</template>

 var vm = new Vue({
       el: '#demo',
       data: { firstName: 'zhang', lastName: 'san' }, 
       computed: { 
       		fullName: function () { 
       			console.log('computed getter...') 
       			return this.firstName + ' ' + this.lastName 
       			}	 
       	}, 
       updated () { 
		        console.log('updated')
        }
})

如果我們改變上邊程式碼裡的2個輸入框的值firstName或者lastName,都會觸發computed以及updated (),也就是說會執行: console.log(‘computed getter…’)和console.log(‘updated’) (用來驗證是不是執行了,沒有其他意思)

需要注意的是,不是說我們更改了getter裡使用的變數,就會觸發computed的更新,前提是computed裡的值必須要在模板裡使用才行。怎麼理解呢?

如下程式碼,我們把template裡的fullName 註釋掉:

<template>
 	<div id="demo">
  		<!-- <p> {{ fullName }} </p> -->
  		<input type="text" v-model="firstName"> 
  		<input type="text" v-model="lastName">
   </div>
</template>

 var vm = new Vue({
       el: '#demo',
       data: { firstName: 'zhang', lastName: 'san' }, 
       computed: { 
       		fullName: function () { 
       			console.log('computed getter...') 
       			return this.firstName + ' ' + this.lastName 
       			}	 
       	}, 
       updated () { 
		        console.log('updated')
        }
})


就算我們更改了firstName以及lastName都不會觸發computed 中的 getter 中的console.log(‘computed getter…’),而只會觸發console.log(‘updated’)

計算屬性settter

 <template>
  	<div id="demo">
   		<p> {{ fullName }} </p> 
   		<input type="text" v-model="fullName"> 
  	 	<input type="text" v-model="firstName">
    	<input type="text" v-model="lastName">
    </div> 
 </template>


      var vm = new Vue({ 
      		el: '#demo', 
      		data: { firstName: 'zhang', lastName: 'san' },
       		computed: {
        		fullName: { 
        			//getter 方法 
        			get(){
        			 console.log('computed getter...')
         			 return this.firstName + ' ' + this.lastName
          			}, 
          			//setter 方法 
          			set(newValue){ 
          				console.log('computed setter...')
           				var names = newValue.split(' ') 
          			 	this.firstName = names[0]
            			this.lastName = names[names.length - 1]
             			return this.firstName + ' ' + this.lastName
              			} 
              }
         }
         , updated () {
                	console.log('updated')
          }
 })

在template 中,我們可以看到,input 是直接綁 v-model=“fullName”,如果我們這裡直接修改了fullName的值,那麼就會觸發setter,同時也會觸發getter以及updated函式。其執行順序是setter -> getter -> updated,如下:

console.log('computed setter...')
console.log('computed getter...')
console.log('updated')

這裡需要注意的是,並不是觸發了setter也就會觸發getter,他們兩個是相互獨立的。我們這裡修改了fullName會觸發getter是因為setter函式裡有改變firstName 和 lastName 值的程式碼。也就是說我們如果註釋掉上邊的setter中修改firstName 和lastName的程式碼後就不會執行getter,如下:

set(newValue){
 console.log('computed setter...')
  // var names = newValue.split(' ') 
  // this.firstName = names[0] 
  // this.lastName = names[names.length - 1] 
  return this.firstName + ' ' + this.lastName 
  }

會執行,且順序如下

console.log('computed setter...')
console.log('updated')