arrayInstrumentations速覽(3)

arrayInstrumentations主要是改寫數(shù)組的方法
1.改寫includes骑晶、indexOf配深、lastIndexOf這三個(gè)方法兆蕉。這三個(gè)方法無法'準(zhǔn)確'追蹤數(shù)組中元素昧穿。具體表現(xiàn)如下(案例來自網(wǎng)絡(luò))

       const arr = reactive([2,1,3])
       effect(() => {
         console.log(arr.indexOf(2))
       })
       setTimeout(() =>{
         arr[1] = 4
       }, 5000)

當(dāng)修改arr[1]的值時(shí)厕妖,將會(huì)觸發(fā)副作用函數(shù)的的執(zhí)行第美,但arr[1]值的改變并不會(huì)影響副作用函數(shù)的結(jié)果(arr[0]不等于2時(shí)才影響)蝶锋,因此可以判定是無效的觸發(fā)。
因此當(dāng)調(diào)用的是這三個(gè)方法時(shí)什往,要對(duì)數(shù)組中的每個(gè)元素進(jìn)行依賴收集扳缕,這樣才能正確觸發(fā),這里還要注意處理參數(shù)已經(jīng)被proxy代理的情況

;(['includes', 'indexOf', 'lastIndexOf'] as const).forEach(key => {
    instrumentations[key] = function (this: unknown[], ...args: unknown[]) {
      const arr = toRaw(this) as any
      for (let i = 0, l = this.length; i < l; i++) {
        track(arr, TrackOpTypes.GET, i + '')
      }
      // we run the method using the original args first (which may be reactive)
      const res = arr[key](...args)
      if (res === -1 || res === false) {
        // if that didn't work, run it again using raw values.
        return arr[key](...args.map(toRaw))
      } else {
        return res
      }
    }
  })

2.改寫push别威、pop躯舔、shift、unshift省古、splice這三個(gè)方法粥庄。這三個(gè)方法是直接調(diào)用數(shù)組對(duì)應(yīng)的方法,返回對(duì)應(yīng)的結(jié)果豺妓,不進(jìn)行額外的依賴收集

// instrument length-altering mutation methods to avoid length being tracked
// which leads to infinite loops in some cases (#2137)
  ;(['push', 'pop', 'shift', 'unshift', 'splice'] as const).forEach(key => {
    instrumentations[key] = function (this: unknown[], ...args: unknown[]) {
      pauseTracking()
      const res = (toRaw(this) as any)[key].apply(this, args)
      resetTracking()
      return res
    }
  })
export function pauseTracking() {
  trackStack.push(shouldTrack)
  shouldTrack = false
}
export function resetTracking() {
  const last = trackStack.pop()
  shouldTrack = last === undefined ? true : last
}

為什么這么做呢惜互?從注釋中找到的信息是避免length改變陷入無盡的回調(diào)。那么如果此處不進(jìn)行依賴收集琳拭,那么依賴收集是在哪一塊進(jìn)行的呢载佳?讓我們回看上一章中mutableHandlers方法,此方法只是針對(duì)數(shù)組這八個(gè)方法進(jìn)行改寫臀栈,那么length屬性呢蔫慧,不在這當(dāng)中,還是繼續(xù)往下執(zhí)行权薯,會(huì)進(jìn)行依賴收集姑躲。因此如果這里再進(jìn)行依賴收集睡扬,那么就會(huì)重復(fù),因此不需要再進(jìn)行收集黍析。

下文主要對(duì)依賴收集函數(shù)track進(jìn)行展開卖怜!
本人菜雞,有問題望前輩及時(shí)指出阐枣,不勝感激B砜俊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔼两,一起剝皮案震驚了整個(gè)濱河市甩鳄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌额划,老刑警劉巖妙啃,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異俊戳,居然都是意外死亡揖赴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門抑胎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來燥滑,“玉大人,你說我怎么就攤上這事阿逃∶。” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵盆昙,是天一觀的道長。 經(jīng)常有香客問我焊虏,道長淡喜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任诵闭,我火速辦了婚禮炼团,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疏尿。我一直安慰自己瘟芝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布褥琐。 她就那樣靜靜地躺著锌俱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敌呈。 梳的紋絲不亂的頭發(fā)上贸宏,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天造寝,我揣著相機(jī)與錄音,去河邊找鬼吭练。 笑死诫龙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鲫咽。 我是一名探鬼主播签赃,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼分尸!你這毒婦竟也來了锦聊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤寓落,失蹤者是張志新(化名)和其女友劉穎括丁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伶选,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡史飞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仰税。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片构资。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陨簇,靈堂內(nèi)的尸體忽然破棺而出吐绵,到底是詐尸還是另有隱情,我是刑警寧澤河绽,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布己单,位于F島的核電站,受9級(jí)特大地震影響耙饰,放射性物質(zhì)發(fā)生泄漏纹笼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一苟跪、第九天 我趴在偏房一處隱蔽的房頂上張望廷痘。 院中可真熱鬧,春花似錦件已、人聲如沸笋额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兄猩。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厦滤,已是汗流浹背援岩。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掏导,地道東北人享怀。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像趟咆,于是被迫代替她去往敵國和親添瓷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容