pubsub-js库实现“跨组件”数据传递

本文介绍了如何在React和Vue应用中利用pubsub-js库进行组件间的通信,包括订阅发布机制的快速入门,匹配多个订阅规则以及公共订阅与个性化订阅规则的应用。示例展示了异步和同步发布,以及如何管理订阅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 参考

  1. pubsub-js npm地址

应用场景描述

在React和Vue开发中,如果遇到同级组件或者跨多级组件的数据传递,可以使用pubsub-js库实现“订阅和发布”的能力,实现“数据跨组件传输”

使用说明

快速入门(订阅——发布)

// 参考 https://www.npmjs.com/package/pubsub-js
import PubSub from 'pubsub-js'

/**
 * create a function to subscribe to topics
 * @param {*} msg 主题的名字, 案例中的 msg 是 'MY TOPIC'
 * @param {*} data 订阅主题传递的参数
 */
var mySubscriber = function (msg, data) {
  console.log( msg, data );
};

// 订阅一个 'MY TOPIC' 主题, 对应的方法是 mySubscriber
var token = PubSub.subscribe('MY TOPIC', mySubscriber);

// 发布主题 'MY TOPIC', 即 传输的参数是 'hello world!  publish'
// 异步推送
PubSub.publish('MY TOPIC', 'hello world!  publish');

// 同步推送
PubSub.publishSync('MY TOPIC', 'hello world!  publishSync');

test('pubsubjs demo', (done) => {
  // 异步推送
  // PubSub.publish('MY TOPIC', 'hello world!  publish');
  setTimeout(()=>{
    done()
  }, 2000)
})

发布匹配多个订阅 规则

// 参考 https://www.npmjs.com/package/pubsub-js
import PubSub from 'pubsub-js'

var myFunc1 = function (msg, data) {
  console.log( msg, 'myFunc1', data );
};
var myFunc2 = function (msg, data) {
  console.log( msg, 'myFunc2', data );
};
var myFunc3 = function (msg, data) {
  console.log( msg, 'myFunc3', data );
};


test('pubsubjs demo', (done) => {
  PubSub.subscribe('a', myFunc1);
  PubSub.subscribe('a.b', myFunc2);
  PubSub.subscribe('a.b.c', myFunc3);

  
  // PubSub.publish('a')
  // 会触发一个方法 myFunc1
  // PubSub.publishSync('a', 'publishSync')
  // 会触发三个方法
  // PubSub.publishSync('a.b.c', 'publishSync')

  // 智慧触发 myFunc3 方法
  // PubSub.unsubscribe('a.b');
  // PubSub.publishSync('a.b.c', 'publishSync')

  // 所有的订阅全部取消,一个方法都不会发生
  PubSub.clearAllSubscriptions();
  PubSub.publishSync('a.b.c', 'publishSync')

  setTimeout(()=>{
    done()
  }, 2000)
})

发布匹配公共订阅和个性化订阅 规则

// 参考 https://www.npmjs.com/package/pubsub-js
import PubSub from "pubsub-js";

test("pubsubjs demo", (done) => {
  // create a subscriber to receive all topics from a hierarchy of topics
  var myToplevelSubscriber = function (msg, data) {
    console.log("top level: ", msg, data);
  };

  // subscribe to all topics in the 'car' hierarchy
  PubSub.subscribe("car", myToplevelSubscriber);

  // create a subscriber to receive only leaf topic from hierarchy op topics
  var mySpecificSubscriber = function (msg, data) {
    console.log("specific: ", msg, data);
  };

  // subscribe only to 'car.drive' topics
  PubSub.subscribe("car.drive", mySpecificSubscriber);

  // Publish some topics
  PubSub.publish("car.purchase", { name: "my new car" }); // 触发 myToplevelSubscriber
  PubSub.publish("car.drive", { speed: "14" }); // 触发 myToplevelSubscriber 和 mySpecificSubscriber
  PubSub.publish("car.sell", { newOwner: "someone else" }); // 触发 myToplevelSubscriber

  setTimeout(() => {
    done();
  }, 2000);
});

类似应用

参考 Vue2.x eventBus全局管理事件的“订阅/发布”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值