leiwuhen-67's blog leiwuhen-67's blog
首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)

我的公众号

首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)
  • React

    • 使用React脚手架快速搭建项目
    • hooks之useEffect
    • React之事件绑定及简写方式
    • React之props传值并对其进行限制
    • React之Refs的基本使用
    • React之生命周期钩子
    • React之key的使用
    • React之代理服务器配置
    • React之封装全局Loading组件
    • React之消息的发布-订阅(pubsub-js)
      • 1、安装pubsub-js
      • 2、在需要接收消息的组件中订阅
        • 2.1 类组件中使用
        • 2.2 函数组件中使用
    • React之Redux的基本使用
    • React之react-redux的基本使用
    • React之redux的数据持久化存储
    • React之路由懒加载
    • React之Render Props的使用
    • React之createBrowserRouter
    • React之路径别名@配置
    • React之craco打包优化配置
    • React之项目国际化
    • React之postcss-pxtorem移动端适配
    • React之使用vite创建项目
    • React之ts类型标注汇总
    • React之使用 ant design搭建后台管理之踩坑
    • React之路由切换动画
    • React之使用vite创建组件库并发布到npm
    • React之项目打包部署到nginx
    • React之自定义组件添加className与style
  • React Native

  • 《React》笔记
  • React
心欲无痕
2024-03-14
目录

React之消息的发布-订阅(pubsub-js)

在项目中经常会涉及到不同组件之间的通信,特别是兄弟组件、祖孙组件这种,如果是通过 props 来传值,会比较繁琐,因此我们可以通过发布 - 订阅模式来实现不同组件间的通信,这里使用到了 pubsub-js 这个 js 库.

# 1、安装 pubsub-js

npm install pubsub-js
1

# 2、在需要接收消息的组件中订阅

# 2.1 类组件中使用

创建 Parent.jsx 组件,Child1.jsx 组件,Child2.jsx 组件

// Child1.jsx组件
import React from "react";
import pubsub from "pubsub-js";

export default class Child1 extends React.Component {
    handlePublish = () => {
        console.log("Child1发布消息了");
        pubsub.publish("message", "hello world");
    }
    render() {
        return (
            <div>
                <button onClick={() => this.handlePublish() }>发布消息</button>
            </div>
        );
    }
}

// Child2.jsx组件
import React from "react";
import pubsub from "pubsub-js";

export default class Child2 extends React.Component {
    token = ""
    // 组件挂载完毕开始订阅组件
    componentDidMount() {
        this.token = pubsub.subscribe("message", (msg, data) => {
            console.log("Child2订阅消息了", data)
        })
    }

    // 组件即将卸载时取消订阅
    componentWillUnmount() {
    	pubsub.unsubscribe(this.token)
    }

    render() {
        return <div>订阅消息</div>
    }
}

// Parent.jsx组件
import Child1 from "./Child1"
import Child2 from "./Child2"

export default class Parent extends React.Component {
    render() {
        return (
            <div>
                <Child1 />
                <Child2 />
            </div>
        )
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

# 2.2 函数组件中使用

创建 Parent.jsx 组件、Child1 组件、Child2 组件

// Child1.jsx组件
import React from "react";
import pubsub from "pubsub-js";

export default function Child1() {
    function handlePublish () {
        console.log("Child1发布消息了");
        pubsub.publish("message", "hello world");
    }
    return (
        <div>
            <button onClick={() => handlePublish() }>发布消息</button>
        </div>
    );
}

// Child2.jsx组件
import React, { useState, useEffect } from "react";
import pubsub from "pubsub-js";

export default function Child2() {
    const [message, setMessage] = useState("")
    // 组件挂载完毕开始订阅组件
    useEffect(() => {
    	const token = pubsub.subscribe("message", (msg, data) => {
          console.log("Child2订阅消息了", data)
          setMessage(data)
      })
      return () => {
      	pubsub.unsubscribe(token)  // 取消订阅
      }
    }, []) // 传空数组,表示仅在组件挂载和卸载时执行

    return <div>订阅消息{ message }</div>
}

// Parent.jsx组件
import Child1 from "./Child1"
import Child2 from "./Child2"

export default function Parent() {
    return (
        <div>
            <Child1 />
            <Child2 />
        </div>
    )
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
编辑 (opens new window)
上次更新: 7/1/2024, 4:56:33 PM
React之封装全局Loading组件
React之Redux的基本使用

← React之封装全局Loading组件 React之Redux的基本使用→

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式