https://www.cnblogs.com/universe-cosmo/p/10969351.html https://www.cnblogs.com/jokehl/p/9998163.html
16.3.0之前的设置方法为 //子组件 var HelloMessage = React.createClass({ childMethod: function(){ alert("组件之间通信成功"); }, render: function() { //子调父 return <div> <h1>Hello {this.props.name}</h1> <button onClick={this.childMethod}>子组件</button></div> } }); // 父组件 var ImDaddyComponent = React.createClass({ getDS: function(){ // 父调子 this.refs.getSwordButton.childMethod(); }, render: function(){ return ( <div> //子组件 <HelloMessage name="John" ref="getSwordButton" /> <button onClick={this.getDS}>父组件</button> </div> ); } }); ReactDOM.render( <ImDaddyComponent />, );
16.3.0之后(包括16.3.0 version)的设置方法为 import React, {Component} from 'react'; //父组件 export default class Parent extends Component { render() { return( <div> <Child onRef={this.onRef} /> <button onClick={this.click} >click</button> </div> ) } onRef = (ref) => { this.child = ref } //父调子 click = (e) => { this.child.myName() } } //子组件 class Child extends Component { componentDidMount(){ //子调父 this.props.onRef(this) } myName = () => alert('xiaohesong') render() { return ('woqu') } }
非父子传值 let eventList = {}; const $on = (eventName, cb) => { if (!eventList[eventName]) { eventList[eventName] = []; } eventList[eventName].push(cb); }; const $emit = (eventName, params) => { if (eventList[eventName]) { let arr = eventList[eventName]; arr.map(cb => { cb(params); }); } }; const $off = (eventName, cb) => { if (eventList[eventName]) { if (cb) { let index = eventList[eventName].indexOf(cb); eventList[eventName].splice(index, 1); } else { eventList[eventName].length = 0; } } }; export default { $on, $emit, $off };
One组件 render(){ return ( <div> <button onClick={this.handleTwo.bind(this)}>发送给Two组件</button> </div> ) } handleTwo(){ Observer.$emit("handle",this.state.oneVal); } Two组件 constructor(){ super(); this.state = { oneVal:"" } Observer.$on("handle",(val)=>{ this.setState({ oneVal:val }) }) } render(){ let {oneVal} = this.state; return (
接收到one组件的值为:{oneVal}
) }