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 相关文章推荐
Ext 表单布局实例代码
Apr 30 Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 Javascript
JQUERY设置IFRAME的SRC值的代码
Nov 30 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
Feb 18 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
Mar 10 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
Aug 14 Javascript
js+html+css实现鼠标移动div实例
Jan 30 Javascript
模块化react-router配置方法详解
Jun 03 Javascript
js实现固定区域内的不重叠随机圆
Oct 24 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
Oct 30 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
Nov 01 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
Jun 04 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 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
有关php运算符的知识大全
2011/11/03 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
PHP中的类型约束介绍
2015/05/11 PHP
thinkPHP内置字符串截取函数用法详解
2016/11/15 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
python任务调度实例分析
2015/05/19 Python
Python性能提升之延迟初始化
2016/12/04 Python
Python元组及文件核心对象类型详解
2018/02/11 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
python读写配置文件操作示例
2019/07/03 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
大专生简历的自我评价
2013/11/26 职场文书
高中毕业自我鉴定
2013/12/19 职场文书
技术比武方案
2014/05/19 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
2014年大堂经理工作总结
2014/11/21 职场文书
对讲机的最大通讯距离是多少
2022/02/18 无线电