那些關於Vue 的小細節- Computed 中getter 和setter 觸發的 ...
文章推薦指數: 80 %
另外,在getter 中,要記得搭配使用return 來把值返回出來。 {{fullName}} firstName:{{firstName}},lastName:{{lastName}} firstName:{{firstName}}
基本的寫法如下:. 預設只有getter 的computed. new Vue({ ...
//Skiptocontent
2017年5月9日
文章撰寫時使用[email protected]
在Vue中computed是經常會使用到的屬性,因為在Vue中透過computed會cache住沒有改變的資料,因此正確且適當的使用computed將可以減少資料重新運算的次數,讓網頁的效能提升。
但是在使用的過程中,有時候會發現computed怎麼樣就是不被觸發,這當中有些細節是我們可以進一步瞭解的。
computed的基本觀念
在Vue中,computed的屬性可以被視為像是data一樣,可以讀取和設值,因此在computed中可以分成getter(讀取)和setter(設值),在沒有寫setter的情況下,computed預設只有getter,也就是只能讀取,不能改變設值。
雖然說computed內的屬性可以被視為像是data一樣,但在使用上,一般還是會讓computed類似唯讀的狀態,也就是去處理`data`資料,然後把它吐出來使用。
另外,在getter中,要記得搭配使用return來把值返回出來。
基本的寫法如下:
預設只有getter的computed
newVue({
computed:{
computedData:function(){
return//...
}
}
})
有setter和getter的computed
newVue({
computed:{
computedData:{
get:function(){
return//...
},
set:function(){
//...
}
}
}
})
程式範例連結
下面的部分包含許多程式說明,你可以開啟這份Codepen,然後開啟console視窗搭配閱讀。
[Vue]關於VueComputed的那些小細節(LearnComputedinDeep)@CodePen
一般情況下getter觸發的時間點
在一般的情況下,我們可以這樣使用computed(只有getter)來更新資料,你可以直接打開Codepen的第一部分,或者程式碼如下:
聽起來非常合理,但是我們用console.log()看一下,分別看computedgetter和updated的時間點,你會發現,當我們在input輸入資料,會觸發computed,同時也會觸發這個vm的updated。
getter的例外情況:資料變更但getter不會被觸發
剛剛我們提到當getter裡面被觀察的資料有變更時,就會觸發computed,但這個說其實並不完全正確,有些時候畫面更新了,資料變更了,但其實不會觸發computed裡面的getter。
如果我們把template中的fullName拿掉,換成firstName和lastName時(程式碼如下):
我們可以在console中看到,firstName和lastName資料變更的情況下,只會一直得到updated而已,computed中的getter並不會被觸發。
一般情況下setter觸發的時間點
接著,讓我們來看一下在一般的情況下,computed的setter什麼時候會被觸發:
lastName:{{lastName}}
簡單來說,當computed的屬性要被設值時,就會觸發setter,從console中我們也可以看到,當我在input中輸入內容時,fullName會改變,fullName改變的情況會觸發setter,接著,因為我的setter中所做的事會變更到getter中所觀察的資料,這時候才又觸發getter執行,最後重新updated畫面。
也就是從setter->getter->updated這樣的過程,如下圖所示:
觸發setter不必然會觸發getter
在上面的例子中,我們會先觸發setter,接著觸發getter,最後updated畫面。
但是其實getter會被觸發是因為我們在setter中變更到了被getter所觀察的資料。
也就是說,如果我們的setter在執行時,並不會觸發getter所觀察的資料的話,那麼getter就不會被觸發。
例如,當我把上面程式碼的setter中對於資料的變更註解掉時:
set(value){
console.log('computedsetter')
//this.firstName=value.split('')[0]
//this.lastName=value.split('')[1]
}
那麼即時我們在input中輸入內容,都只會觸發setter而不會觸發getter。
換句話說,setter和getter是獨立觸發的,兩個被觸發的時間點是不同的。
總結
在這篇文章中,我們進一步瞭解了Vuecomputed中的getter和setter,有幾個重點可以整理一下
getter和setter彼次觸發的時間點是獨立的。
getter在大部分的時候是當內部觀察的資料有改變時會被觸發;setter則是當被觀察的物件本身有改變時會被觸發。
getter在畫面中沒有使用到被觀察的物件時,不會被觸發。
這篇的內容主要是根據自身的經驗和理解,如果有任何錯誤,都歡迎不吝告知,以避免錯誤的知識傳遞,謝謝!
5/10更新,感謝網友@AyshSu(聖涵/亞所) 修正觀念錯誤
Share:
較新的文章
較舊的文章
首頁
0
意見:
張貼留言
延伸文章資訊
- 1Getter | Vuex
Vuex 允许我们在store 中定义“getter”(可以认为是store 的计算属性)。 注意. 从Vue 3.0 开始,getter 的结果不再像计算属性一样会被缓存起来。这是一个 ...
- 2How to set up Pinia getter in Vue 3 Composition API - Stack ...
- 3vuex 進階教學:Module、Getter
接續上回〈vuex 教學:vue 的狀態管理工具〉教學後,這次要延伸筆記Module、Getter 的使用,也包含較進階的用法,如果已經學完上一版的教學, ...
- 4[Vue.js] Vuex 學習筆記(5) - getters 的核心概念- iT 邦幫忙
Getter 為什麼需要使用getters ? 在某些時候我們需要computed store` 中的state ,例如在to do list 內取得完成的數量。 computed: { do...
- 5Vue.js - 如何带参数的vuexjs getter? - 无涯教程网
有没有办法将参数传递到 vuex store 的getter中? new Vuex.Store({ getters: { someMethod(arg){ // return data from...