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事件,完成事件传递~

目录
相关文章
|
11月前
|
前端开发
React-父子组件通讯
React-父子组件通讯
42 0
React-父子组件通讯
|
10月前
|
前端开发 JavaScript
react-兄弟-父子组件共享状态-useContext
react-兄弟-父子组件共享状态-useContext
75 0
|
前端开发
VUE3.0 在父子组件中相互触发组件的函数方法
VUE3.0 在父子组件中相互触发组件的函数方法
353 0
|
24天前
|
存储 前端开发 JavaScript
|
2月前
|
JavaScript
|
4月前
|
前端开发
React数据通信父传子和子传父的使用
React数据通信父传子和子传父的使用
|
4月前
|
存储 JavaScript 前端开发
父子组件通信:有效地在Vue组件树中传递数据
【4月更文挑战第24天】Vue.js中的组件通信是实现可维护和可扩展代码的关键。遵循单向数据流原则,数据从父组件通过`props`传给子组件,子组件通过`$emit`触发事件响应。常用通信方式包括:1) `Props`和`Events`基础通信;2) `Provide / Inject`跨级通信;3) 使用Vuex管理复杂状态;4) 共享祖先组件或Vuex处理非父子组件通信;5) 少量使用`ref`和`$parent / $children`直接访问。选择合适的方式能优化应用性能和用户体验。
41 0
|
4月前
|
前端开发
React组件通信:如何优雅地实现组件间的数据传递
React组件通信:如何优雅地实现组件间的数据传递
120 0
|
4月前
|
JavaScript 前端开发 小程序
Vue、React和小程序中的组件通信:父传子和子传父的应用
Vue、React和小程序中的组件通信:父传子和子传父的应用
68 0
|
10月前
|
前端开发 JavaScript 小程序
Vue、React和小程序中的组件通信:父传子和子传父
Vue、React和小程序中的组件通信:父传子和子传父
62 0