Vue发布订阅模式实现过程图解


Posted in Javascript onApril 30, 2020

vue项目中不同组件间通信一般使用vuex,通常情况下vuex和EventBus不应该混用,不过某些场景下不同组件间只有消息的交互,这时使用EventBus消息通知的方式就更合适一些。

图解

Vue发布订阅模式实现过程图解

Vue发布订阅模式实现过程图解

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

  // 数据响应化
  this.$data = options.data
  this.observe(this.$data)

  // 模拟一下watcher创建
  // 激活get 并将依赖添加到deps数组上
  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])
  })
 }

 // 数据响应化
 defineReactive(obj, key, val) {
  // 判断val内是否还可以继续调用(是否还有对象)
  this.observe(val) // 递归解决数据嵌套

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

  Object.defineProperty(obj, key, {
   get() {
    // 读取的时候 判断Dep.target是否有,如果有则调用addDep方法将Dep.target添加到deps数组上
    Dep.target && dep.addDep(Dep.target)
    return val
   },
   set(newVal) {
    if (newVal === val) {
     return;
    }
    val = newVal
    // console.log(`${key}属性更新了:${val}`)
    dep.notify() // 更新时候调用该方法
   }
  })
 }
}


// Dep: 用来管理Watcher
class Dep {
 constructor() {
  // 这里存放若干依赖(watcher) |一个watcher对应一个属性
  this.deps = [];
 }

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

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

// Watcher
class Watcher {
 constructor () {
  // 将当前watcher实例指定到Dep静态属性target上
  Dep.target = this  // 当前this就是Watcher对象
 }

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
Dec 20 Javascript
jquery实现类似淘宝星星评分功能有截图
Sep 15 Javascript
jQuery DOM删除节点操作指南
Mar 03 Javascript
jQuery封装的tab选项卡插件分享
Jun 16 Javascript
JS排序之冒泡排序详解
Apr 08 Javascript
vue filters的使用详解
Jun 11 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
js数据类型检测总结
Aug 05 Javascript
微信小程序3D轮播实现代码
Sep 19 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
Nov 01 Javascript
extjs4图表绘制之折线图实现方法分析
Mar 06 Javascript
解决vue自定义组件@click点击失效问题
Apr 30 Vue.js
Javascript异步执行不按顺序解决方案
Apr 30 #Javascript
JS判断浏览器类型与操作系统的方法分析
Apr 30 #Javascript
JavaScript自定义超时API代码实例
Apr 30 #Javascript
javascript 模块依赖管理的本质深入详解
Apr 30 #Javascript
JavaScript find()方法及返回数据实例
Apr 30 #Javascript
js this 绑定机制深入详解
Apr 30 #Javascript
JS 图片压缩原理与实现方法详解
Apr 29 #Javascript
You might like
一个查看session内容的函数
2006/10/09 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
[01:02:07]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
python sorted函数原理解析及练习
2020/02/10 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
yy结婚证婚词
2014/01/10 职场文书
秸秆管理实施方案
2014/03/15 职场文书
六五普法规划实施方案
2014/03/21 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
采购员岗位职责范本
2015/04/07 职场文书
2015年营销工作总结范文
2015/04/23 职场文书
党员反邪教心得体会
2016/01/15 职场文书
z-index不起作用
2021/03/31 HTML / CSS
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL
springboot实现string转json json里面带数组
2022/06/16 Java/Android