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 相关文章推荐
JavaScript isArray()函数判断对象类型的种种方法
Oct 11 Javascript
深入理解Javascript闭包 新手版
Dec 28 Javascript
javascript学习笔记(七) js函数介绍
Jun 19 Javascript
仿新浪微博登陆邮箱提示效果的js代码
Aug 02 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
Jan 31 Javascript
jquery使用jxl插件导出excel示例
Apr 14 Javascript
浅谈javascript中的闭包
May 13 Javascript
JS绘制生成花瓣效果的方法
Aug 05 Javascript
Backbone.js框架中简单的View视图编写学习笔记
Feb 14 Javascript
JQuery事件冒泡和默认行为代码实例
May 13 jQuery
详解vue中v-on事件监听指令的基本用法
Jul 22 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 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 编程的 5个良好习惯
2009/02/20 PHP
一个PHP的String类代码
2010/04/20 PHP
PHP之COOKIE支持详解
2010/09/20 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
jquery 删除cookie失效的解决方法
2013/11/12 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
详解如何从零开始搭建Express+Vue开发环境
2018/07/17 Javascript
微信小程序签到功能
2018/10/31 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
python实现将excel文件转化成CSV格式
2018/03/22 Python
python3.4实现邮件发送功能
2018/05/28 Python
对python中的装包与解包实例详解
2019/08/24 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
Python直接赋值及深浅拷贝原理详解
2020/09/05 Python
Python基于template实现字符串替换
2020/11/27 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
医学生毕业自我鉴定
2014/03/26 职场文书
苏州园林导游词
2015/02/03 职场文书
建立共青团委员会的请示
2019/04/02 职场文书
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android