cms建站系统 开源,深圳做网站公司 南山,北京十大装饰装修公司,wordpress安装数据库出错React项目中使用发布订阅模式 1.创建发布订阅器2.在组件中使用发布订阅器3. 订阅数据 发布订阅模式#xff08;也称观察者模式#xff09;是一种管理跨组件通信的有效方式#xff0c;尤其是在不希望直接依赖于特定组件的情况下。这种模式允许一个对象#xff08;发布者也称观察者模式是一种管理跨组件通信的有效方式尤其是在不希望直接依赖于特定组件的情况下。这种模式允许一个对象发布者通知多个其他对象订阅者而不必知道这些对象是谁或他们在哪里。这有助于解耦组件使得代码更加模块化和可维护。 1.创建发布订阅器 创建一个发布订阅器类负责管理时间的注册、取消和触发 # js
class PubSub {constructor(){this.events {}}subscribe(event, callback){if(!this.events[event]){this.events[event] []}this.events[event].push(callback)}unsubscribe(event,callback){if(this.events[event]){this.events[event] this.events[event].filter(cb cb ! callback)}}publish(event,data){if(this.events[event]){this.events[event].forEach(callback callback(data))}}
}const pubsub new PubSub()# tsinterface EventMap {[eventName: string]: any;
}class EventCenter {private listeners {}constructor(){this.listeners {}}subscribeT extends keyof EventMap(event: T, callback: (data?: EventMap[T]) void) {if(!this.listeners[event]) {this.listeners[event] []}this.listeners[event].push(callback)}publishT extends keyof EventMap(event: T, data?: EventMap[T]) {const callbacks this.listeners[event]if(callbacks) {callbacks.forEach(callback {callback(data)})}}unsubscribeT extends keyof EventMap(event: T, callback?: (data: EventMap[T]) void) {const callbacks this.listeners[event];if (callbacks) {if (callback) {this.listeners[event] callbacks.filter(cb cb ! callback);} else {delete this.listeners[event];}}}
}export default new EventCenter()2.在组件中使用发布订阅器 在你的React组件中使用这个发布订阅器。例如一个组件可以订阅事件以接收数据而另一个组件可以发布事件来发送数据。假设你有一个按钮组件当点击时他会触发一个事件发送一些数据 import React from react;
import { pubsub } from ./pubsub; // 引入上面定义的PubSub实例class ButtonComponent extends React.Component {handleClick () {pubsub.publish(dataUpdated, { message: Hello World! });};render() {return (button onClick{this.handleClick}Click me!/button);}
}3. 订阅数据 另一个组件可以订阅这个事件并在接收到数据时执行某些操作 import React, { useEffect, useState } from react;
import { pubsub } from ./pubsub; // 引入上面定义的PubSub实例interface DisplayProps {}
interface DisplayState {message: string;
}const DisplayComponent: React.FCDisplayProps () {const [message, setMessage] useState();useEffect(() {const handleDataUpdate ({ message }: { message: string }) {setMessage(message);};pubsub.subscribe(dataUpdated, handleDataUpdate);return () {pubsub.unsubscribe(dataUpdated, handleDataUpdate);};}, []);return div{message}/div;
};export default DisplayComponent;