我的回答

props
redux
eventEmiter
context
provider, customer

参考回答

react组件间通信常见的几种情况:

  • 父组件向子组件通信
  • 子组件向父组件通信
  • 跨级组件通信
  • 非嵌套关系的组件通信

1.父组件向子组件通信:父组件通过props向子组件传递需要的信息

  1. // 子组件Child
  2. const Child = props => {
  3. return <p> {props.name} </p>
  4. }
  5. //父组件Parent
  6. const Parent=()=>{
  7. return <Child name="zhufeng"></Child>
  8. }

2.子组件向父组件通信:props+回调的方式

  1. //子组件Child
  2. const Child=props=>{
  3. const cb=msg=>{
  4. return ()=>{
  5. props.callback(msg)
  6. }
  7. }
  8. return (
  9. <button onClick={cb("你好世界")}>sunny</button>
  10. )
  11. }
  12. //父组件 Parent
  13. class Parent extends Component{
  14. callback(msg){
  15. console.log(msg);
  16. }
  17. render(){
  18. return <Child callback={this.callback.bind(this)}></Child>
  19. } }

3.跨级组件通信:即父组件向子组件的子组件通信,向更深子组件通信

  1. // 使用props,利用中间组件层层传递,但是如果父组件结构较深,那么中间每一层组件都要去传递props,增加了复杂度,并且这些props并不是中间组件自己需要的。
  2. // 使用context,context相当于一个大容器,我们可以把要通信的内容放在这个容器中,这样不管嵌套多深,都可以随意取用,对于跨越多层的全局数据可以使用context实现
  3. // context方式实现跨级组件通信
  4. // context设计目的是为了共享那些对于一个组件而言是"全局"的数据 const BatteryContext=createContext();
  5. // 子组件的子组件
  6. class GrandChild extends Component{
  7. render(){
  8. return(
  9. <BatteryContext.Consumer>
  10. {
  11. color=><h1 style={{"color":color}}>红色的:{{color}}</h1>
  12. }
  13. </BatteryContext.Consumer>
  14. )
  15. }
  16. }
  17. //子组件
  18. const Child=()=>{
  19. return(<GrandChild/>)
  20. }
  21. //父组件
  22. class Parent extends Component{
  23. state={color:'red'}
  24. render(){
  25. const {color}=this.state
  26. return(
  27. <BatteryContext.Provider value={color}>
  28. <Child></Child>
  29. </BatteryContext.Provider>
  30. )
  31. }
  32. }

4.非嵌套关系的组件通信:既没有任何包含关系的组件,包括兄弟组件以及不在同一个父级中的非兄弟组件

  • 1)可以使用自定义事件通信(发布订阅模式)
  • 2)可以通过redux等进行全局状态管理
  • 3)如果是兄弟组件通信,可以找到这两个兄弟节点共同的父节点,结合父子间通信方式进行通信