亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

vue實現雙向綁定和依賴收集遇到的坑

2024-05-06 16:47:26
字體:
來源:轉載
供稿:網友

在掘金上買了一個關于解讀vue源碼的小冊,因為是付費的,所以還比較放心

在小冊里看到了關于vue雙向綁定和依賴收集的部分,總感覺有些怪怪的,然后就自己跟著敲了一遍。 敲完后,發現完全無法運行,  坑啊,  寫書人完全沒有測試過。

然后自己完善代碼, 越寫越發現坑, 問題有些大。。。。。。

最后自己重新實現了一遍,代碼較多。 用到觀察訂閱者模式實現依賴收集, Object.defineProperty() 實現雙向綁定

/*  自己寫的代碼, 實現vue的雙向綁定和依賴收集  場景: 多個子組件用到父組件data中的數據, 當父組件data中的此數據發生改變時,   所有依賴它的 子組件全部更新  通常子組件的從父組件中拿取的數據不允許發生改變*/  //訂閱者 Dep  //一個訂閱者只管理一個數據  class Dep {    constructor () {      this.subs = []  //存放vue組件    }    addSubs (sub) {      this.subs.push(sub)      console.log('add watcher: ', sub._name)    }    notify () {      this.subs.forEach( sub => {  //通知vue組件更新        sub.update()      })    }  }  //監聽者  //一個vue實例包含一個Watcher實例  class Watcher {    // 在實例化Watcher時, 將Dep的target指向此實例, 在依賴收集中使用    // 因為依賴收集是在組件初始化時觸發的, 而數據變更后視圖相應變更是在初始化后    // 所以讓Dep.target指向此實例, 當此vue實例初始化完成后, 再指向下一個正在初始化的vue實例完成依賴收集    constructor (name) {      Dep.target = this      this._name = name    }    update () {      // 這里模擬視圖更新      // 其實還應該讓子組件的props相應值與父組件更新的數據同步      console.log("子組件視圖更新了..." + this._name)    }  }  //對data中的數據設置讀寫監聽, 并且創建訂閱者, 用于收集子組件的依賴和發布  function defineReactive (obj, key, value) {    // 對vue實例中data對象的每一個屬性都 設置一個訂閱者Dep    let dep = new Dep()    // 第二個vue實例的監聽 覆蓋了第一個vue實例的監聽, 因為引用的obj是同一個    Object.defineProperty(obj, key, {      configurable: true,      enumerable: true,      get () {        // 在讀此屬性時, 將當前 watcher 對象收集到此屬性的 dep 對象中      // 在實例化vue時將Dep.target指向當前Watcher      // get()依賴收集的時候是vue組件初始化的時候, set()是在初始化后        if (dep.subs.indexOf(Dep.target) === -1) {          dep.addSubs(Dep.target)        }        //return obj[key]   此寫法報錯 提示棧溢出 原因是無限調用get()        return value      },      set (newVal) {  // 此屬性改變時, 通知所有視圖更新        if (newVal !== value) {          value = newVal          dep.notify()          }      }    })  }  //接收一個對象作為參數, 將該對象的所有屬性調用defineReactive設置讀寫監聽  function observer (obj) {    if (!obj || (typeof obj !== 'object')) {      return     }    Object.keys(obj).forEach( key => {      defineReactive(obj, key, obj[key])    })   }  // 構造函數, 監聽 配置options中的data()方法返回的對象的所有屬性 的讀寫  class Vue {    constructor (options) {      this._name = options.name      this._data = options.data      // 每個vue組件都是一個vue實例, 在一個頁面中有多個vue實例      // 在初始化該vue實例時, new一個Watcher對象, 使Dep.target指向此實例      new Watcher(options.name)      // 給data中的數據掛載讀寫監聽      observer(this._data)      //模擬vue解析template過程, 獲取從父組件傳遞過來的props      //在這里進行依賴收集      this._props = options.props ? getProps() : {}      // 實例化該組件的子組件      this._children = options.render ? (options.render() || {}) : {}    }  }  // 父組件數據  let data = {    first: "hello",    second: 'world',    third: ['啦啦啦']  }  let times = 0  // 第一次調用返回的是第一個子組件的從父組件繼承的數據(vue中props屬性的值)  // 第二次調用返回的是第二個子組件的從父組件繼承的數據(vue中props屬性的值)  function getProps () {    times++    if (times == 1) {      let obj = {first: "", second: ""}      Object.keys(obj).forEach( key => {        // 如果是對象, 則進行深拷貝        // 這里使用到了父組件的數據, 觸發依賴收集        if (data[key] instanceof Object) {          obj[key] = JSON.parse(JSON.stringify(data[key]))        } else {          obj[key] = data[key]        }       })      return obj    } else if (times == 2) {      let obj = {first: "", third: ""}      Object.keys(obj).forEach( key => {        if (data[key] instanceof Object) {          obj[key] = JSON.parse(JSON.stringify(data[key]))        } else {          obj[key] = data[key]        }       })      return obj    }    }   let vue_root = new Vue({     name: 'vue_root',     data,     //模擬編譯template和實例化vue的過程      //在編譯父組件 并且傳遞參數給子組件時, 將子組件的 watcher 添加進父組件的 dep     render () {       let vue_1 = new Vue({         name: 'vue_1',         data: {},         props: true,         render () {}       })        let vue_2 = new Vue({         name: 'vue_2',         data: {},         props: true,         render () {}       })        return {         vue_1,         vue_2       }     }   })  console.log(vue_root)   vue_root._data.first = 'hello hello'  // vue_1 和 Vue_2 都依賴此數據, 都更新   vue_root._data.third = "aaa"      // 只有 vue_2 依賴到了此數據, 更新

總結

以上所述是小編給大家介紹的vue的雙向綁定和依賴收集遇到的坑,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一道本无吗dⅴd在线播放一区| 久久免费精品日本久久中文字幕| 亚洲国产欧美一区二区三区久久| 日韩欧美中文在线| 国产精品高潮呻吟久久av无限| 日韩av手机在线观看| 伊人伊成久久人综合网站| 在线播放国产精品| 亚洲日韩中文字幕在线播放| 欧美性20hd另类| 日韩av免费在线看| 国产精品精品久久久久久| 伦伦影院午夜日韩欧美限制| 中文字幕精品一区久久久久| 搡老女人一区二区三区视频tv| 亚洲精品一区二区三区婷婷月| 精品久久久久久久久久久久| 久久久免费精品视频| 51久久精品夜色国产麻豆| 欧美xxxx18国产| 日韩一区二区精品视频| 欧美日韩激情视频8区| 日韩有码在线视频| 亚洲一区亚洲二区亚洲三区| 国产午夜精品全部视频播放| 欧美大片大片在线播放| 亚洲精品久久久久| 欧美激情亚洲视频| 黄色成人在线播放| 欧美视频13p| 亚洲欧洲自拍偷拍| 日本电影亚洲天堂| 成人黄色生活片| 国产精品三级美女白浆呻吟| 欧美—级高清免费播放| 91色精品视频在线| 久久久久久国产精品久久| 人妖精品videosex性欧美| 97碰在线观看| 色偷偷噜噜噜亚洲男人的天堂| 91av视频导航| www.欧美三级电影.com| 欧美激情精品久久久久久大尺度| 91网站免费观看| 亚洲区bt下载| 亚洲国产成人爱av在线播放| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲欧美中文另类| 最新国产成人av网站网址麻豆| 精品国产依人香蕉在线精品| 久久久女人电视剧免费播放下载| 国产精品美女视频网站| 久久精视频免费在线久久完整在线看| 久久偷看各类女兵18女厕嘘嘘| 欧美老妇交乱视频| 久久综合88中文色鬼| 日韩激情视频在线| 欧美激情性做爰免费视频| 国产精品av在线| 欧美激情xxxxx| 欧美大片在线免费观看| 成人信息集中地欧美| 日韩国产精品一区| 亚洲精品videossex少妇| 国产成人精品视频在线观看| 亚洲精品乱码久久久久久金桔影视| 欧美在线激情视频| 色综合久久精品亚洲国产| 日韩精品在线视频观看| 欧洲成人免费aa| 亚洲免费av网址| 国产日韩中文在线| 欧美劲爆第一页| 日韩中文在线中文网三级| 亚洲最大av在线| 成人av番号网| 国产女精品视频网站免费| 亚洲欧美日韩视频一区| 97在线免费观看视频| 久久久噜久噜久久综合| 亚洲黄色www| 国产精品白丝jk喷水视频一区| 国产日韩在线看| 日本精品一区二区三区在线播放视频| 97久久久久久| 亚洲精品中文字幕有码专区| 欧美日韩日本国产| 96国产粉嫩美女| 亚洲最大中文字幕| 日日骚av一区| 国内精品中文字幕| 成人妇女免费播放久久久| 欧美激情精品久久久| 国产一区二区三区视频| 69国产精品成人在线播放| 日韩在线欧美在线国产在线| 亚洲欧美日韩一区在线| 亚洲色在线视频| 国产精选久久久久久| 伊人激情综合网| 久久精品视频在线| 成人写真视频福利网| 日韩视频亚洲视频| 国产午夜一区二区| 亚洲精品一区二区在线| 久久久99免费视频| 国产精品第一页在线| 97免费在线视频| 亚洲专区在线视频| 国产精品一久久香蕉国产线看观看| 国产精品久久久久久久久久久久| 高清在线视频日韩欧美| 国产精品美女无圣光视频| 国产成人一区二区| 91精品视频在线播放| 日韩欧美大尺度| 国产91精品青草社区| 国产精品极品尤物在线观看| 亚洲欧美日韩国产成人| 91视频88av| 91精品国产91久久久久| 亚洲国产精品99| 最近2019中文字幕一页二页| 欧美日在线观看| 欧美激情小视频| 日韩精品亚洲视频| 亚洲人成在线观看| 国产精品日韩欧美大师| 久久精品91久久香蕉加勒比| 日韩精品黄色网| 丰满岳妇乱一区二区三区| 国产狼人综合免费视频| 91美女片黄在线观看游戏| 欧美在线观看网站| 久久精品亚洲94久久精品| 午夜精品久久久久久99热| 欧美贵妇videos办公室| 91精品综合久久久久久五月天| 日韩欧美中文第一页| 亚洲天堂色网站| 1769国产精品| 九九热视频这里只有精品| 国产精品欧美在线| 国产美女高潮久久白浆| 国产精品视频播放| 中文欧美日本在线资源| 亚洲国产精品久久久久秋霞不卡| 国产区亚洲区欧美区| 国产一区二区三区在线播放免费观看| 久久这里有精品视频| 亚洲a一级视频| 91久久国产综合久久91精品网站| 在线观看国产成人av片| 最近2019中文字幕第三页视频| 亚洲欧美另类在线观看| 日韩一区二区精品视频| 成人看片人aa| 国产极品jizzhd欧美| 久久久国产精品免费| 欧美日韩国产中文精品字幕自在自线| 深夜成人在线观看| 91欧美视频网站| 成人激情视频在线| 日韩电影网在线|