最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue.js中的computed功能設(shè)計(jì)

 更新時(shí)間:2023年06月08日 09:12:17   作者:GoldenFingers  
computed作為計(jì)算屬性其作用是描述響應(yīng)式數(shù)據(jù)的復(fù)雜邏輯計(jì)算,當(dāng)所依賴(lài)的響應(yīng)式數(shù)據(jù)發(fā)生改變時(shí)計(jì)算屬性會(huì)重新計(jì)算,更新邏輯計(jì)算的結(jié)果,這篇文章主要介紹了Vue.js中的computed的功能設(shè)計(jì),需要的朋友可以參考下

1、關(guān)于computed的功能描述

computed作為計(jì)算屬性其作用是描述響應(yīng)式數(shù)據(jù)的復(fù)雜邏輯計(jì)算,當(dāng)所依賴(lài)的響應(yīng)式數(shù)據(jù)發(fā)生改變時(shí)計(jì)算屬性會(huì)重新計(jì)算,更新邏輯計(jì)算的結(jié)果。

有個(gè)體現(xiàn)計(jì)算屬性特點(diǎn)的便是比較計(jì)算屬性和方法的區(qū)別,比如我們需要計(jì)算兩個(gè)響應(yīng)式數(shù)據(jù)的和

const obj = new reactive({foo: 1, bar: 2})
// 使用計(jì)算屬性獲取值
const value = computed(() => {obj.foo + obj.bar})
// 使用方法獲取值
const value = () => obj.foo + obj.bar

其區(qū)別為computed有緩存機(jī)制,當(dāng)內(nèi)部依賴(lài)的響應(yīng)式數(shù)據(jù)沒(méi)有改變時(shí)則直接從緩存中獲取結(jié)果,而方法則每次都需要執(zhí)行。當(dāng)依賴(lài)的響應(yīng)式數(shù)據(jù)很多并且邏輯很復(fù)雜的時(shí)候那么計(jì)算屬性效率會(huì)比方法高很多。

2、計(jì)算屬性的lazy設(shè)計(jì)

對(duì)于計(jì)算屬性我們只有在需要值的時(shí)候才需要計(jì)算,而computed(getter)以一個(gè)getter作為參數(shù),即每次計(jì)算屬性依賴(lài)的響應(yīng)式數(shù)據(jù)改變的時(shí)候都需要重新執(zhí)行getter,但是每次getter的每一次執(zhí)行卻是不必要的,因?yàn)橹挥挟?dāng)獲取計(jì)算屬性的值時(shí)才運(yùn)行getter獲取值,所以對(duì)于getter的計(jì)算需要懶惰執(zhí)行。

在上一章節(jié)中已經(jīng)介紹了調(diào)度器的作用,所以我們只需要在調(diào)度器中加入一個(gè)lazy的標(biāo)記就行了

effect(() => {
    return obj.foo + obj.bar
}, {
	// 調(diào)度器中設(shè)置lazy標(biāo)記
    lazy: true
})
function effect(fn, options = {}) {
    const effectFn = () => {
      	// 省略代碼
    }
    effectFn.options = options
    effectFn.deps = []
	// 如過(guò)有緩存標(biāo)記則直接返回
    if(options.lazy)
        return effectFn
    effectFn()
}
function computed(getter) {
    // 把getter作為一個(gè)副作用函數(shù)
    const effectFn = effect(getter, {
        lazy: true,
    })
    const obj = {
        // 只有當(dāng)讀取到value時(shí)才會(huì)觸發(fā)effectFn
        get value() {
            return effectFn()
        }
    }
    return obj.value
}

這樣只有我們?cè)讷@取計(jì)算屬性的value時(shí)才會(huì)觸發(fā)副作用函數(shù)執(zhí)行,而不會(huì)在響應(yīng)式數(shù)據(jù)改變時(shí)就直接執(zhí)行。

3、計(jì)算屬性的緩存

假設(shè)我們?cè)谏鲜龃a的設(shè)計(jì)基礎(chǔ)下有以下代碼

const sum = computed(() => obj.foo + obj.bar)
console.log(sum.value)
console.log(sum.value)
console.log(sum.value)

此時(shí)effectFn會(huì)接連執(zhí)行三次,但是每次的結(jié)果都是一樣的,因?yàn)橛?jì)算屬性所依賴(lài)的obj.foo \obj.bar的值并沒(méi)有改變,所以我們可以直接將計(jì)算的結(jié)果緩存下來(lái)。

function computed(getter) {
    // 用來(lái)緩存計(jì)算的結(jié)果
    let value
    // 用于標(biāo)記是否需要重新計(jì)算值
    let dirty = true
    let effectFn = effect(getter, {
        lazy: true
    }) 
    const obj = {
        get value() {
            // 如過(guò)需要重新計(jì)算值
            if(dirty) {
                value = effectFn()
                dirty = false
            }
            return value
        }
    }
    return obj
}

此時(shí)我們多次獲取sum.value的值則不會(huì)每次都重新計(jì)算了,但是這樣寫(xiě)有一個(gè)非常明顯的問(wèn)題就是我們所依賴(lài)的響應(yīng)式的值改變的時(shí)候不會(huì)重新計(jì)算,所以我們dirty這個(gè)標(biāo)記還需要和依賴(lài)的響應(yīng)式數(shù)據(jù)聯(lián)系起來(lái)。具體做法是將dirty放入調(diào)度器中,這樣每次響應(yīng)式數(shù)據(jù)被改變的時(shí)候都會(huì)觸發(fā)調(diào)度器改變dirty的值

function computed(getter) {
    // 用來(lái)緩存計(jì)算的結(jié)果
    let value
    // 用于標(biāo)記是否需要重新計(jì)算值
    let dirty = true
    let effectFn = effect(getter, {
        lazy: true,
        // 當(dāng)響應(yīng)式數(shù)據(jù)修改時(shí),觸發(fā)副作用函數(shù)時(shí)修改dirty的值
        scheduler: () => {
            dirty = true
        }
    }) 
    const obj = {
        get value() {
            // 如過(guò)需要重新計(jì)算值
            if(dirty) {
                value = effectFn()
                dirty = false
            }
            return value
        }
    }
    return obj
}

其實(shí)還有一個(gè)問(wèn)題就是當(dāng)計(jì)算屬性放入effect形成嵌套時(shí),我們改變obj的值并不會(huì)觸發(fā)外層的effect函數(shù),即:

// 省略代碼......
const sum = computed(() => obj.foo + obj.bar)
effect(() => {
    console.log(sum.value)
})

當(dāng)改變obj.foo/obj.bar的值并不會(huì)輸出sum.value的值。這是不符合應(yīng)用場(chǎng)景的,在應(yīng)用中當(dāng)我們的計(jì)算屬性改變的時(shí)候頁(yè)面也會(huì)重新渲染。

整個(gè)問(wèn)題分析一下就是effect嵌套的問(wèn)題,當(dāng)內(nèi)層的響應(yīng)式數(shù)據(jù)只和getter形成了聯(lián)系,和外層的副作用函數(shù)并沒(méi)有關(guān)系,而內(nèi)部的value并不是響應(yīng)式數(shù)據(jù)還是懶執(zhí)行的,所以也就不會(huì)和外層的副作用函數(shù)產(chǎn)生聯(lián)系了,這里解決的方案就是直接手動(dòng)將計(jì)算屬性的結(jié)果和外層副作用函數(shù)聯(lián)系起來(lái)。

function computed(getter) {
    let value
    let dirty = true
    const effectFn = effect(getter, {
        lazy: true,
        scheduler: () => {
            dirty = true
            // 計(jì)算屬性依賴(lài)的響應(yīng)式數(shù)據(jù)發(fā)生改變時(shí),手動(dòng)觸發(fā)響應(yīng)
            trigger(obj, 'value')
        }
    })
    const obj = {
        get value() {
            if(dirty) {
                value = effectFn()
                dirty = false
            }
            // 讀取value時(shí)手動(dòng)追蹤
            track(obj, 'value')
            return value
        }
    }
    return obj
}

到此這篇關(guān)于Vue.js中的computed的設(shè)計(jì)的文章就介紹到這了,更多相關(guān)Vue.js computed內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue2手機(jī)APP項(xiàng)目添加開(kāi)屏廣告或者閃屏廣告

    vue2手機(jī)APP項(xiàng)目添加開(kāi)屏廣告或者閃屏廣告

    這篇文章主要為大家詳細(xì)介紹了vue2手機(jī)APP項(xiàng)目添加開(kāi)屏廣告或者閃屏廣告的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • vue中iframe的使用及說(shuō)明

    vue中iframe的使用及說(shuō)明

    這篇文章主要介紹了vue中iframe的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue生命周期的探索

    vue生命周期的探索

    這篇文章主要介紹了vue生命周期的探索,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Vue3中配置404路由及懶加載的解決過(guò)程

    Vue3中配置404路由及懶加載的解決過(guò)程

    這篇文章主要介紹了Vue3中配置404路由及懶加載的解決過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Vue3實(shí)現(xiàn)點(diǎn)擊按鈕實(shí)現(xiàn)文字變色功能

    Vue3實(shí)現(xiàn)點(diǎn)擊按鈕實(shí)現(xiàn)文字變色功能

    這篇文章主要介紹了使用Vue3實(shí)現(xiàn)點(diǎn)擊按鈕實(shí)現(xiàn)文字變色功能,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-07-07
  • Vue狀態(tài)管理之使用Pinia代替Vuex

    Vue狀態(tài)管理之使用Pinia代替Vuex

    這篇文章主要介紹了Vue狀態(tài)管理。下面文章主要圍繞著使用Pinia代替Vuex的相關(guān)資料展開(kāi)具體內(nèi)容,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-11-11
  • vue{{}}拼接字符串和換行符方式

    vue{{}}拼接字符串和換行符方式

    這篇文章主要介紹了vue{{}}拼接字符串和換行符方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • vite build vue3項(xiàng)目配置開(kāi)啟sourcemap方式

    vite build vue3項(xiàng)目配置開(kāi)啟sourcemap方式

    這篇文章主要介紹了vite build vue3項(xiàng)目配置開(kāi)啟sourcemap方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Vue命令式組件的編寫(xiě)與應(yīng)用小結(jié)

    Vue命令式組件的編寫(xiě)與應(yīng)用小結(jié)

    這篇文章主要介紹了Vue命令式組件的編寫(xiě)與應(yīng)用小結(jié),在這篇文章中,我會(huì)帶你了解命令式組件的基本概念,并通過(guò)一些簡(jiǎn)單的示例來(lái)展示它們是如何工作的,需要的朋友可以參考下
    2024-03-03
  • 詳解如何在vue項(xiàng)目中使用eslint+prettier格式化代碼

    詳解如何在vue項(xiàng)目中使用eslint+prettier格式化代碼

    在開(kāi)發(fā)中我們需要一種能夠統(tǒng)一團(tuán)隊(duì)代碼風(fēng)格的工具,作為強(qiáng)制性的規(guī)范,統(tǒng)一整個(gè)項(xiàng)目的代碼風(fēng)格,這篇文章主要介紹了詳解如何在vue項(xiàng)目中使用eslint+prettier格式化代碼,需要的朋友可以參考下
    2018-11-11

最新評(píng)論

兴业县| 玛曲县| 马鞍山市| 兰州市| 张家口市| 莱阳市| 榆林市| 宣城市| 揭阳市| 临桂县| 新河县| 黎平县| 宾川县| 乐都县| 宁夏| 永和县| 宣城市| 称多县| 正宁县| 图们市| 盐边县| 抚松县| 大连市| 呼图壁县| 东海县| 综艺| 九江县| 龙岩市| 建水县| 陆良县| 绿春县| 商城县| 新巴尔虎右旗| 绥德县| 泰兴市| 出国| 陆川县| 涡阳县| 永新县| 万全县| 射洪县|