react 消息订阅-发布机制(解决兄弟组件通信问题)

这篇博客介绍了如何在React应用中使用PubSubJS库进行组件间的通信。通过订阅和发布消息,Search组件在用户输入并触发搜索时,能够通知List组件更新其状态,显示加载或错误信息,并传递搜索结果。List组件则根据接收到的消息更新其内部状态,展示用户列表或错误提示。
摘要由CSDN通过智能技术生成

消息订阅-发布机制

  1. 工具库: PubSubJS
  2. 下载: npm install pubsub-js --save
  3. 使用:
    1)import PubSub from ‘pubsub-js’ //引入
    2)PubSub.subscribe(‘delete’, function(data){ }); //订阅
    3)PubSub.publish(‘delete’, data) //发布消息
    在这里插入图片描述
    App组件:
import React, {Component} from 'react'
import Search from "./components/Search";
import List from "./components/List";
import './App.css';
export default class App extends Component {





    render() {
        return (
            <div className="container">
                <Search />
                <List />
            </div>
        )
    }
}

/*function App() {
  return (
    <div>
      <Index />
    </div>
  );
}*/



Search组件:

import React, {Component} from 'react';
import PubSub from 'pubsub-js'
import axios from "axios";

class Search extends Component {
    search = () => {
        // 获取用户的输入(连续解构赋值+重命名)
        const {keyWordElement: {value: keyword}} = this
        // 发送请求前通知List更新状态
        // this.props.updateAppState({isFirst: false, isLoading: true})
        PubSub.publish('zep', {isFirst: false, isLoading: true})

        // 发送网络请求
        axios.get(`https://api.github.com/search/users?q=${keyword}`).then((response) => {
            // 请求成功后通知List更新状态
            // this.props.updateAppState({isLoading: false, users: response.data.items})
            console.log('Search组件发布消息')
            PubSub.publish('zep', {isLoading: false, users: response.data.items})

        },(error) => {
            // this.props.updateAppState({isLoading: false, err: error.message})
            PubSub.publish('zep', {isLoading: false, err: error.message})

        })

    }
    render() {
        return (
            <section className="jumbotron" style={{textAlign: "center"}}>
                <h3 className="jumbotron-heading">搜索github用户</h3>
                <div>
                    <input ref={c => this.keyWordElement = c} type="text" placeholder="输入关键词点击搜索"/>&nbsp;
                    <button onClick={this.search}>搜索</button>
                </div>
            </section>
        );
    }
}

export default Search;

List组件:

import React, {Component} from 'react';
import PubSub from 'pubsub-js'
import './index.css'

class List extends Component {
    state = {// 初始化状态
        users: [], // users初始值为数组
        isFirst: true, // 是否为第一次打开页面
        isLoading: false, // 标识是否处于加载中
        err: '' // 存储请求相关的错误信息
    }
     componentDidMount() {
        // 订阅消息
        this.token = PubSub.subscribe('zep', (msg, stateObj) => {
            console.log('List组件订阅消息', stateObj)
            this.setState(stateObj)
        })
    }
    componentWillUnmount() {
        PubSub.unsubscribe(this.token)
    }

    render() {
        const {users, isFirst, isLoading, err} = this.state
        return (
            <div className="row">
                {
                    isFirst ? <h2>欢迎使用,输入关键字,随后点击搜索</h2> :
                        isLoading ? <h2>Loading...</h2> :
                            err ? <h2 style={{color: 'red'}}>{err}</h2> :
                                users.map((userObj) => {
                                    return (
                                        <div className="card" key={userObj.id}>
                                            <a href={userObj.html_url} rel="noreferrer" target="_blank">
                                                <img alt="avatar" src={userObj.avatar_url} style={{width: '100px'}}/>
                                            </a>
                                            <p className="card-text">{userObj.login}</p>
                                        </div>
                                    )
                                })
                }
            </div>
        );
    }
}

export default List;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值