新版 react context的写法
祖组件:
import React, { createContext, Context } from "react";
import CNode from "../components/CNode";
type propsType = {};
type stateType = {
userInfo: any,
};
//这里要导出这个上下文,下面的子孙组件哪个用到context的东西哪个就引入一下
export const InfoContext: Context<any> = createContext({
name: "",
age: 0,
});
class Test extends React.Component<propsType, stateType> {
constructor(props) {
super(props);
this.state = {
userInfo: {
name: "test",
age: -1,
},
};
}
handleClick = () => {
let info = {
name: "ls",
age: 20,
};
this.setState({
userInfo: info,
});
};
render() {
return (
<InfoContext.Provider value={this.state.userInfo}>
<button onClick={() => this.handleClick()}>传递</button>
<CNode></CNode>
</InfoContext.Provider>
);
}
}
export default Test;
子组件:
import React from "react"; import SNode from "../components/SNode"; type propsType = {}; type stateType = {}; class Test extends React.Component<propsType, stateType> { constructor(props) { super(props); this.state = {}; } render() { return ( <div> 中间的子组件 <SNode></SNode> </div> ); } } export default Test;
孙组件:
import React from "react"; import {InfoContext} from '../components/GPNode'//引入上下文 type propsType = {}; type stateType = {}; class Test extends React.Component<propsType, stateType> { constructor(props) { super(props); this.state = {}; //不写在这里的话初始化的时候不会获取到传递的context Test.contextType = InfoContext; } render() { return ( <div> 最下面的孙子组件 <br/> <label>姓名:{this.context.name}</label> <br/> <label>年龄:{this.context.age}</label> </div> ); } } export default Test;
也可以用孙组件以消费者的插件模式这么写:
import React from "react"; import { InfoContext } from "./GPNode"; //引入上下文 class Test extends React.Component { constructor(props) { super(props); this.state = {}; //不写在这里的话初始化的时候不会获取到传递的context Test.contextType = InfoContext; console.log(InfoContext); } render() { return ( <div> <label>最下面的孙子组件jsx</label> <br /> <InfoContext.Consumer> {(val) => ( <div> <label>姓名:</label> <div>{val.name}</div> <label>年龄</label> <div>{val.age}</div> </div> )} </InfoContext.Consumer> </div> ); } } Test.displayName = "ssss"; export default Test;
但是这里有个问题就是没有探测出context的默认值是在哪个地方可以触发,根据官方的文档来看了半天摸不着头脑,有知道的大神麻烦赐教
积累小的知识,才能成就大的智慧,希望网上少一些复制多一些原创有用的答案

浙公网安备 33010602011771号