美文网首页
react的通信方式eventEmitter

react的通信方式eventEmitter

作者: 我是七月 | 来源:发表于2022-10-26 17:39 被阅读0次

新建eventBus.js

import { EventEmitter } from 'events';
export default new EventEmitter();

发布组件

import Bus from '../../EventBus';
<Button type='primary' onClick={ () => { Bus.emit('changeSiblingsData', count) }}>提交</Button>

订阅组件

import Bus from '../../EventBus';
Bus.addListener('changeSiblingsData', (count)=> {
    alert(count); 
});

--------------------------------这是一条神奇的分割线--------------------------------

自定义事件,类比vue里的pubsub.开发订阅者模式
使用说明:
import { EventEmitter } from ‘events’;
eventEmitter = new EventEmitter();
发布:eventEmitter.emit(‘事件名’,回调函数)
订阅:eventEmitter.on(‘事件名’,回调函数) 或者 eventEmitter.addListener(‘事件名’,回调函数)
取消订阅:eventEmitter.off(‘事件名’,函数) 或者 eventEmitter.removeListener(‘事件名’,回调函数)
全部取消:eventEmitter.removeAllListener(‘事件名’)

      注:
      失效的几种情况:
      1、不能通过箭头函数来订阅和取消订阅。因为每个箭头函数指向的地址不一样,因此无法取消。
      2、在函数式组件里,直接写函数名eventEmitter.off('事件名',函数名),也是没用的。因为函数组件重新加载会导致回调函数的更新。指向的不再是同一个。因此无法取消了。
    
      解决办法:
      1、函数式组件里,用removeAllListener('事件名')。全部取消。
      2、用类式组件   这样回调函数就不会更新,地址一直是同一个
      
      补充:on 和 addListener作用相同。off 和 removeListener作用相同


函数式组件
export default function Test2() {
    const [event_params, setevent_params] = useState(500);
//指定的回调函数
    function getFriut(mes) {
        setevent_params(mes);
    }
    useEffect(() => {
    //订阅
        eventEmmiter.addListener('friut', getFriut);
    }, []);

    return (
        <div style={{ border: '2px solid red', height: '400px' }} id={'Test2'}>
            我是2号子组件,接收消息
            {event_params}
            <br />
            <button
                onClick={() => {
                //取消订阅  ----无效方法
                // 我们声明的 getFriut 是直接定义了一个方法,这也就导致只要是父组件重新渲染(状态或者props更新)就会导致这里声明出一个新的方法,新的方法和旧的方法尽管长的一样,但是依旧是两个不同的对象,同理,箭头函数也是如此
                    eventEmmiter.removeListener('friut', getFriut);
              //全部取消 ----解决方案1
                    // eventEmmiter.removeAllListeners('friut');
                }}
            >
                点击取消订阅
            </button>
        </div>
    );
}

类组件
export default class Test2 extends Component {
    state = {
        event_params: 'lalal',
    };
    //指定的回调函数
    getFriut = (mes) => {
        this.setState({ event_params: mes });
    };
    componentDidMount() {
    //订阅
        eventEmmiter.addListener('friut', this.getFriut);
    }
    render() {
        return (
            <div style={{ border: '2px solid red', height: '400px' }} id={'Test2'}>
                我是2号子组件,接收消息
                {this.state.event_params}
                <br />
                <button
                    onClick={() => {
                    //取消订阅  -----解决方案2
                        eventEmmiter.removeListener('friut', this.getFriut);
                        
                    }}
                >
                    点击取消订阅
                </button>

            </div>
        );
    }
}



相关文章

  • react的通信方式eventEmitter

    新建eventBus.js 发布组件 订阅组件 --------------------------------这...

  • React Native 的组件通信方式

    React Native 的组件通信方式 React Native 的...

  • 8) React Native 与原生之间的通信(iOS)

    本文将讲述下在原生和React Native之间的通信方式。方式和逻辑综合了自己的思维方式,主要参考了React ...

  • 总结

    React组件之间的通信方式 1.父组件向子组件通信 React数据流动是单向的,通过props传递 2.子组件向...

  • 干货博客集

    基础 webpack4.x 入门一篇足矣 react组件通信方式汇总 vue组件之间的通信 原生小程序组件通信 w...

  • react通信

    通信的几种方式 一般来说,react里边有几种常用的方式:父到子,子到父,兄弟组件之间的通信。 ===== 父向子...

  • React组件通信的几种方式--TypeScript

    React组件通信的几种方式--TypeScript 通过todoList示例进行学习,首先创建基于TypeScr...

  • 07-02-React 类组件

    目标 掌握类组件的定义和使用; 掌握 React 组件间通信的方式; 掌握类组件的生命周期。 内容 在 React...

  • react native组件通信方式

    1:父组件给子组件通过props2: 通过回调父组件传递一个函数 子组件将执行结果回传给父组件3:通过ref方...

  • react 组件通信方式集合

    通过props进行父组件 -> 子组件,子组件 ->父组件 通过context来完成跨级组件传输,这种方式官方不建...

网友评论

      本文标题:react的通信方式eventEmitter

      本文链接:https://www.haomeiwen.com/subject/krtzzrtx.html