https://www.jianshu.com/p/fb915d9c99c4
父组件向子组件传值
父组件通过向子组件传递props, 子组件得到props后进行相应的处理。
/* 父组件 App.js */import React,{ Component } from "react";import Sub from "./SubComponent.js";import "./App.css";export default class App extends Component{render(){return(<div><Sub title = "今年过节不收礼" /></div>)}}/* 子组件 SubComponent.js */import React from "react";const Sub = (props) => {return(<h1>{ props.title }</h1>)}export default Sub;
子组件向父组件传值
父组件将一个函数作为 props 传递给子组件,子组件调用该回调函数,便可以向父组件通信。
/* 父组件 App.js */import React,{ Component } from "react";import Sub from "./SubComponent.js";import "./App.css";export default class App extends Component{callback(msg){console.log(msg);}render(){return(<div><Sub callback = { this.callback.bind(this) } /></div>)}}/* 子组件 SubComponent.js */import React from "react";const Sub = (props) => {const cb = (msg) => {return () => {props.callback(msg)}}return(<div><button onClick = { cb("我们通信把") }>点击我</button></div>)}export default Sub;
跨级组件之间通信
所谓跨级组件通信,就是父组件向子组件的子组件通信,向更深层的子组件通信。跨级组件通信可以采用下面两种方式:
- 中间组件层层传递 props
- 使用 context 对象
对于第一种方式,如果父组件结构较深,那么中间的每一层组件都要去传递 props,增加了复杂度,并且这些 props 并不是这些中间组件自己所需要的。不过这种方式也是可行的,当组件层次在三层以内可以采用这种方式,当组件嵌套过深时,采用这种方式就需要斟酌了。
使用 context 是另一种可行的方式,context 相当于一个全局变量,是一个大容器,我们可以把要通信的内容放在这个容器中,这样一来,不管嵌套有多深,都可以随意取用。
使用 context 也很简单,需要满足两个条件:
- 上级组件要声明自己支持 context,并提供一个函数来返回相应的 context 对象
- 子组件要声明自己需要使用 context
下面以代码说明,我们新建 3 个文件:父组件 App.js,子组件 Sub.js,子组件的子组件 SubSub.js。
/* App.js */import React, { Component } from 'react';import PropTypes from "prop-types";import Sub from "./Sub";import "./App.css";export default class App extends Component{// 父组件声明自己支持 contextstatic childContextTypes = {color:PropTypes.string,callback:PropTypes.func,}// 父组件提供一个函数,用来返回相应的 context 对象getChildContext(){return{color:"red",callback:this.callback.bind(this)}}callback(msg){console.log(msg)}render(){return(<div><Sub></Sub></div>);}}/* Sub.js */import React from "react";import SubSub from "./SubSub";const Sub = (props) =>{return(<div><SubSub /></div>);}export default Sub;/* SubSub.js */import React,{ Component } from "react";import PropTypes from "prop-types";export default class SubSub extends Component{// 子组件声明自己需要使用 contextstatic contextTypes = {color:PropTypes.string,callback:PropTypes.func,}render(){const style = { color:this.context.color }const cb = (msg) => {return () => {this.context.callback(msg);}}return(<div style = { style }>SUBSUB<button onClick = { cb("我胡汉三又回来了!") }>点击我</button></div>);}}
