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

vue面試??贾甤omputed是如何實現(xiàn)的

 更新時間:2023年08月04日 09:51:30   作者:前端胖頭魚  
對于每天都在用的計算屬性(computed),小編猜大家肯定也想窺探其奧妙與原理對吧,所以這篇文章就來講講computed是如何實現(xiàn)的吧,感興趣的小伙伴可以學習一下

前言

通過前面幾篇文章,我們對Vue3中的響應式設計有了初步的了解。

而對于每天都在用的計算屬性(computed),我猜你肯定也想窺探其奧妙與原理對吧!走起?。?!

從computed的特性出發(fā)

computed最耀眼的幾個特性是啥?

1. 依賴追蹤

import?{?reactive,?computed?}?from?'vue'
const?state?=?reactive({
??a:?1,
??b:?2,
??c:?3,
})
const?sum?=?computed(()?=>?{
??return?state.a?+?state.b
})

我們定義了一個響應式數(shù)據(jù)state和一個計算屬性sum, Vue會自動追蹤sum依賴的數(shù)據(jù)state.astate.b,并建立相應的依賴關系。

也就是只有state.astate.b發(fā)生變化的時候,sum才會重新計算而state.c任由它怎么變,sum都將絲毫不受影響。

2. 緩存

還是上面的例子,如果state.astate.b打死都不再改變值了,那么我們讀取sum的時候,它將會返回上一次計算的結果,而不是重新計算。

3. 懶計算

這個特性比較容易被忽略,簡單地說只有計算屬性真正被使用(讀?。┑臅r候才會進行計算,否則咱就僅僅是定義了一個變量而已。

import?{?reactive,?computed?}?from?'vue'
const?state?=?reactive({
??a:?1,
??b:?2,
??c:?3
})
const?sum?=?computed(()?=>?{
??console.log('執(zhí)行計算')
??return?state.a?+?state.b
})
setTimeout(()?=>?{
??//?沒有讀取sum.value之前,sum不會進行計算
??console.log('1-sum',?sum.value)
??//?我們改變了a的值,但是sum并不會立刻進行計算
??state.a?=?4
??setTimeout(()?=>?{
????//?而是要等到再次讀取的時候才會觸發(fā)重新計算
????console.log('2-sum',?sum.value)
??},?1000)
},?1000)

挨個實現(xiàn)computed特性

1. 懶計算

我們依舊圍繞effect函數(shù)來搞事情,到目前為止,effect注冊的回調都是立刻執(zhí)行。

const?state?=?reactive({
??a:?1,
??b:?2,
??c:?3
})
//?有沒有很像計算屬性的感覺
const?sum?=?effect(()?=>?{
??console.log('執(zhí)行計算')?//?立刻被打印
??const?value?=?state.a?+?state.b
??return?value
})
console.log(sum)?//?undefined

想要實現(xiàn)computed的懶執(zhí)行,咱們可以參考上篇文章Vue3:原來你是這樣的“異步更新”的思路,添加一個額外的參數(shù)lazy。

它要實現(xiàn)的功能是:如果傳遞了lazytrue,副作用函數(shù)將不會立即執(zhí)行,而是將執(zhí)行的時機交還給用戶,由用戶決定啥時候執(zhí)行。

當然啦!回調的結果我們也應該一并返回(例如上面的value值)

你能想象,我們僅僅需要改造幾行代碼就能離computed近了一大步。

const?effect?=?function?(fn,?options?=?{})?{
??const?effectFn?=?()?=>?{
????//?...?省略
????//?新增res存儲fn執(zhí)行的結果
????const?res?=?fn()
????//?...?省略
????//?新增返回結果
????return?res
??}
??//?...?省略
??//?新增,只有l(wèi)azy不為true時才會立即執(zhí)行
??if?(!options.lazy)?{
????effectFn()
??}
??//?新增,返回副作用函數(shù)讓用戶執(zhí)行
??return?effectFn
}

測試一波

const?state?=?reactive({
??a:?1,
??b:?2,
??c:?3,
});
//?有沒有很像計算屬性的感覺
const?sum?=?effect(()?=>?{
??console.log("執(zhí)行計算");?//?調用sum函數(shù)后被打印
??const?value?=?state.a?+?state.b;
??return?value;
},?{
??lazy:?true
});
//?不執(zhí)行sum函數(shù),effect注冊的回調將不會執(zhí)行
console.log(sum());?//?3

2. 依賴追蹤

咱們初步實現(xiàn)了懶執(zhí)行的特性,為了更像computed一點,我們需要封裝一個函數(shù)。

function?computed?(getter)?{
??const?effectFn?=?effect(getter,?{
????lazy:?true,
??})
??const?obj?=?{
????get?value?()?{
??????return?effectFn()
????}
??}
??return?obj
}

這就有點那么味道啦!

測試一波

可以看到computed只會依賴state.astate.b,而不會依賴state.c,這得益于我們前面幾篇文章實現(xiàn)的響應式系統(tǒng),所以到了計算屬性這里,我們不用改動任何代碼,天然就支持。

不過還是有點小問題,我們讀取了兩次sum.value,sum卻被執(zhí)行了兩次,這和computed緩存的特性就不符了。

別急,馬上就要實現(xiàn)了這個最重要的特性了。

const?state?=?reactive({
??a:?1,
??b:?2,
??c:?3
})
const?sum?=?computed(()?=>?{
??console.log('執(zhí)行計算')
??return?state.a?+?state.b
})
console.log(sum.value)
console.log(sum.value)

3. 緩存

回顧一下computed的緩存特性:

  • 只有當其依賴的東西發(fā)生變化了才需要重新計算
  • 否則就返回上一次執(zhí)行的結果。

為了緩存上一次計算的結果,咱們需要定義一個value變量,現(xiàn)在的關鍵是怎么才能知道其依賴的數(shù)據(jù)發(fā)生變化了呢?

function?computed?(getter)?{
??const?effectFn?=?effect(getter,?{
????lazy:?true,
??})
??let?value
??let?dirty?=?true
??const?obj?=?{
????get?value?()?{
??????//?2.?只有數(shù)據(jù)發(fā)生變化了才去重新計算
??????if?(dirty)?{
????????value?=?effectFn()
????????dirty?=?false
??????}
??????return?value
????}
??}
??return?obj
}

測試一波

const?state?=?reactive({
??a:?1,
??b:?2,
??c:?3
})
const?sum?=?computed(()?=>?{
??console.log('執(zhí)行計算')
??return?state.a?+?state.b
})
console.log(sum.value)?//?3
console.log(sum.value)?//?3
state.a?=?4
console.log(sum.value)?//?3?答案是錯誤的

寄上任務調度

不得不說,任務調度實在太強大了,不僅僅可以實現(xiàn)數(shù)組的異步批量更新、在computedwatch中也是必不可少的。

function?computed?(getter)?{
??const?effectFn?=?effect(getter,?{
????lazy:?true,
????//?數(shù)據(jù)發(fā)生變化后,不執(zhí)行注冊的回調,而是執(zhí)行scheduler
????scheduler?()?{
??????//?數(shù)據(jù)發(fā)生了變化后,則重新設置為dirty,那么下次就會重新計算
??????dirty?=?true
????}
??})
??let?value
??let?dirty?=?true
??const?obj?=?{
????get?value?()?{
??????//?2.?只有數(shù)據(jù)發(fā)生變化了才去重新計算
??????if?(dirty)?{
????????value?=?effectFn()
????????dirty?=?false
??????}
??????return?value
????}
??}
??return?obj
}

測試一波

const?state?=?reactive({
??a:?1,
??b:?2,
??c:?3
})
const?sum?=?computed(()?=>?{
??console.log('執(zhí)行計算')
??return?state.a?+?state.b
})
console.log(sum.value)?//?3
console.log(sum.value)?//?3
state.a?=?4
console.log(sum.value)?//?3?答案是錯誤的

完美!??!這下面試官再也難不倒我了?。。?/p>

到此這篇關于vue面試??贾甤omputed是如何實現(xiàn)的的文章就介紹到這了,更多相關vue computed內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Vue項目中使用自定義字體樣式方式

    Vue項目中使用自定義字體樣式方式

    這篇文章主要介紹了Vue項目中使用自定義字體樣式方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue中解決拖拽改變存在iframe的div大小時卡頓問題

    vue中解決拖拽改變存在iframe的div大小時卡頓問題

    這篇文章主要介紹了vue中解決拖拽改變存在iframe的div大小時卡頓問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • vue中iframe使用以及結合postMessage實現(xiàn)跨域通信

    vue中iframe使用以及結合postMessage實現(xiàn)跨域通信

    這篇文章主要介紹了vue中iframe使用以及結合postMessage實現(xiàn)跨域通信方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • el-form表單驗證的一些實用方法總結

    el-form表單驗證的一些實用方法總結

    表單校驗是注冊環(huán)節(jié)中必不可少的操作,表單校驗通過一定的規(guī)則來確保用戶提交數(shù)據(jù)的有效性,下面這篇文章主要給大家介紹了關于el-form表單驗證的一些實用方法,需要的朋友可以參考下
    2023-01-01
  • 簡單理解vue中Props屬性

    簡單理解vue中Props屬性

    這篇文章主要幫助大家簡單的理解vue中Props屬性,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • vue單頁應用中如何使用jquery的方法示例

    vue單頁應用中如何使用jquery的方法示例

    最近在工作中遇到的一個需求,需要在vue-cli建立的應用中引入jquery的方式,通過查找相關的資料最終解決了,所以這篇文章主要給大家介紹了關于在vue單頁應用中如何使用jquery的方法示例,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • element plus el-table多選框跨頁多選保留功能

    element plus el-table多選框跨頁多選保留功能

    這篇文章主要介紹了element plus el-table多選框跨頁多選保留功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-05-05
  • vite+vue3項目啟動報錯Unexpected?“%“問題及解決

    vite+vue3項目啟動報錯Unexpected?“%“問題及解決

    這篇文章主要介紹了vite+vue3項目啟動報錯Unexpected?“%“問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Vue之props 配置詳解

    Vue之props 配置詳解

    這篇文章主要為大家介紹了Vue之props 配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助,希望能夠給你帶來幫助
    2021-11-11
  • vue+iview+less+echarts實戰(zhàn)項目總結

    vue+iview+less+echarts實戰(zhàn)項目總結

    本篇文章是作者通過學習vue+iview+less+echarts制作一個小系統(tǒng)后,做的心得以及遇到的坑的總結,值得大家學習參考。
    2018-02-02

最新評論

广丰县| 佛山市| 舞钢市| 阿拉尔市| 措勤县| 安多县| 泾源县| 盈江县| 马关县| 金阳县| 双鸭山市| 古交市| 通辽市| 文成县| 承德市| 凯里市| 巨野县| 南皮县| 桐柏县| 武邑县| 同江市| 浪卡子县| 化隆| 惠水县| 阳泉市| 肇庆市| 济源市| 奈曼旗| 交口县| 安溪县| 临邑县| 尼玛县| 蒙阴县| 鄂尔多斯市| 德钦县| 镇康县| 青岛市| 武汉市| 承德县| 济宁市| 乐业县|