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如何生成xmlhttp
Dec 16 Javascript
js数组中如何随机取出一个值
Jun 13 Javascript
jquery的attr方法禁用表单元素禁用输入内容
Jun 23 Javascript
理解javascript闭包
Dec 15 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
Jan 25 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
浅谈JavaScript中数组的增删改查
Jun 20 Javascript
js利用clipboardData实现截屏粘贴功能
Oct 12 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
May 07 Javascript
微信小程序之分享页面如何返回首页的示例
Mar 28 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
Oct 19 Javascript
JS中准确判断变量类型的方法
Jun 01 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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
DOTA2游戏同人动画《龙之血》导演接受采访
2021/03/05 欧美动漫
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
PHP实现的策略模式简单示例
2017/08/25 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
jQuery 一个图片切换的插件
2011/10/09 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
javascript中Date对象的使用总结
2016/11/21 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
2017/04/07 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
详谈表单格式化插件jquery.serializeJSON
2017/06/23 jQuery
js实现盒子拖拽动画效果
2020/08/09 Javascript
Python之eval()函数危险性浅析
2014/07/03 Python
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
Python 性能优化技巧总结
2016/11/01 Python
python3实现基于用户的协同过滤
2018/05/31 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
jupyter notebook运行命令显示[*](解决办法)
2020/05/18 Python
数控专业毕业生求职信范文
2013/09/21 职场文书
土地转让协议书
2014/04/15 职场文书
五一劳动节演讲稿
2014/09/12 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
新年晚会开场白
2015/05/29 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js