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

深入理解Vue3 computed

 更新時間:2025年08月27日 09:21:05   作者:前端小巷子  
本文主要介紹了Vue3 computed的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在模板里寫一行 {{ sum }},背后卻藏著「惰性求值 + 精準依賴收集 + 臟檢查緩存」的三重魔法。本文帶你鉆進源碼,拆解 computed 如何決定「何時算、何時不、為何不能異步」。

一、使用方法

const state = reactive({ a: 1, b: 2 })
const sum = computed(() => state.a + state.b)

console.log(sum.value) // 3
state.a = 10
console.log(sum.value) // 12

看似普通,但注意兩點:

  • 只讀:sum 不是函數(shù),而是一個「帶緩存的 getter」。
  • 懶執(zhí)行:直到第一次讀取 value,計算函數(shù)才真正跑一遍。

二、緩存機制:dirty 標志位

源碼核心只有兩行狀態(tài)機:

let value: any
let dirty = true
  • dirty 為 true → 需要重新計算
  • dirty 為 false → 直接返回舊值

首次讀取 sum.value 時,dirty 從 true 變?yōu)?false,并把結果存入 value。

當依賴的響應式數(shù)據(jù)變化,調度器把 dirty 重新置為 true,但不會立即計算,而是等待下一次讀取。

這就是「緩存」的本質:用 1 bit 的布爾值換一次昂貴的計算。

三、依賴收集:effect 包裹 getter

computed 的計算函數(shù)被 effect 包裝成副作用:

const effectFn = effect(getter, {
  lazy: true,
  scheduler() {
    dirty = true
    trigger(obj, TriggerOpTypes.SET, 'value')
  }
})
  • lazy: true 阻止首次執(zhí)行,實現(xiàn)惰性求值。
  • scheduler 在依賴變化時只打標記,不立即重算,確保緩存語義。

當模板讀取 sum.value,track 把當前渲染副作用注冊到 computed 的依賴圖;當 state.a 變化,trigger 通知渲染器重新執(zhí)行,渲染器再去讀 sum.value,此時才真正觸發(fā)計算。

四、為什么拒絕異步?

設想一個異步 computed:

const asyncSum = computed(async () => {
  const res = await fetch('/api/sum?a=' + state.a)
  return res.json()
})

問題立刻暴露:

  1. 緩存無法兌現(xiàn)

    第一次讀取返回一個 Promise,第二次讀取依賴并未變化,但緩存里存的是 Promise,無法直接返回結果。

  2. 渲染時數(shù)據(jù)缺位

    模板在渲染階段需要同步值,異步導致視圖出現(xiàn)空檔或閃爍。

  3. 依賴追蹤混亂

    異步完成時間不確定,期間若依賴再次變化,無法確定哪一次結果是最新。

Vue 官方給出的替代方案是 watch + ref

const asyncSum = ref(0)
watch(state, async () => {
  asyncSum.value = await fetch('/api/sum?a=' + state.a).then(r => r.json())
})

watch 不緩存、不阻塞渲染,天然適合異步副作用。

五、可寫 computed:緩存 + setter 的雙通道

const fullName = computed({
  get()   { return firstName.value + ' ' + lastName.value },
  set(v)  { [firstName.value, lastName.value] = v.split(' ') }
})
  • getter 走同樣的緩存邏輯。
  • setter 只是普通函數(shù),無緩存要求,因此可以包含異步(但仍不推薦,因為 setter 觸發(fā)后 getter 需同步返回新值)。

總結

computed 用「dirty 位 + 惰性 effect」實現(xiàn)同步緩存,用「拒絕異步」換取數(shù)據(jù)一致性。理解了這一點,你就掌握了 Vue 性能調優(yōu)的第一把鑰匙。

到此這篇關于深入理解Vue3 computed的文章就介紹到這了,更多相關Vue3 computed內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Vue初始化頁面閃動(FOUC)問題的終極解決方案

    Vue初始化頁面閃動(FOUC)問題的終極解決方案

    你是否遇到過頁面加載瞬間,用戶看到滿屏的 {{ message }}、{{ user.name }} 等未編譯的模板標簽,幾毫秒后才恢復正常,這就是 Vue 初始化閃動問題,也稱為 FOUC,本文將提供完整、可靠、可落地的解決方案,徹底根除此問題,需要的朋友可以參考下
    2025-10-10
  • Vue 使用typescript如何優(yōu)雅的調用swagger API

    Vue 使用typescript如何優(yōu)雅的調用swagger API

    這篇文章主要介紹了Vue 使用typescript如何優(yōu)雅的調用swagger API,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Vue實現(xiàn)一種簡單的無限循環(huán)滾動動畫的示例

    Vue實現(xiàn)一種簡單的無限循環(huán)滾動動畫的示例

    這篇文章主要介紹了Vue實現(xiàn)一種簡單的無限循環(huán)滾動動畫的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • vue實現(xiàn)購物車拋物線小球動畫效果的方法詳解

    vue實現(xiàn)購物車拋物線小球動畫效果的方法詳解

    這篇文章主要介紹了vue實現(xiàn)購物車拋物線小球動畫效果的方法,結合實例形式較為詳細的分析了vue.js實現(xiàn)拋物線動畫效果購物車功能相關原理與操作注意事項,需要的朋友可以參考下
    2019-02-02
  • Vue3中reactive函數(shù)toRef函數(shù)ref函數(shù)簡介

    Vue3中reactive函數(shù)toRef函數(shù)ref函數(shù)簡介

    這篇文章主要介紹了Vue3中的三種函數(shù),分別對reactive函數(shù)toRef函數(shù)以及ref函數(shù)原理及使用作了簡單介紹,有需要的朋友可以借鑒參考下
    2021-09-09
  • vue虛擬滾動/虛擬列表簡單實現(xiàn)示例

    vue虛擬滾動/虛擬列表簡單實現(xiàn)示例

    本文主要介紹了vue虛擬滾動/虛擬列表簡單實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • uni-app自定義導航欄按鈕|uniapp仿微信頂部導航條功能

    uni-app自定義導航欄按鈕|uniapp仿微信頂部導航條功能

    這篇文章主要介紹了uni-app自定義導航欄按鈕|uniapp仿微信頂部導航條,需要的朋友可以參考下
    2019-11-11
  • Nuxt 嵌套路由nuxt-child組件用法(父子頁面組件的傳值)

    Nuxt 嵌套路由nuxt-child組件用法(父子頁面組件的傳值)

    這篇文章主要介紹了Nuxt 嵌套路由nuxt-child組件用法(父子頁面組件的傳值),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 基于Vue實現(xiàn)tab欄切換內容不斷實時刷新數(shù)據(jù)功能

    基于Vue實現(xiàn)tab欄切換內容不斷實時刷新數(shù)據(jù)功能

    在項目開發(fā)中遇到這樣需求,就是有幾個tab欄,每個tab欄對應的ajax請求不一樣,內容區(qū)域一樣,內容為實時刷新數(shù)據(jù),實現(xiàn)方法其實很簡單的,下面小編給大家?guī)砹嘶赩ue實現(xiàn)tab欄切換內容不斷實時刷新數(shù)據(jù)功能,需要的朋友參考下吧
    2017-04-04
  • vue上傳圖片文件的多種實現(xiàn)方法

    vue上傳圖片文件的多種實現(xiàn)方法

    這篇文章主要給大家介紹了關于vue上傳圖片文件的相關資料,介紹了利用原始input標簽form表單上傳、elementui自帶的el-upload上傳以及elementui實現(xiàn)一次性上傳多張圖片等方法,需要的朋友可以參考下
    2021-05-05

最新評論

登封市| 基隆市| 虹口区| 军事| 南阳市| 腾冲县| 南木林县| 浙江省| 中西区| 张家港市| 嘉峪关市| 新巴尔虎左旗| 依兰县| 清徐县| 鄂州市| 上虞市| 大丰市| 中阳县| 台前县| 崇文区| 崇州市| 乌鲁木齐县| 平塘县| 合川市| 阿鲁科尔沁旗| 临泽县| 嘉义市| 西青区| 棋牌| 元朗区| 玛曲县| 衡山县| 万年县| 潼南县| 吴旗县| 兴仁县| 和田市| 阿图什市| 秦安县| 肇东市| 塘沽区|