Vue2 消息订阅与发布

1.pubsub-js 第三方库实现

实现任何框架的消息订阅发布

npm i pubsub-js

<template>
  <div class="student">
    <h2>展示学生的名称:{
  
  { name }}</h2>
    <h2>展示学生的性别:{
  
  { sex }}</h2>
  </div>
</template>

<script>
import pubsub from "pubsub-js";

export default {
  name: "MyStudentt",
  data() {
    //这里存放数据
    return {
      name: "我是一个人",
      sex: 12,
    };
  },
  mounted() {
    // console.log(this.$refs.school1.__proto__===this.$refs.school2.__proto__);//true
    //   this.$bus.$on("show", (data)=>{
    //     console.log('事件总线收到了数据',data); 两个都生效
    //     this.name = data;
    //   });
    //  this.$bus.$on("show", (data)=>{
    //     console.log('事件总线收到了数据1',data);
    //     this.sex = data;
    //   });
    //订阅一个消息 show 是一个主题
   const pubId =  pubsub.subscribe("show", (msg, data) => {
      //消费者
      console.log("有人发布了消息,show消息回调成功", data);
      this.name = data;
    });

   this.pubId = pubId;
    //   pubsub.subscribe('show',(msg,data)=>{//消费者
    //   console.log('有人发布了消息,show消息回调成功',data);
    //   this.sex = data;
    // })
  },
  beforeDestroy() {
    // this.$bus.$off("show");

    pubsub.unsubscribe(this.pubId);
### Vue 2 发布订阅模式的实现用法 在 Vue 2 的响应式系统中,发布订阅模式通过 `Dep`(依赖收集器)和 `Watcher`(观察者)来实现。以下是详细的说明以及一个简单的示例。 #### 核心概念 1. **Observer**: 负责将数据转换为响应式对象,并监听其变化。 2. **Dep**: 是事件中心的角色,负责管理所有的订阅者(Watchers),并在数据发生变化时通知这些订阅者。 3. **Watcher**: 当被观测的数据发生改变时,它会收到通知并执行相应的回调函数以更新视图[^2]。 #### 实现细节 Vue 2 使用了基于 ES5 的 `Object.defineProperty()` 方法来劫持 JavaScript 对象的 getter 和 setter,从而实现了对数据的访问和修改操作的拦截。每当某个属性被读取或设置时,都会触发对应的逻辑: - 在 getter 中,当前活动的 Watcher 会被注册到该属性关联的 Dep 上,完成依赖收集。 - 在 setter 中,则会调用 Dep 来通知所有相关的 Watcher 更新视图[^3]。 下面是一个模拟 Vue 2 响应式系统的简化版本代码示例: ```javascript // 定义全局唯一的 Dep 类型实例集合 class Dep { constructor() { this.subs = []; // 存储所有的 watcher } addSub(sub) { // 添加订阅者 this.subs.push(sub); } notify() { // 通知所有订阅者更新 this.subs.forEach(sub => sub.update()); } } let activeWatcher; // 全局变量保存当前激活的 watcher // 定义 Wather 类型 class Watcher { constructor(vm, key, cb) { this.vm = vm; this.key = key; this.cb = cb; Dep.target = this; // 将自己赋值给 Dep.target this.getter(); // 执行一次获取值的操作以便于加入 dep 收集队列 Dep.target = null; // 清除 target 避免污染其他地方 } update() { // 数据变更后的处理方法 const oldValue = this.value; this.getter(); this.cb(this.value, oldValue); // 触发用户的回调函数 } getter() { // 获取最新值的方法 this.value = this.vm[this.key]; } } function observe(obj) { // 把 obj 变成可观察的对象 Object.keys(obj).forEach(key => defineReactive(obj, key)); } function defineReactive(target, key) { let value = target[key]; const dep = new Dep(); if (typeof value === 'object') { observe(value); // 如果是嵌套对象则递归定义 reactive 属性 } Object.defineProperty(target, key, { get() { if (Dep.target) { // 判断是否有正在活跃中的 watcher dep.addSub(Dep.target); // 加入订阅列表 } return value; }, set(newValue) { if (newValue !== value) { value = newValue; // 修改新值 if (typeof newValue === 'object') { observe(newValue); // 新值也是对象的话继续变成响应式的 } dep.notify(); // 通知所有订阅者更新 } } }); } const data = { foo: 'bar' }; observe(data); new Watcher(data, 'foo', function(newVal, oldVal) { console.log(`foo changed from ${oldVal} to ${newVal}`); }); data.foo = 'baz'; // 输出:foo changed from bar to baz ``` 上述代码展示了如何手动创建一个简易版的 Vue 2 响应式系统,其中包含了 Observer、Dep 和 Watcher 这些核心部分的工作流程[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值