子组件将数据传递给父组件
import React from 'react';
class Son extends React.Component {
constructor(props) {
super(props);
this .state = {
name: 'xiebenyin'
}
}
render() {
return (
Son
this .props.myFn(this .state.name)}>按钮
)
}
}
class App extends React.Component {
render() {
return (
App
this .myFn(name)} />
)
}
myFn(name) {
alert(name);
}
}
export default App;
在父组件 App 中定义一个 myFn 函数并且该函数接收一个参数
在使用子组件 Son 时传递一个参数 myFn ,然后在子组件中触发该函数时传递参数
当层级复杂时,这种从内向外的传递十分不方便
使用第三方包解决
安装
npm i events
使用
import React from 'react'
import {EventEmitter} from 'events'
// 创建全局事件管理器对象
const eventBus = new EventEmitter()
class Son extends React.Component {
render() {
return (
Son
this .btnClick()}>按钮
)
}
btnClick = () => {
// 触发 myFnEvent 事件
eventBus.emit('myFnEvent' , 'xiebenyin')
}
}
class Father extends React.Component {
render() {
return (
Father
)
}
}
class App extends React.Component {
componentDidMount() {
// 注册一个事件 myFnEvent
eventBus.addListener('myFnEvent', this .myFn)
}
render() {
return (
App
)
}
myFn = (name) => {
alert(name);
}
}
export default App;
从 events 包中解构导入 EventEmitter 对象
创建一个全局事件管理器对象 eventBus
在祖先 App 组件中通过 eventBus.addListener 函数注册一个 myFnEvent 事件
在后代 Son 组件中通过 eventBus.emit 函数触发 myFnEvent 事件, eventBus.emit 第二个参数及后面所有的参数是传递给该事件的参数
组件卸载时调用 eventBus.removeListener('myFnEvent'); 删除其对应的事件