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

Vue發(fā)布訂閱模式實現(xiàn)過程圖解

 更新時間:2020年04月30日 09:59:46   作者:林中有風(fēng)  
這篇文章主要介紹了Vue發(fā)布訂閱模式實現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

vue項目中不同組件間通信一般使用vuex,通常情況下vuex和EventBus不應(yīng)該混用,不過某些場景下不同組件間只有消息的交互,這時使用EventBus消息通知的方式就更合適一些。

圖解

html

<body>
 <script src="./Dvue.js"></script>
 <script>
  const app = new DVue({
   data: {
    test: "I am test",
    foo: {
     bar: "bar"
    }
   }
  })

  app.$data.test = "hello world!"
  // app.$data.foo.bar = "hello!"
 </script>
</body>

Dvue.js

class DVue {
 constructor(options) {
  this.$options = options

  // 數(shù)據(jù)響應(yīng)化
  this.$data = options.data
  this.observe(this.$data)

  // 模擬一下watcher創(chuàng)建
  // 激活get 并將依賴添加到deps數(shù)組上
  new Watcher()
  this.$data.test
  new Watcher()
  this.$data.foo.bar
 }

 observe(value) {
  // 判斷value是否是對象  
  if (!value || typeof value !== 'object') {
   return
  }
  
  // 遍歷該對象
  Object.keys(value).forEach(key => {
   this.defineReactive(value, key, value[key])
  })
 }

 // 數(shù)據(jù)響應(yīng)化
 defineReactive(obj, key, val) {
  // 判斷val內(nèi)是否還可以繼續(xù)調(diào)用(是否還有對象)
  this.observe(val) // 遞歸解決數(shù)據(jù)嵌套

  // 初始化dep
  const dep = new Dep()

  Object.defineProperty(obj, key, {
   get() {
    // 讀取的時候 判斷Dep.target是否有,如果有則調(diào)用addDep方法將Dep.target添加到deps數(shù)組上
    Dep.target && dep.addDep(Dep.target)
    return val
   },
   set(newVal) {
    if (newVal === val) {
     return;
    }
    val = newVal
    // console.log(`${key}屬性更新了:${val}`)
    dep.notify() // 更新時候調(diào)用該方法
   }
  })
 }
}


// Dep: 用來管理Watcher
class Dep {
 constructor() {
  // 這里存放若干依賴(watcher) |一個watcher對應(yīng)一個屬性
  this.deps = [];
 }

 // 添加依賴
 addDep (dep) {
  this.deps.push(dep)
 }

 // 通知方法
 notify() {
  this.deps.forEach(dep => dep.update())
 }
}

// Watcher
class Watcher {
 constructor () {
  // 將當(dāng)前watcher實例指定到Dep靜態(tài)屬性target上
  Dep.target = this  // 當(dāng)前this就是Watcher對象
 }

 update() {
  console.log('屬性更新了')
 }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

平江县| 晋江市| 南涧| 彰武县| 嘉定区| 志丹县| 正宁县| 晋中市| 临猗县| 合江县| 辛集市| 博湖县| 寿宁县| 化德县| 乌海市| 镇雄县| 丰台区| 武乡县| 嘉荫县| 黄浦区| 朝阳区| 元氏县| 山西省| 临桂县| 临沧市| 鄯善县| 自治县| 万宁市| 横山县| 儋州市| 兴和县| 普宁市| 开江县| 渭源县| 石景山区| 清苑县| 梁平县| 马山县| 江城| 榆中县| 兰西县|