成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Vue2剝絲抽繭-響應(yīng)式系統(tǒng)完善

開發(fā) 前端
如果 Watcher 中的函數(shù)不再依賴當(dāng)前屬性,我們就把當(dāng)前 Watcher 從該屬性的 Dep 中移除。

這篇文章主要修之前代碼存在的一個問題,廢話不多說,上代碼!

場景

import { observe } from "./reactive";
import Watcher from "./watcher";
const data = {
text: "hello, world",
};
observe(data);
let show = true;
const updateComponent = () => {
if (show) {
console.log(data.text);
show = false;
}
};

new Watcher(updateComponent);

new Watcher(() => console.log("依賴", data.text));

data.text = "123";

先可以 1 分鐘思考一下會輸出什么。

  • new Watcher(updateParentComponent);

執(zhí)行 updateParentComponent 函數(shù),輸出 hello, world,并且 text 的 Dep 收集該 Watcher 。

  • new Watcher(() => console.log("依賴", data.text));

執(zhí)行匿名函數(shù),輸出 依賴 hello, world ,并且 text 的 Dep 收集該 Watcher 。


  • data.text = "123"; 。

觸發(fā) text 的 set,依次執(zhí)行 Dep 中的 Watcher 。

先執(zhí)行 updateParentComponent 。

const updateComponent = () => {
if (show) {
console.log(data.text);
show = false;
}
};

由于之前已經(jīng)執(zhí)行過一次了,此時 show 就是 false 了,什么都不會輸出。

再執(zhí)行 () => console.log("依賴", data.text) ,輸出 依賴 hello, world。

是的,上邊是我們所期望的樣子,但事實上輸出結(jié)果如下:

出錯代碼 dep.js:37:26 如下:

調(diào)用 update 的時候是,遍歷過程中 subs[i] 變成了 undefined ,導(dǎo)致了報錯。

需要回憶下 Vue2剝絲抽繭-響應(yīng)式系統(tǒng)之分支切換 這篇文章里我們做了什么。

如果 Watcher 中的函數(shù)不再依賴當(dāng)前屬性,我們就把當(dāng)前 Watcher 從該屬性的 Dep 中移除。

而移除其實就是調(diào)用了數(shù)組的 splice 方法,直接將 Dep 中的 subs 數(shù)組元素進行刪除。

removeSub(sub) {
remove(this.subs, sub);
}

export function remove(arr, item) {
if (arr.length) {
const index = arr.indexOf(item);
if (index > -1) {
return arr.splice(index, 1);
}
}
}

而此時我們正在遍歷 subs 數(shù)組:

notify() {
for (let i = 0, l = this.subs.length; i < l; i++) {
this.subs[i].update();
}
}

對應(yīng)上邊的例子,原本 subs 數(shù)組兩個 Watcher,第一個 Watcher 執(zhí)行的時候沒有訪問 data.text 屬性,就要把這一個 Watcher 刪除了,第二個就移動到第一個的位置了,此時 for 循環(huán)中訪問第二個位置的 Watcher 因為被移到前邊自然就報錯了。

修改起來也很容易,我們只需要在循環(huán)前,將原有的 subs 數(shù)組保存給一個新的數(shù)組即可。

notify() {
// stabilize the subscriber list first
const subs = this.subs.slice();
for (let i = 0, l = subs.length; i < l; i++) {
subs[i].update();
}
}

總結(jié)

這篇文章比較簡單,主要就是循環(huán)通知 Watcher 之前把列表另存起來,防止遍歷過程中被修改。

責(zé)任編輯:武曉燕 來源: windliang
相關(guān)推薦

2022-03-29 09:59:58

響應(yīng)式系統(tǒng)Vue2

2022-04-06 07:28:47

數(shù)組響應(yīng)式系統(tǒng)

2022-04-02 09:56:41

Vue2響應(yīng)式系統(tǒng)

2022-04-14 08:46:46

響應(yīng)式系統(tǒng)js

2022-03-31 10:15:10

分支切換響應(yīng)式系統(tǒng)

2022-04-12 10:05:18

響應(yīng)式系統(tǒng)異步隊列

2022-04-10 11:04:40

響應(yīng)式系統(tǒng)setdelete

2022-08-31 08:09:35

Vue2AST模版

2024-03-07 12:54:06

數(shù)據(jù)分析師企業(yè)

2024-09-02 16:10:19

vue2前端

2023-03-02 11:51:00

數(shù)據(jù)分析師企業(yè)

2019-04-25 14:20:56

數(shù)據(jù)分析套路工具

2021-05-19 14:25:19

前端開發(fā)技術(shù)

2022-06-26 00:00:02

Vue3響應(yīng)式系統(tǒng)

2024-03-15 11:47:19

Vue2前端權(quán)限控制

2022-04-05 16:44:59

系統(tǒng)Vue.js響應(yīng)式

2023-11-19 18:53:27

Vue2MVVM

2016-10-19 20:47:55

vuevue-cli移動端

2020-09-25 07:40:39

技術(shù)開發(fā)選型

2020-06-09 11:35:30

Vue 3響應(yīng)式前端
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久一久| 久久久久久精 | 亚洲精品在线免费看 | 日韩在线视频一区 | 91精品国产91久久久久久吃药 | 毛片a级| 久久只有精品 | 一区二区三区视频在线观看 | 亚洲一二三区av | 国产亚洲欧美另类一区二区三区 | 91亚洲精品在线观看 | 欧美一区二区二区 | 日韩视频 中文字幕 | 天堂免费看片 | 国产精品视频一二三区 | 亚洲人成一区二区三区性色 | 一区二区免费在线 | 天堂一区在线观看 | 国产精品视频专区 | 久草新在线 | 日本精品一区二区三区视频 | 日韩欧美电影在线 | 精品国产精品三级精品av网址 | av免费成人 | 久久亚洲一区 | 中文字幕一区二区三区精彩视频 | 久久精品视频在线播放 | 国产91久久精品一区二区 | 美国a级毛片免费视频 | 精品久久久久久久 | 黄色网址在线免费观看 | 亚洲在线一区 | 欧美中文字幕一区 | 国产日韩欧美一区二区 | 国产精品久久精品 | 亚洲区一区二 | 国产福利在线 | 日本三级精品 | 久久久久久九九九九九九 | 亚洲国产精品福利 | 成人欧美一区二区三区在线播放 |