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 相关文章推荐
js面向对象设计用{}好还是function(){}好(构造函数)
Oct 23 Javascript
js实现倒计时(距离结束还有)示例代码
Jul 24 Javascript
动态创建script标签实现跨域资源访问的方法介绍
Feb 28 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
Jul 27 Javascript
javascript:void(0)是什么意思及href=#与href=javascriptvoid(0)的区别
Nov 13 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
May 25 Javascript
Node.js连接mongodb实例代码
Jun 06 Javascript
前端把html表格生成为excel表格的实例
Sep 19 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
Feb 26 Javascript
JS实现的JSON序列化操作简单示例
Jul 02 Javascript
JS二级菜单不同实现方法分析【4种方法】
Dec 21 Javascript
Typescript3.9 常用新特性一览(推荐)
May 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的“It is not safe to rely on the system’s timezone settings”问题
2015/10/08 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
非主流的textarea自增长实现js代码
2011/12/20 Javascript
JS在可编辑的div中的光标位置插入内容的方法
2014/11/20 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
跟老齐学Python之关于类的初步认识
2014/10/11 Python
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
为Python的web框架编写前端模版的教程
2015/04/30 Python
Pandas 同元素多列去重的实例
2018/07/03 Python
Python使用combinations实现排列组合的方法
2018/11/13 Python
python如何建立全零数组
2020/07/19 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
python lambda的使用详解
2021/02/26 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
送给他或她的礼物:FUN.com
2018/08/17 全球购物
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
物业管理专业个人的自我评价
2013/11/19 职场文书
化学教师自荐信范文
2013/12/28 职场文书
群众路线党课主持词
2014/04/01 职场文书
安全协议书
2014/04/23 职场文书
团日活动总结书
2014/05/08 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
师德标兵事迹材料
2014/12/19 职场文书
旅游项目合作意向书
2015/05/08 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
Go遍历struct,map,slice的实现
2021/06/13 Golang