欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析Vue如何巧用computed計(jì)算屬性

 更新時(shí)間:2023年06月09日 17:09:30   作者:田八  
在日常使用Vue開發(fā)項(xiàng)目的時(shí)候,計(jì)算屬性computed是一個(gè)非常常用的特性,本文就來分享一些使用Vue的computed計(jì)算屬性時(shí)的一些小技巧,希望能夠幫助到大家

在日常使用Vue開發(fā)項(xiàng)目的時(shí)候,計(jì)算屬性computed是一個(gè)非常常用的特性,它的主要作用是對數(shù)據(jù)進(jìn)行處理,然后返回新的數(shù)據(jù),這樣就不需要在模板中寫過多的邏輯代碼,從而使得模板更加簡潔,可讀性更強(qiáng)。

今天我就來分享一些我在使用Vuecomputed計(jì)算屬性時(shí)的一些小技巧,希望能夠幫助到大家。

1. 計(jì)算屬性的基本用法

計(jì)算屬性的用法很簡單,一同分為四個(gè)部分:gettersetter、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)

onTrackonTrigger一般用于調(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)文章

  • Electron + vue 打包桌面操作流程詳解

    Electron + vue 打包桌面操作流程詳解

    這篇文章主要介紹了Electron + vue 打包桌面操作流程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • 詳解Vue.js中.native修飾符

    詳解Vue.js中.native修飾符

    這篇文章主要介紹了Vue.js中.native修飾符,給普通的HTML標(biāo)簽監(jiān)聽一個(gè)事件,之后添加 .native 修飾符是不會起作用的。需要的朋友可以參考下
    2018-04-04
  • vue刷新子組件、重置組件以及重新加載子組件項(xiàng)目實(shí)戰(zhàn)記錄

    vue刷新子組件、重置組件以及重新加載子組件項(xiàng)目實(shí)戰(zhàn)記錄

    在vue開發(fā)中出于各種目的,我們常常需要讓組件重新加載渲染,這篇文章主要給大家介紹了關(guān)于vue刷新子組件、重置組件以及重新加載子組件的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • vue中template模板編譯的過程全面剖析

    vue中template模板編譯的過程全面剖析

    這篇文章主要介紹了vue中template模板編譯的過程全面剖析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 在Vue3中使用BabylonJs開發(fā)?3D的初體驗(yàn)

    在Vue3中使用BabylonJs開發(fā)?3D的初體驗(yàn)

    這篇文章主要介紹了在?Vue3?中使用?BabylonJs?開發(fā)?3D?是什么體驗(yàn),在本文中,向您展示了如何創(chuàng)建?Vue?組件、Babylon?類、在畫布上渲染場景以及創(chuàng)建?3D?網(wǎng)格,需要的朋友可以參考下
    2022-07-07
  • Vue.js項(xiàng)目部署到服務(wù)器的詳細(xì)步驟

    Vue.js項(xiàng)目部署到服務(wù)器的詳細(xì)步驟

    這篇文章給大家介紹了Vue.js項(xiàng)目部署到服務(wù)器的詳細(xì)步驟,既然是部署到服務(wù)器,肯定是需要一個(gè)云的。具體思路步驟大家可以參考下本文
    2017-07-07
  • 解決VuePress頁面亂碼問題

    解決VuePress頁面亂碼問題

    這篇文章主要介紹了解決VuePress頁面亂碼問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue自嵌套樹組件使用方法詳解

    Vue自嵌套樹組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Vue自嵌套樹組件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 手寫vue無限滾動指令的詳細(xì)過程

    手寫vue無限滾動指令的詳細(xì)過程

    今天在移動端項(xiàng)目中遇見一個(gè)需求,需要數(shù)據(jù)無限滾動,所以下面這篇文章主要給大家介紹了關(guān)于手寫vue無限滾動指令的詳細(xì)過程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • mpvue 項(xiàng)目初始化及實(shí)現(xiàn)授權(quán)登錄的實(shí)現(xiàn)方法

    mpvue 項(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

最新評論