React中消息订阅与发布

业务逻辑流程

在这里插入图片描述

我们从搜索js中 查询的消息返回的数据 返回到list.js中展示 通过 pubsub-js  发送数据 

Search.js代码

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

class Search extends Component {
  Search = async () => {
    const {
      keyWordElement: { value: keyWord },
    } = this;
    PubSub.publish("suzhou", { isFirst: false, isLoading: true });
    try{
      const responses = await fetch(`http://localhost:3000/api/search/users?q=${keyWord}`);
      const data = await responses.json()
      PubSub.publish('suzhou',{isLoading:false,user:data.items})
    }catch(error){
      PubSub.publish('suzhou',{isLoading:false,err:error.message})
      console.log('请求出错',error)
    }
  };
  render() {
    return (
      <section className="jumbotron">
        <h3 className="jumbotron-heading">请输入您要搜索的内容</h3>
        <div>
          <input
            ref={(c) => (this.keyWordElement = c)}
            type="text"
            placeholder="enter the name you search"
          />
          &nbsp;<button onClick={this.Search}>搜索</button>
        </div>
      </section>
    );
  }
}
export default Search;

List.js界面

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

class List extends Component {
  state = {
    user: [],
    isFirst: true,
    isLoading: false,
    err: ''
  }
  //(装载完成),在render之后调用
   componentDidMount() {
    this.token = PubSub.subscribe("suzhou", (_, dataObj) => {
      this.setState(dataObj);
    });
  }
  componentWillUnmount() {
    PubSub.unsubscribe(this.token);
  }
  render() {
    const { user, isFirst, isLoading, err } = this.state;
    return (
      <div className="row">
        {isFirst ? (
          <h2>欢迎来到这里</h2>
        ) : isLoading ? (
          <h2>正在加载...</h2>
        ) : err ? (
          <h2 style={{ color: "red" }}>{err}</h2>
        ) : (
          user.map((userObj) => {
            return (
              <div key={userObj.id} className="card">
                <a rel="noreferrer" href={userObj.html_url} target="_blank">
                  <img
                    alt="head_portrait"
                    src={userObj.avatar_url}
                    style={{ width: "100px" }}
                  />
                </a>
                <p className="card-text">{userObj.login}</p>
              </div>
            );
          })
        )}
      </div>
    );
  }
}

export default List;

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘴巴嘟嘟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值