React中context的使用方法

App.js文件

// 引入React
import React, {Component} from 'react';
// 引入样式
import './App.css';

/*
* 详细说明:定义了三个组件:分别为App/AppChild/AppChildChild
* 组件关系:App -> AppChild 父子; App -> AppChildChild 祖;AppChild -> AppChildChild 父子;
* 通过下面案例你将领略context的使用方法
* 使用方法总结:
* 1.先创建一个Context容器对象,可以进行结构Provider及Consumer方便之后的简单应用。
* 2.包裹要用的组件,给谁用就在谁的外面包裹,使用属性关键字value进行传值,value不可改变。
* 3.在哪里使用就在哪里声明,static contextType = 容器对象名字;
* 4.使用this.content获取
* 注意上述方法只限于类式组件,如果你使用的是函数式组件,那么你应该用下面的方式去做
* <Consumer>
*   {
*        value => {
*
*        }
*    }
* </Consumer>
***/

// 创建一个Context容器对象,注意开头大写
const MyContext = React.createContext()
// 拿出Provider及Consumer
const {Provider, Consumer} = MyContext;

// 定义一个祖组件
class App extends Component {
    state = {
        username: 'Tom',
        age: 20
    }
    render() {
        const {username, age} = this.state;
        return (
            <div className="App">
                <h3>我是App组件</h3>
                <h4>我的名字:{username}</h4>
                {/*利用props给子组件AppChild传值*/}
                {/*给谁用就用Provider包裹*/}
                {/*<Provider value={username}>
                    <AppChild username={username}/>
                </Provider>*/}
                <Provider value={{username, age}}>
                    <AppChild username={username}/>
                </Provider>
            </div>
        );
    }
}

// 父级组件
class AppChild extends Component {
    render() {
        const {username} = this.props;
        return (
            <div className="AppChild">
                <h3>我是AppChild组件</h3>
                <h4>我接收来自App组件的名字是:{username}</h4>
                <AppChildChild/>
            </div>
        );
    }
}

// 子组件-类式生命
/*class AppChildChild extends Component {
    // 声明context
    static contextType = MyContext;
    render() {
        const {username, age} = this.context;
        return (
            <div className="AppChildChild">
                <h3>我是AppChildChild组件</h3>
                <h4>我接收来自App组件的名字是:{username},年龄:{age}</h4>
            </div>
        );
    }
}*/
// 子组件-函数式声明
function AppChildChild() {
    return (
        <div className="AppChildChild">
            <h3>我是AppChildChild组件</h3>
            <h4>
                <Consumer>
                    {
                        value => {
                            return `我接收来自App组件的名字是:${value.username},年龄:${value.age}`
                        }
                    }
                </Consumer>
            </h4>
        </div>
    )
}

export default App;

App.css文件

.App {
  background-color: blue;
  font-size: 20px;
  padding: 10px;
  color: #ffffff;
}
.AppChild {
  background-color: orange;
  font-size: 20px;
  padding: 10px;
  color: #ffffff;
}
.AppChildChild {
  background-color: red;
  font-size: 20px;
  padding: 10px;
  color: #ffffff;
}