父组件向子组件通信

父组件向子组件传递props

子组件向父组件通信

父组件向子组件通过props传递回调函数,子组件在特定时间执行回调函数把数据传给父组件

跨级组件之间通信

跨级组件通信就是指父组件向子组件的子组件通信,方法有两个

  • 通过中间组件层层传递props
  • 使用context对象

第一种方式如果组件嵌套层次深,那么层层传递props的方法使得代码变得复杂,并且这些props不是中间组件所需要的

使用context要满足两个条件:

  • 上级组件要自己声明支持context,并且使用一个方法返回context
  • 子组件要声明自己使用context

App组件

  1. import React, { Component } from 'react';
  2. import PropTypes from "prop-types";
  3. import Sub from "./Sub";
  4. export default class App extends Component{
  5. // 父组件声明自己支持 context
  6. static childContextTypes = {
  7. value:PropTypes.string,
  8. callback:PropTypes.func,
  9. }
  10. state = {
  11. value: "wstreet"
  12. }
  13. // 父组件提供一个函数,用来返回相应的 context 对象
  14. getChildContext = () => {
  15. return{
  16. value: this.state.value,
  17. callback: this.callback
  18. }
  19. }
  20. callback = (msg) => {
  21. console.log(msg)
  22. }
  23. render(){
  24. return(
  25. <div>
  26. <Other>
  27. <Sub />
  28. </Other>
  29. </div>
  30. );
  31. }
  32. }

Sub组件

  1. import React,{ Component } from "react";
  2. import PropTypes from "prop-types";
  3. export default class Sub extends Component{
  4. // 子组件声明自己需要使用 context
  5. static contextTypes = {
  6. value: PropTypes.string,
  7. callback: PropTypes.func,
  8. }
  9. onClick = () => {
  10. const { callback, value } = this.context
  11. callback(`${value}回来了`)
  12. }
  13. render(){
  14. const { value } = this.context
  15. return(
  16. <div>
  17. {value}
  18. <button onClick = { this.onClick }>点击我</button>
  19. </div>
  20. );
  21. }
  22. }

非嵌套组件通信

  • 利用二者共同父组件的 context 对象进行通信
  • 使用自定义事件机制的方式

全局状态管理工具

Redux