React兄弟组件间的通信

1. 首先安装插件

npm install pubsub-js

2. 在使用的页面引入

import PubSub from ‘pubsub-js’

3. 发布消息PubSub.publish

PubSub.publish(‘消息名’, data)

4. 接受消息PubSub.subscribe

PubSub.subscribe(‘消息名’, (a, b) => {})

5. 取消发布订阅 PubSub.unsubscribe

PubSub.unsubscribe(this.token)

演示案例

  1. Child组件内容
import React, { Component } from 'react'
import PubSub from 'pubsub-js'
import axios from 'axios'

export default class Child extends Component {

  onPublish = () => {
    axios.get(`http://192.168.58.110:6666/user/list/id=${15895213568651}`).then(({ data: res }) => {
      // 发布消息
      PubSub.publish('list', { userList: res.data })
    }).catch((err) => {
      console.log(err)
    })
  }

  render() {
    return (
      <div>
        <button onClick={this.onPublish}>点我发布消息</button>
      </div>
    )
  }
}
  1. Child2组件内容
import React, { Component } from 'react'
import PubSub from 'pubsub-js'

export default class Child2 extends Component {
  render() {
    // 初始化状态
    state = {
      userList: []
    }
    /**
     * 订阅消息,注意点:
     * 1. 订阅消息名必须和发布消息名相同
     * 2. 订阅消息第二个参数接受一个回调函数,必传两个形参
    */
    componentDidMount() {
      this.token = PubSub.subscribe('list', (_, data) => {
        // const { userList } = this.state
        this.setState({...data}) // 相当于 this.setState({userList: data})
      })
    }
    // 页面卸载时取消 消息订阅
    componentWillUnmount() {
      PubSub.unsubscribe(this.token)
    }

    return (
      const { userList } = this.state

      <div>
        { userList.map(item => {
          return (
            <div className="list">
              <div>{item.name}</div>
              <div className="list-desc">
                <div className="desc">{item.desc}</div>
                <div className="time">{item.time}</div>
              </div>
            </div>
          )
        }) }
      </div>
    )
  }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值