淺析Vue如何巧用computed計(jì)算屬性
在日常使用Vue
開發(fā)項(xiàng)目的時(shí)候,計(jì)算屬性computed
是一個(gè)非常常用的特性,它的主要作用是對數(shù)據(jù)進(jìn)行處理,然后返回新的數(shù)據(jù),這樣就不需要在模板中寫過多的邏輯代碼,從而使得模板更加簡潔,可讀性更強(qiáng)。
今天我就來分享一些我在使用Vue
的computed
計(jì)算屬性時(shí)的一些小技巧,希望能夠幫助到大家。
1. 計(jì)算屬性的基本用法
計(jì)算屬性的用法很簡單,一同分為四個(gè)部分:getter
、setter
、onTrack
、onTrigger
。
get
:計(jì)算屬性的getter
函數(shù),當(dāng)計(jì)算屬性的依賴發(fā)生改變時(shí),會執(zhí)行該函數(shù),返回計(jì)算屬性的值。set
:計(jì)算屬性的setter
函數(shù),當(dāng)直接修改計(jì)算屬性的值時(shí),會執(zhí)行該函數(shù)。onTrack
:計(jì)算屬性的依賴被追蹤時(shí),會執(zhí)行該函數(shù)。onTrigger
:當(dāng)計(jì)算屬性的依賴項(xiàng)發(fā)生改變時(shí),會執(zhí)行該函數(shù)。
代碼如下:
import { computed } from 'vue' const count = ref(0) const plusOne = computed({ get() { return count.value + 1 }, set(val) { count.value = val - 1 }, onTrack(e) { debugger; }, onTrigger(e) { debugger; } }); console.log(plusOne.value) // 1 console.log(count.value) // 0 plusOne.value = 1 console.log(plusOne.value) // 2 console.log(count.value) // 1
這里我們最常用的就是get
,可以簡寫如下:
const plusOne = computed(() => count.value + 1)
onTrack
和onTrigger
一般用于調(diào)試,當(dāng)我們想要知道計(jì)算屬性的依賴項(xiàng)發(fā)生了什么變化時(shí),可以在這兩個(gè)函數(shù)中打斷點(diǎn)調(diào)試。
具體可參考官網(wǎng):
在官網(wǎng)上給出了一些計(jì)算屬性的使用場景,以及一些計(jì)算屬性的注意事項(xiàng),這里如果卷一些的話,可以看一下,下面我就來分享一些我在使用計(jì)算屬性時(shí)的一些小技巧。
2. 計(jì)算屬性的小技巧
2.1. 監(jiān)聽多個(gè)數(shù)據(jù)的變化
// 多個(gè)數(shù)據(jù)想要同時(shí)監(jiān)聽 const a = ref(1) const b = ref(2) const c = ref(3) // 將其合并為一個(gè)計(jì)算屬性 const multiply = computed(() => { return { a: a.value, b: b.value, c: c.value, } }) // 監(jiān)聽計(jì)算屬性的變化 watch( () => multiply.value, (val) => { console.log(val) } ) // 修改數(shù)據(jù) a.value = 2 // { a: 2, b: 2, c: 3 } b.value = 3 // { a: 2, b: 3, c: 3 } c.value = 4 // { a: 2, b: 3, c: 4 }
2.2. 監(jiān)聽對象的部分屬性
const obj1 = ref({ a: 1, b: 2, c: 3, }) const obj2 = ref({ a: 1, b: 2, c: 3, }) // 監(jiān)聽對象的部分屬性 const combine = computed(() => { return { a: obj1.value.a, b: obj2.value.b, } }) // 監(jiān)聽計(jì)算屬性的變化 watch( () => combine.value, (val) => { console.log(val) } ) // 修改數(shù)據(jù) obj1.value.a = 2 // { a: 2, b: 2 } obj1.value.b = 3 // 無輸出 obj1.value.c = 4 // 無輸出 obj2.value.a = 2 // 無輸出 obj2.value.b = 3 // { a: 2, b: 3 } obj2.value.c = 4 // 無輸出
可以多個(gè)對象結(jié)合監(jiān)聽部分字段的變化,這樣就不需要手動判斷具體修改的是哪個(gè)對象的哪個(gè)字段了。
2.3. 監(jiān)聽數(shù)組的部分元素
const arr1 = ref([1, 2, 3]) const arr2 = ref([1, 2, 3]) // 監(jiān)聽數(shù)組的部分元素 const combine = computed(() => { return [ arr1.value[0], arr2.value[1], ] }) // 監(jiān)聽計(jì)算屬性的變化 watch( () => combine.value, (val) => { console.log(val) } ) // 修改數(shù)據(jù) arr1.value[0] = 2 // [2, 2] arr1.value[1] = 3 // 無輸出 arr1.value[2] = 4 // 無輸出 arr2.value[0] = 2 // 無輸出 arr2.value[1] = 3 // [2, 3] arr2.value[2] = 4 // 無輸出
對數(shù)組也可以像對象一樣監(jiān)聽部分元素的變化。
2.4. 緩存與更新
// 這是一個(gè)大對象,我不需要它是響應(yīng)式的,但是我需要它能響應(yīng)式的更新 const list = new Array(100).fill(0).map((item, index) => ({key: index, value: item})) // 強(qiáng)制刷新 const forceFlush = ref(0); const cache = computed(() => { forceFlush.value; // 這里使用一下,什么都不干就行 // 這里會對大對象進(jìn)行一系列的計(jì)算,然后給結(jié)果緩存下來方便使用 const cache = list.reduce((prev, curr) => { prev[curr.key] = curr; return prev }, {}) // 這里就方便直接通過 key 獲取 return (key) => { return cache[key] || {} } }) console.log(cache.value(0).value); // 0 // 這里是不會更新的 list[0] = {key: 0, value: 1}; console.log(cache.value(0).value); // 0 // 給一個(gè)刷新信號就可以了 forceFlush.value++; console.log(cache.value(0).value); // 1
2.5. 雙向綁定
const props = defineProps({ modelValue: { type: String, default: "" } }); const emit = defineEmits(["update:modelValue"]); const value = computed({ get() { return props.modelValue; }, set(val) { emit("update:modelValue", val); } }); value.value = 'hello';
雙向綁定需要配合defineEmits(["update:modelValue"])
來使用,每次調(diào)用emit("update:modelValue", val)
很麻煩;
現(xiàn)在使用computed
就可以實(shí)現(xiàn)value.value = value
這種方式直接修改,很符合直觀也滿足了單向數(shù)據(jù)流的原則;
總結(jié)
在日常使用Vue
中,合理的使用Vue
的各種特性不僅能使開發(fā)效率加倍,同時(shí)也能使代碼看起來更加整潔。
注意可以使用各種特性,但是不要炫技,夠用好用就行,不要寫出那種無人能撼動你的地位的代碼,手動狗頭。
以上就是淺析Vue如何巧用computed計(jì)算屬性的詳細(xì)內(nèi)容,更多關(guān)于Vue computed的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue刷新子組件、重置組件以及重新加載子組件項(xiàng)目實(shí)戰(zhàn)記錄
在vue開發(fā)中出于各種目的,我們常常需要讓組件重新加載渲染,這篇文章主要給大家介紹了關(guān)于vue刷新子組件、重置組件以及重新加載子組件的相關(guān)資料,需要的朋友可以參考下2023-12-12在Vue3中使用BabylonJs開發(fā)?3D的初體驗(yàn)
這篇文章主要介紹了在?Vue3?中使用?BabylonJs?開發(fā)?3D?是什么體驗(yàn),在本文中,向您展示了如何創(chuàng)建?Vue?組件、Babylon?類、在畫布上渲染場景以及創(chuàng)建?3D?網(wǎng)格,需要的朋友可以參考下2022-07-07Vue.js項(xiàng)目部署到服務(wù)器的詳細(xì)步驟
這篇文章給大家介紹了Vue.js項(xiàng)目部署到服務(wù)器的詳細(xì)步驟,既然是部署到服務(wù)器,肯定是需要一個(gè)云的。具體思路步驟大家可以參考下本文2017-07-07mpvue 項(xiàng)目初始化及實(shí)現(xiàn)授權(quán)登錄的實(shí)現(xiàn)方法
這篇文章主要介紹了mpvue 項(xiàng)目初始化及實(shí)現(xiàn)授權(quán)登錄的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07