一個(gè) Vue3 強(qiáng)大的 API,讓你隨心所欲操控?cái)?shù)據(jù)更新!
背景
最近在做一個(gè)需求的時(shí)候,用到了一個(gè) Vue3 內(nèi)置的 API,發(fā)現(xiàn)真的非常實(shí)用,分享給大家。
需求是這樣的,我有一個(gè)變量 sum,是通過computed去計(jì)算的,且 sum 依賴的變量有的是響應(yīng)式的,有的不是響應(yīng)式的,所以會(huì)造成以下的后果,當(dāng)非響應(yīng)式變量改變時(shí),并不會(huì)觸發(fā)sum 的響應(yīng)式更新,只有響應(yīng)式變量改變時(shí)才會(huì)觸發(fā)sum的響應(yīng)式更新。
圖片
所以我需要用到一個(gè) Vue3 的內(nèi)置 API,它就是customRef。
customRef
創(chuàng)建一個(gè)自定義的 ref,顯式聲明對其依賴追蹤和更新觸發(fā)的控制方式。
類型
圖片
詳細(xì)信息
customRef() 預(yù)期接收一個(gè)工廠函數(shù)作為參數(shù),這個(gè)工廠函數(shù)接受 track 和 trigger 兩個(gè)函數(shù)作為參數(shù),并返回一個(gè)帶有 get 和 set 方法的對象。
一般來說,track() 應(yīng)該在 get() 方法中調(diào)用,而 trigger() 應(yīng)該在 set() 中調(diào)用。然而事實(shí)上,你對何時(shí)調(diào)用、是否應(yīng)該調(diào)用他們有完全的控制權(quán)。
實(shí)踐小案例:防抖 Ref
創(chuàng)建一個(gè)防抖 ref,即只在最近一次 set 調(diào)用后的一段固定間隔后再調(diào)用:
圖片
在組件中使用:
圖片
可控的 computed
圖片
再回到一開始的話題,我遇到的問題是:當(dāng)非響應(yīng)式變量改變時(shí),并不會(huì)觸發(fā)sum 的響應(yīng)式更新,只有響應(yīng)式變量改變時(shí)才會(huì)觸發(fā)sum的響應(yīng)式更新。
所以我們需要當(dāng)非響應(yīng)式變量count1、count2改變的時(shí)候,去手動(dòng)觸發(fā) computed 的計(jì)算,這樣才能更新 sum,但是 computed 返回的不是一個(gè)函數(shù)啊,我們要怎么去手動(dòng)觸發(fā)計(jì)算呢?
所以這時(shí)候就需要一個(gè)可控的 computed,它擁有以下功能:
- 1、能根據(jù)響應(yīng)式變量去自動(dòng)觸發(fā)計(jì)算更新
- 2、提供一個(gè)方法讓用戶手動(dòng)去調(diào)用觸發(fā)更新
期望使用方式是這樣的:
圖片
具體的代碼實(shí)現(xiàn)如下: