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

實現(xiàn)一個簡單得數(shù)據(jù)響應系統(tǒng)

 更新時間:2021年11月08日 10:49:08   作者:zz  
這篇文章主要介紹了實現(xiàn)一個簡單得數(shù)據(jù)響應系統(tǒng),文章介紹的數(shù)據(jù)響應系統(tǒng)會用到Dep,其實,這就是一個依賴收集的容器, depend 收集依賴, notify 觸發(fā)依賴,下面來看看詳細的內(nèi)容結介紹,需要的朋友可以參考一下

1、Dep

其實,這就是一個依賴收集的容器, depend 收集依賴, notify 觸發(fā)依賴

class Dep{
  constructor() {
    this._subs = [];
  }
  depend () {
    this._subs.push(Dep.target)
  }
  notify() {
    this._subs.forEach(item => {
      item.fn();
    })
  }
}

// 其實就是 dep 和 watcher 基情滿滿的開始,watcher 中用到
// 通過一個全局屬性來存 watcher
Dep.target = null;

function pushTarget(watch) {
  Dep.target = watch;
}

function popTarget() {
  Dep.target = null;
}

2、了解 obverser

遞歸,將 data 對象所有屬性轉化為訪問器屬性

// 轉為訪問器屬性
function defineReactive (obj, key, val, shallow) {

  // 創(chuàng)建一個依賴收集容器
  let dep = new Dep();
  let childOb = !shallow && observe(val)

  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get: function reactiveGetter () {
      if(Dep.target) {
        // 收集依賴
        dep.depend();
      }
      return val;
      // ...
    },
    set: function reactiveSetter (newVal) {
      if(newVal === val) return;
      // 繼續(xù)遞歸遍歷
      observe(newVal);
      // 觸發(fā)依賴
      dep.notify();
      // ...
    }
  })
}

class Observer{
  constructor(data) {
    this.walk(data);
  }

  walk(data) {
    const keys = Object.keys(data)
    for (let i = 0; i < keys.length; i++) {
      defineReactive(data, keys[i], data[keys[i]])
    }
  }
}

// 遞歸,將 data 對象所有屬性轉化為訪問器屬性
function observe (data) {
  if(Object.prototype.toString.call(data) !== '[object Object]') return;
  new Observer(data);
}

此時就可以把任意一個對象的全部屬性轉為訪問器

3、了解 watch 和 observer

const data = {
  a: 1,
  b: 2
}

// 首先監(jiān)控一個對象
observe(data);

watcher 的主要功能是檢測某個屬性,當屬性變化時觸發(fā)一個回調(diào)

class Watcher{
  /**
  * @params {Function} exp 一個屬性表達式
  * @params {Function} fn 回調(diào)
  */
  constructor(exp, fn) {
    this.exp = exp;
    this.fn = fn;

    // 存 watcher
    // Dep.target = this;
    pushTarget(this);

    // 先執(zhí)行一次表達式函數(shù),會在調(diào)用過程中,
    // 觸發(fā)到 data.a 的訪問器, data.a 的 get 被執(zhí)行,
    // 觸發(fā) dep.depend() 開始收集依賴
    this.exp();

    // 釋放 Dep.target
    popTarget();
  }
}

// new Watcher 這樣一個依賴就被收集了
new Watcher(() => {
  return data.a + data.b;
}, () => {
  console.log('change')
})

4、觸發(fā)依賴

data.a = 3; // change
data.b = 3; // change

5、總結一下流程

  • 把一個對象的全部屬性轉化為訪問器
  • 當為某一個屬性增加 watcher 時,會觸發(fā)改屬性的 getget 函數(shù)中會把該 watcher 存到該屬性的 dep 依賴容器中
  • 當這個屬性發(fā)生變化時,會出發(fā)改屬性的 set 的方法,set 函數(shù)中會把 dep 存的依賴都執(zhí)行

到此這篇關于實現(xiàn)一個簡單得數(shù)據(jù)響應系統(tǒng)的文章就介紹到這了,更多相關數(shù)據(jù)響應系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 5個實用的JavaScript新特性

    5個實用的JavaScript新特性

    這篇文章主要為大家介紹了5個實用的JavaScript新特性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 微信小程序點擊控件修改樣式實例詳解

    微信小程序點擊控件修改樣式實例詳解

    這篇文章主要介紹了 微信小程序點擊控件修改樣式實例詳解的相關資料,需要的朋友可以參考下
    2017-07-07
  • Javascript基礎知識中關于內(nèi)置對象的知識

    Javascript基礎知識中關于內(nèi)置對象的知識

    這篇文章主要介紹了Javascript基礎知識中關于內(nèi)置對象的相關知識的相關資料,需要的朋友可以參考下面小編薇大家?guī)淼木饰恼?/div> 2021-09-09
  • js c++ vue方法與數(shù)據(jù)交互通信示例

    js c++ vue方法與數(shù)據(jù)交互通信示例

    這篇文章主要為大家介紹了js c++ vue方法與數(shù)據(jù)交互通信示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • delete?語法的本質(zhì)深入解析

    delete?語法的本質(zhì)深入解析

    這篇文章主要為大家介紹了delete?語法的本質(zhì)深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 微信小程序 Image API實例詳解

    微信小程序 Image API實例詳解

    這篇文章主要介紹了微信小程序 Image API實例詳解的相關資料,需要的朋友可以參考下
    2016-09-09
  • JS高級程序設計之class繼承重點詳解

    JS高級程序設計之class繼承重點詳解

    這篇文章主要為大家介紹了JS高級程序設計之class繼承重點示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • git?hooks的作用及創(chuàng)建使用示例詳解

    git?hooks的作用及創(chuàng)建使用示例詳解

    這篇文章主要為大家介紹了git?hooks的作用及創(chuàng)建使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • vue axios請求超時的正確處理方法

    vue axios請求超時的正確處理方法

    這篇文章主要介紹了vue axios請求超時,設置重新請求的完美解決方法,一并給大家介紹了axios基本用法,需要的朋友可以參考下
    2018-04-04
  • 微信小程序 生命周期詳解

    微信小程序 生命周期詳解

    這篇文章主要介紹了微信小程序 生命周期的相關資料,創(chuàng)建、到開始、暫停、喚起、停止、卸載等過程,需要的朋友可以參考下
    2016-10-10

最新評論

姜堰市| 鲁山县| 万年县| 和平区| 东光县| 新干县| 大方县| 南漳县| 徐汇区| 吐鲁番市| 宝应县| 邯郸市| 慈利县| 乌审旗| 蒲江县| 诸暨市| 府谷县| 宁陵县| 鄯善县| 黄冈市| 大埔区| 福建省| 左贡县| 平原县| 麟游县| 赤峰市| 三门峡市| 福安市| 延长县| 巢湖市| 古蔺县| 东乌| 德清县| 安顺市| 台南市| 阜阳市| 高密市| 桐梓县| 锦州市| 镇江市| 安义县|