第二十九章 使用消息订阅发布实现组件通信

简介: 第二十九章 使用消息订阅发布实现组件通信

PubSubJS库介绍

如果你想在React中使用第三方库来实现Pub/Sub机制,PubSubJS是一个不错的选择。它是一个轻量级的库,可以在浏览器和Node.js环境中使用。

PubSubJS提供了一个简单的API,可以让你在应用程序中订阅和发布消息。你可以使用npm来安装它:

npm install pubsub-js

1-引入使用

import PubSub from 'pubsub-js'

2-首先订阅消息

PubSub.subscribe('List',function(msg, data){ console.log(msg, data)})

用于接收发布的信息。

3-发布消息

PubSub.publish('List',data)

4-取消订阅消息

PubSub.unsubscribe(this.token)

案例使用

现在有一个页面,有两个兄弟组件

  • Search组件获取输入的关键字,然后交给List组件去网络请求。
  • List组件展示github的用户列表

1-App组件代码

import React, { Component } from 'react'
import Search from './components/Search'
import List from './components/List'
export default class App extends Component {
  render() {
    return (
      <div className="container">
        <Search/>
        <List/>
    </div>
    )
  }
}

2-Search组件代码

import React, { Component } from 'react'
import PubSubJs from 'pubsub-js'
export default class Search extends Component {
  searchHandle = () => {
    const {KeyVal:{value}} = this
    PubSubJs.publish('getSearchVal',value)
  }
  render() {
    return (
      <section className="jumbotron">
      <h3 className="jumbotron-heading">Search Github Users</h3>
      <div>
        <input ref={c=>this.KeyVal = c} type="text" placeholder="关键字"/>
      <button onClick={this.searchHandle}>Search</button>
      </div>
    </section>
    )
  }
}

3-List组件代码

import React, { Component } from 'react'
import PubSubJs from 'pubsub-js'
import axios from 'axios'
import './index.css'
export default class List extends Component {
  state = {
    users: [],
    isFirst: true,
    isLoading: false,
    err: '',
  }
  getSearchFunc = (msg, data) => {
    console.log('接收的信息', data)
    this.setState({ users: [], isFirst: false, isLoading: true })
    axios
      .get(`https://api.github.com/search/users?q=${data}`)
      .then(
        (res) => {
          this.setState({ users: res.data.items, isFirst: false, isLoading: false })
          console.log('请求成功了', res.data)
        },
        (err) => {
          console.log('请求失败了', err)
          this.setState({isFirst: false, isLoading: false,err:err.message })
        }
      )
      .catch(() => {})
  }
  componentDidMount() {
   this.token = PubSubJs.subscribe('getSearchVal', this.getSearchFunc)
  }
  componentWillUnmount() {
    PubSubJs.unsubscribe(this.token)
  }
  render() {
    const { users, isFirst, isLoading, err } = this.state
    return (
      <div className="row">
        {isFirst ? (
          <h2>欢迎搜索</h2>
        ) : isLoading ? (
          <h2>Loading...</h2>
        ) : err ? (
          <h3>{err}</h3>
        ) : (
          users.map((userObj) => {
            return (
              <div className="card" key={userObj.id}>
                <a href={userObj.html_url} target="_blank" rel="noreferrer">
                  <img
                    alt="头像"
                    src={userObj.avatar_url}
                    style={{ width: '100px' }}
                  />
                </a>
                <p className="card-text">{userObj.login}</p>
              </div>
            )
          })
        )}
      </div>
    )
  }
}

4-效果展示

image.pngimage.png

总结

1- 设计状态时要考虑全面,例如有网络请求的时候要考虑网络延迟和请求失败的状态处理。

2- ES6小知识点:解构赋值 + 重命名

let obj = {a:{b:1}}
const { a } = obj // 传统的解构赋值
const { a:{b} } = obj // 连续的解构赋值
const { a:{b:value} } = obj // 连续解构赋值 + 重命名

3- 消息订阅与发布机制

I. 先订阅,再发布 (一种隔空对话的感觉)

II. 适用于任意组件的通信

III. 要在组件componentWillUnmount生命钩子中取消订阅

4- 扩展fetch发送请求(关注分离的设计思想)

async func () {
    try {
        const res = await fetch('url')
        const data = await res.json()
        console.log(data)
    } catch(error) {
        console.log(error)
    }
}


相关文章
|
2月前
|
设计模式 消息中间件 安全
C# 一分钟浅谈:观察者模式与订阅发布模式
【10月更文挑战第11天】本文介绍了观察者模式和订阅发布模式,这两种设计模式主要用于实现对象间的解耦。观察者模式通过事件和委托实现一个对象状态改变时通知多个依赖对象;订阅发布模式则通过事件聚合器实现发布者与订阅者之间的解耦。文章详细探讨了这两种模式的实现方式、常见问题及避免方法,帮助开发者在实际项目中更好地应用这些模式,提升代码的可维护性和扩展性。
80 1
|
6月前
|
消息中间件 存储 监控
中间件消息发布者功能特性
【6月更文挑战第11天】
50 5
|
5月前
|
消息中间件 NoSQL 中间件
中间件发布-订阅模式(Pub/Sub)
【7月更文挑战第1天】
152 2
|
6月前
|
存储 负载均衡 安全
中间件消息发布-订阅模式
【6月更文挑战第9天】
140 5
|
传感器 负载均衡 物联网
MQTT v5共享订阅是怎么回事?如何使用共享订阅提高消息订阅的灵活性和可伸缩性?
MQTT v5共享订阅是怎么回事?如何使用共享订阅提高消息订阅的灵活性和可伸缩性?
547 1
|
7月前
|
传感器 监控 网络协议
MQTT 发布、订阅模式介绍
【2月更文挑战第17天】
482 6
MQTT 发布、订阅模式介绍
|
7月前
|
移动开发 小程序 Go
【社区每周】小程序消息订阅插件升级为消息订阅接口(2022年8月第五期)
【社区每周】小程序消息订阅插件升级为消息订阅接口(2022年8月第五期)
50 0
|
7月前
|
消息中间件 Java
RabbitMQ中的消息发布-订阅模式是什么?如何实现?
RabbitMQ中的消息发布-订阅模式是什么?如何实现?
191 0
|
消息中间件 传感器 存储
MQTT介绍-发布/订阅模式
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议。
5916 0
|
消息中间件 存储 算法
RocketMQ 消息集成:多类型业务消息——定时消息
本篇将继续业务消息集成的场景,从使用场景、应用案例、功能原理以及最佳实践等角度介绍 RocketMQ 的定时消息功能。
473 0
RocketMQ  消息集成:多类型业务消息——定时消息