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类定义原型方法的两种实现的区别评论很多
Sep 12 Javascript
JavaScript中json对象和string对象之间相互转化
Dec 26 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
Jun 06 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
Nov 17 Javascript
AngularJs IE Compatibility 兼容老版本IE
Sep 01 Javascript
js前端实现图片懒加载(lazyload)的两种方式
Apr 24 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
Sep 30 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
Jan 22 jQuery
微信小程序实现运动步数排行功能(可删除)
Jul 05 Javascript
jQuery实现的导航条点击后高亮显示功能示例
Mar 04 jQuery
jQuery设置下拉框显示与隐藏效果的方法分析
Sep 15 jQuery
解决vue项目打包上服务器显示404错误,本地没出错的问题
Nov 03 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
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
浅谈javascript的数据类型检测
2010/07/10 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
微信小程序获取用户信息并保存登录状态详解
2019/05/10 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
python self,cls,decorator的理解
2009/07/13 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
用 Python 制作地球仪的方法
2020/04/24 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
小学音乐教学反思
2014/02/05 职场文书
商务英语求职信范文
2015/03/19 职场文书
2015年机关党建工作总结
2015/05/22 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
学术会议开幕词
2016/03/03 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
2019感恩宣传标语!
2019/07/05 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
Django如何与Ajax交互
2021/04/29 Python
浅谈Redis中的RDB快照
2021/06/29 Redis
Nginx禁止ip访问或非法域名访问
2022/04/07 Servers