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

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

 更新時(shí)間:2022年04月12日 20:10:18   作者:windliang  
這篇文章主要介紹了Vue響應(yīng)式系統(tǒng)之嵌套,我們?cè)陂_(kāi)發(fā)中肯定存在組件嵌套組件的情況,下文將舉例說(shuō)明情況,需要的小伙伴可以參考一下

1、場(chǎng)景

在 開(kāi)發(fā)中肯定存在組件嵌套組件的情況,類似于下邊的樣子。Vue

<!-- parent-component -->
<div>
  <my-component :text="inner"></my-component>
  {{ text }}
<div>

<!-- my-component-->
<div>{{ text }}</div>

回到我們之前的響應(yīng)式系統(tǒng),模擬一下上邊的情況:

import { observe } from "./reactive";
import Watcher from "./watcher";
const data = {
    text: "hello, world",
    inner: "內(nèi)部",
};
observe(data);

const updateMyComponent = () => {
    console.log("子組件收到:", data.inner);
};

const updateParentComponent = () => {
    new Watcher(updateMyComponent);
    console.log("父組件收到:", data.text);
};

new Watcher(updateParentComponent);

data.text = "hello, liang";

可以先 分鐘考慮一下上邊輸出什么?1

首先回憶一下 會(huì)做什么操作。new Watcher

第一步是保存當(dāng)前函數(shù),然后執(zhí)行當(dāng)前函數(shù)前將全局的 賦值為當(dāng)前 對(duì)象。Dep.targetWatcher

image-20220402083845476

接下來(lái)執(zhí)行 函數(shù)的時(shí)候,如果讀取了相應(yīng)的屬性就會(huì)觸發(fā) ,從而將當(dāng)前 收集到該屬性的 中。gettergetWatcherDep

image-20220402083943606

2、執(zhí)行過(guò)程

import { observe } from "./reactive";
import Watcher from "./watcher";
const data = {
    text: "hello, world",
    inner: "內(nèi)部",
};
observe(data);

const updateMyComponent = () => {
    console.log("子組件收到:", data.inner);
};

const updateParentComponent = () => {
    new Watcher(updateMyComponent);
    console.log("父組件收到:", data.text);
};

new Watcher(updateParentComponent);

data.text = "hello, liang";

我們?cè)僖徊揭徊嚼砬逡幌拢?/strong>

  • new Watcher(updateParentComponent);

將 賦值為保存了 函數(shù)的 。Dep.targetupdateParentComponentWatcher

接下來(lái)執(zhí)行 函數(shù)。updateParentComponent

  • new Watcher(updateMyComponent);

將 賦值為保存了 函數(shù)的 。Dep.targetupdateMyComponentWatcher

接下來(lái)執(zhí)行 函數(shù)。updateMyComponent

const updateMyComponent = () => {
    console.log("子組件收到:", data.inner);
};

// 讀取了 inner 變量。
// data.inner 的 Dep 收集當(dāng)前 Watcher(保存了 `updateMyComponent` 函數(shù))
const updateParentComponent = () => {
    new Watcher(updateMyComponent);
    console.log("父組件收到:", data.text);
};
// 讀取了 text 變量。
// data.text 的 Dep 收集當(dāng)前 Watcher (保存了 `updateMyComponent` 函數(shù))

data.text = "hello, liang";

觸發(fā) 的 函數(shù),執(zhí)行它依賴的 ,而此時(shí)是 函數(shù)。textsetWatcherupdateMyComponent

所以上邊代碼最終輸出的結(jié)果是:

子組件收到: 內(nèi)部  // new Watcher(updateMyComponent); 時(shí)候輸出
父組件收到: hello, world // new Watcher(updateParentComponent); 時(shí)候輸出
子組件收到: 內(nèi)部 // data.text = "hello, liang"; 輸出

然而子組件并不依賴 ,依賴 的父組件反而沒(méi)有執(zhí)行。data.textdata.text

3、修復(fù)

上邊的問(wèn)題出在我們保存當(dāng)前正在執(zhí)行 時(shí)候使用的是單個(gè)變量 。WatcherDep.target = null; // 靜態(tài)變量,全局唯一

回憶一下學(xué)習(xí) 語(yǔ)言或者匯編語(yǔ)言的時(shí)候?qū)瘮?shù)參數(shù)的處理:C

function b(p) {
    console.log(p);
}

function a(p) {
    b("child");
    console.log(p);
}

a("parent");

當(dāng)函數(shù)發(fā)生嵌套調(diào)用的時(shí)候,執(zhí)行 函數(shù)的時(shí)候我們會(huì)先將參數(shù)壓入棧中,然后執(zhí)行 函數(shù),同樣將參數(shù)壓入棧中, 函數(shù)執(zhí)行完畢就將參數(shù)出棧。此時(shí)回到 函數(shù)就能正確取到 參數(shù)的值了。abbap

對(duì)應(yīng)于 的收集,我們同樣可以使用一個(gè)棧來(lái)保存,執(zhí)行函數(shù)前將 壓入棧,執(zhí)行函數(shù)完畢后將 彈出棧即可。其中, 始終指向棧頂 ,代表當(dāng)前正在執(zhí)行的函數(shù)。WatcherWatcherWatcherDep.targetWatcher

回到 代碼中,我們提供一個(gè)壓棧和出棧的方法。Dep

import { remove } from "./util";

let uid = 0;

export default class Dep {
    ... 省略
}
Dep.target = null; // 靜態(tài)變量,全局唯一

// The current target watcher being evaluated.
// This is globally unique because only one watcher
// can be evaluated at a time.
const targetStack = [];

export function pushTarget(target) {
    targetStack.push(target);
    Dep.target = target;
}

export function popTarget() {
    targetStack.pop();
    Dep.target = targetStack[targetStack.length - 1]; // 賦值為棧頂元素
}

然后 中,執(zhí)行函數(shù)之前進(jìn)行入棧,執(zhí)行后進(jìn)行出棧。Watcher

import { pushTarget, popTarget } from "./dep";
export default class Watcher {
    constructor(Fn) {
        this.getter = Fn;
        this.depIds = new Set(); // 擁有 has 函數(shù)可以判斷是否存在某個(gè) id
        this.deps = [];
        this.newDeps = []; // 記錄新一次的依賴
        this.newDepIds = new Set();
        this.get();
    }

    /**
     * Evaluate the getter, and re-collect dependencies.
     */
    get() {
      /************修改的地方*******************************/
        pushTarget(this); // 保存包裝了當(dāng)前正在執(zhí)行的函數(shù)的 Watcher
       /*******************************************/
        let value;
        try {
            value = this.getter.call();
        } catch (e) {
            throw e;
        } finally {
          /************修改的地方*******************************/
            popTarget();
          /*******************************************/
            this.cleanupDeps();
        }
        return value;
    }
   ...
}

4、測(cè)試

回到開(kāi)頭的場(chǎng)景,再來(lái)執(zhí)行一下:

import { observe } from "./reactive";
import Watcher from "./watcher";
const data = {
    text: "hello, world",
    inner: "內(nèi)部",
};
observe(data);

const updateMyComponent = () => {
    console.log("子組件收到:", data.inner);
};

const updateParentComponent = () => {
    new Watcher(updateMyComponent);
    console.log("父組件收到:", data.text);
};

new Watcher(updateParentComponent);

data.text = "hello, liang";

執(zhí)行 的時(shí)候?qū)?nbsp;入棧。new Watcher(updateParentComponent);Watcher

image-20220402093847759

進(jìn)入 函數(shù),執(zhí)行 的時(shí)候?qū)?nbsp;入棧。updateParentComponentnew Watcher(updateMyComponent);Watcher

image-20220402093937896

執(zhí)行 函數(shù), 收集當(dāng)前 ,執(zhí)行完畢后 出棧。updateMyComponentdata.innerDep.targetWatcher

image-20220402093847759

繼續(xù)執(zhí)行 函數(shù), 收集當(dāng)前 。updateParentComponentdata.textDep.target

此時(shí)依賴就變得正常了, 會(huì)觸發(fā) 函數(shù),從而輸出如下:data.textupdateParentComponent

子組件收到: 內(nèi)部
父組件收到: hello, world
子組件收到: 內(nèi)部
父組件收到: hello, liang

5、總結(jié)

今天這個(gè)相對(duì)好理解一些,通過(guò)棧解決了嵌套調(diào)用的情況。

到此這篇關(guān)于Vue2響應(yīng)式系統(tǒng)之嵌套的文章就介紹到這了,更多相關(guān)Vue2 嵌套內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue項(xiàng)目中使用scss詳細(xì)方法步驟

    vue項(xiàng)目中使用scss詳細(xì)方法步驟

    這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目中使用scss的詳細(xì)方法步驟,scss是一種css預(yù)處理語(yǔ)言,定義了一種新的專門的編程語(yǔ)言,編譯后形成正常的css文件,為css增加一些編程特性,無(wú)需考慮瀏覽器的兼容性,讓css更加簡(jiǎn)潔、適應(yīng)性更強(qiáng),可讀性更佳,需要的朋友可以參考下
    2023-11-11
  • 淺談Vue.js中ref ($refs)用法舉例總結(jié)

    淺談Vue.js中ref ($refs)用法舉例總結(jié)

    本篇文章主要介紹了淺談Vue.js中ref ($refs)用法舉例總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • vue實(shí)現(xiàn)簡(jiǎn)單的購(gòu)物車小案例

    vue實(shí)現(xiàn)簡(jiǎn)單的購(gòu)物車小案例

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)簡(jiǎn)單的購(gòu)物車小案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • vue項(xiàng)目keepAlive配合vuex動(dòng)態(tài)設(shè)置路由緩存方式

    vue項(xiàng)目keepAlive配合vuex動(dòng)態(tài)設(shè)置路由緩存方式

    vue項(xiàng)目keepAlive配合vuex動(dòng)態(tài)設(shè)置路由緩存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue中watch和computed的區(qū)別詳解

    vue中watch和computed的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于vue中watch和computed區(qū)別的相關(guān)資料,computed和watch都是vue框架中的用于監(jiān)聽(tīng)數(shù)據(jù)變化的屬性,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • vue表格(table)計(jì)算總計(jì)方式

    vue表格(table)計(jì)算總計(jì)方式

    這篇文章主要介紹了vue表格(table)計(jì)算總計(jì)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Vue 401配合Vuex防止多次彈框的案例

    Vue 401配合Vuex防止多次彈框的案例

    這篇文章主要介紹了Vue 401配合Vuex防止多次彈框的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • element前端實(shí)現(xiàn)壓縮圖片的功能

    element前端實(shí)現(xiàn)壓縮圖片的功能

    本文主要介紹了element前端實(shí)現(xiàn)壓縮圖片的功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 如何使用 Vue Router 的 meta 屬性實(shí)現(xiàn)多種功能

    如何使用 Vue Router 的 meta 屬性實(shí)現(xiàn)多種功能

    在Vue.js中,Vue Router 提供了強(qiáng)大的路由管理功能,通過(guò)meta屬性,我們可以在路由定義中添加自定義元數(shù)據(jù),以實(shí)現(xiàn)訪問(wèn)控制、頁(yè)面標(biāo)題設(shè)置、角色權(quán)限管理、頁(yè)面過(guò)渡效果,本文將總結(jié)如何使用 meta 屬性來(lái)實(shí)現(xiàn)這些常見(jiàn)的功能,感興趣的朋友一起看看吧
    2024-06-06
  • 利用Dectorator分模塊存儲(chǔ)Vuex狀態(tài)的實(shí)現(xiàn)

    利用Dectorator分模塊存儲(chǔ)Vuex狀態(tài)的實(shí)現(xiàn)

    這篇文章主要介紹了利用Dectorator分模塊存儲(chǔ)Vuex狀態(tài)的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02

最新評(píng)論

东城区| 万全县| 洛宁县| 铜山县| 册亨县| 金门县| 防城港市| 五大连池市| 祁连县| 诏安县| 淮安市| 娄底市| 灵丘县| 方城县| 遵义市| 石渠县| 安龙县| 新化县| 抚远县| 金山区| 奇台县| 安多县| 富宁县| 井研县| 阳山县| 宜章县| 普宁市| 顺义区| 历史| 祁连县| 乐清市| 嘉荫县| 铁岭市| 杂多县| 建宁县| 苏尼特左旗| 启东市| 岳阳县| 农安县| 黄平县| 新竹县|