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 相关文章推荐
jquery iframe操作详细解析
Nov 20 Javascript
特殊日期提示功能的实现方法
Jun 16 Javascript
jQuery异步提交表单的两种方式
Sep 13 Javascript
JavaScript实现自动跳转文本功能
May 25 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
Jun 12 jQuery
AngularJS使用ng-repeat遍历二维数组元素的方法详解
Nov 11 Javascript
Vue实现用户自定义字段显示数据的方法
Aug 28 Javascript
vue打包相关细节整理(小结)
Sep 28 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
Sep 23 Javascript
简单使用webpack打包文件的实现
Oct 29 Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 Javascript
用Golang运行JavaScript的实现示例
Nov 25 Javascript
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
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
Web前端开发工具——bower依赖包管理工具
2016/03/29 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
使用Vue生成动态表单
2019/11/26 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
[55:45]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第一局
2016/02/28 DOTA
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
Python读写Json涉及到中文的处理方法
2016/09/12 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
python实现二叉树的遍历
2017/12/11 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
python中单例常用的几种实现方法总结
2018/10/13 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
本科生求职简历的自我评价
2013/10/21 职场文书
环境卫生标语
2014/06/09 职场文书
2014最新实习证明模板
2014/10/02 职场文书
2015年消防工作总结
2015/04/24 职场文书
Python基础知识学习之类的继承
2021/05/31 Python