react中发布订阅(pubsub-js)的用法(兄弟之间传值)

本文介绍了在React应用中如何使用发布订阅模式(pubsub-js库)来解决兄弟组件间复杂的数据交互问题。通过发布者发布数据,订阅者接收并更新状态,实现了非父子组件间的通信。示例代码包括发布者组件(SelectData)的输入提交功能,以及订阅者组件(GoodList)的页面数据获取和渲染。
摘要由CSDN通过智能技术生成

发布订阅主要用来解决复杂的层集之间的数据交互,比如兄弟之间的复杂传值,这种情况就不适合使用props和context来进行传值。

1.在使用发布订阅前需要安装pubsub-js包

npm install pubsub-js 

2.发布者主要代码

import React, { Component } from 'react'
// 导入发布订阅包
import PubSub from 'pubsub-js'
import './SelectData.css'
export default class SelectData extends Component {
    
    unpage=React.createRef()
    selePage=()=>{
        // 接收用户输入数据
        let page=this.unpage.current.value
        // 调用pubsub提供的方法publish(发布者利用接收到的数据传给订阅者page)(pageNumber为发布的函数名,相当于标识身份用的)
        PubSub.publish('pageNumber',page)
        // 提交后全选
        this.unpage.current.select()
    }
    render() {
        return (
            <div className='select'>
                <input type='text' ref={this.unpage} />
                <button onClick={this.selePage}>提交</button>
            </div>
        )
    }
}

3.订阅者部分代码

import React, { Component } from 'react'
import './GoodList.css'
//导入发布订阅包
import PubSub from 'pubsub-js'
// 导入axios请求包
import axios from 'axios'
export default class GoodList extends Component {
  state = {
    // 初始值
    page: 1,
    goods: []
  }
  // 初始化加载
  componentDidMount() {
    // 初始化调用
    this.getData()
    // 订阅者接收发布者提供的数据data(pageNumber为发布的函数名,相当于标识身份用的)
    PubSub.subscribe('pageNumber', (msg, data) => {
      console.log(msg, data);
      // 使用setState修改
      this.setState({
        page: data
      }, () => {
        // 延时调用
        this.getData()
      })
    })
  }
  // axios请求封装
  getData = () => {
    axios.get(`https://api.shop.eduwork.cn/api/index?page=${this.state.page}`)
      .then(res => {
        console.log(res);
        if (res.status === 200) {
          // 修改goods值
          this.setState({
            goods: res.data.goods.data
          })
        }
      })
  }
  render() {
    // 解构
    let { goods } = this.state
    console.log(goods);
    return (
      <div className='goods'>
        <ul>
          {/* 遍历取值 */}
          {goods.map(ele =>
            <li key={ele.id}>
              <img src={ele.cover_url} alt="" />
              <p>{ele.title}</p>
              <p className='bookText'>
                <span>¥{ele.price}</span><span>⭐{ele.stock}</span>
              </p>
            </li>
          )}
        </ul>
      </div>
    )
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值