React非父子组件之间的事件传递

简介: 本文介绍了在React中非父子组件之间如何通过事件总线(eventBus)实现事件传递。

核心代码:

const eventBus = {
   
    evnetList: [],
    // 监听事件
    pushFun(callbackFun, name) {
   
        // 同名事件 过滤
        if (this.evnetList.length > 0 && this.evnetList.find(i => i.name === name)) {
   
            this.evnetList = this.evnetList.filter(i => i.name !== name)
        }
        this.evnetList = [...this.evnetList, {
    name, callbackFun }]
    },
    //触发事件
    dispath(name, data = '') {
   
        if (!name) {
   
            return false;
        }
        this.evnetList.forEach(element => {
   
            if (name === element.name) {
   
                element.callbackFun(data)
            }
        });
    },
    // 取消事件监听
    $remove(name = "") {
   
        // console.log(name, "取消事件监听")
        this.evnetList = [...this.evnetList.filter(i => i.name !== name)]
    }
}
export default eventBus

上面是创建了一个js模块,总的来说是个对象,有三个属性,第一个evnetList是来存储对象的,这个对象通过pushFun来改变evnetList数组,格式如下:

 evnetList: [{
   
        name:'zjq',
        callbackFun:()=>{
   }
    }],

最终能通过触发方法dispath来触发对应name的函数,每一个函数的唯一标识就是name;
下面看一下使用:
1.js

    componentDidMount() {
   
        eventFun.pushFun((e) => {
   
            console.log('e===我是菜单选项二传递过来的参数', e);
            this.setState({
   
                valueTopStr: e
            })
        }, 'childTopFun')
    }

2.js

import React from "react";
import {
    Button, Input } from 'element-react';
import eventFun from "../../js/eventFun";
export default class Childtop extends React.Component {
   

    constructor() {
   
        super()
    }
    state = {
   
        valueStr: ''
    }
    change() {
   
        console.log('this.state.valueStr===', this.state.valueStr);
        eventFun.dispath('childTopFun',this.state.valueStr)
    }
    changeFun(e) {
   
        console.log('e===', e);
        this.setState({
   
            valueStr: e
        })
    }
    render() {
   
        return (
            <div>
                <p>我是childTop组件</p>
                <Input placeholder="请输入内容" value={
   this.state.valueStr} onChange={
   (e) => {
    this.changeFun(e) }} /> 
                  <Button type="success" onClick={
   () => {
    this.change() }}>点击给top组件发送信息</Button>
            </div>
        )
    }
}

1页面挂载的时候就开始监听name为childTopFun的事件函数,在2中,在input中输入点击按钮触发childTopFun事件,完成事件传递~

目录
相关文章
|
7月前
|
前端开发 API
react怎么实现父子组件传值?
react怎么实现父子组件传值?
34 1
|
前端开发
React-父子组件通讯
React-父子组件通讯
52 0
React-父子组件通讯
|
前端开发 JavaScript
react-兄弟-父子组件共享状态-useContext
react-兄弟-父子组件共享状态-useContext
107 0
|
5月前
|
前端开发 JavaScript 开发者
react18【系列实用教程】组件 (2024最新版 | 含父子组件传值、兄弟组件传值、越层组件传值、“插槽“)
react18【系列实用教程】组件 (2024最新版 | 含父子组件传值、兄弟组件传值、越层组件传值、“插槽“)
88 2
|
前端开发
react父子组件传值
react父子组件传值
61 0
|
7月前
|
前端开发
react怎么实现父子组件传值
react怎么实现父子组件传值
|
存储 前端开发
【react从入门到精通】React父子组件通信方式详解(有示例)
在React中,父子组件最常用的4种通信方式: - 通过 props 实现父子组件通信 - 通过 state 实现父子组件通信 - 通过回调函数实现父子组件通信 - 使用 React Context 实现组件通信 在项目实战过程中,可根据实际情况选择最合适的通信方式。
563 0
【react从入门到精通】React父子组件通信方式详解(有示例)
React-其它内容-Portals 和 React-父子组件通讯-类组件
React-其它内容-Portals 和 React-父子组件通讯-类组件
57 0
|
前端开发
React-父子组件通讯-函数式组件
React-父子组件通讯-函数式组件
66 0
|
前端开发
react 父子组件传参
react 父子组件传参