public static contextType
我通过声明使用上下文的组件内部来使用 react 的新上下文 API(v16.6.0 或更高版本) 。只要声明 的组件Provider
不直接使用在其render()
方法中使用上下文的组件,这就可以正常工作。
例子:
ParentWithContext
这是创建和提供上下文的组件。
export const SomeContext = React.createContext({
someValue: false
});
export default class ParentWithContext extends Component {
public render(){
const contextValue = {someValue: true};
return (
<SomeContext.Provider value={contextValue}>
<ChildOne />
{this.props.children}
</SomeContext.Provider>
);
}
}
请注意,该组件在其方法中使用了ChildOne
组件(如下所示) 。render()
子一和子二
这两个组件只是简单地使用上述上下文并显示它。
export default class ChildOne extends Component {
public static contextType = SomeContext;
public render(){
return (
<div>
{`Context of ChildOne: ${this.context.someValue}`}
</div>
);
}
}
export default class ChildTwo extends Component {
public static contextType = SomeContext;
public render(){
return (
<div>
{`Context of ChildTwo: ${this.context.someValue}`}
</div>
);
}
}
索引.tsx
class App extends Component {
render() {
return (
<ParentWithContext>
<ChildTwo />
<ChildOne />
</ParentWithContext>
);
}
}
运行此示例将产生以下行:
Context of ChildOne: undefined
Context of ChildTwo: true
Context of ChildOne: undefined
所以ChildTwo
似乎从 接收到正确的信息this.context
,而ChildOne
没有收到任何信息。
现在出现了奇怪的部分(对我来说):当您从中删除时<ChildOne/>
,ParentWithContext
它突然对两者都ChildOne
有效ChildTwo
新的 ParentWithContext
export default class ParentWithContext extends Component {
public render(){
const contextValue = {someValue: true};
return (
<SomeContext.Provider value={contextValue}>
{this.props.children}
</SomeContext.Provider>
);
}
}
新的 HTML 输出
Context of ChildTwo: true
Context of ChildOne: true
问题
static contextType
当Provider
组件直接使用在其函数中使用上下文的子组件时,为什么上下文 API (>=v16.6) 不起作用(使用) render()
?这是错误还是已知限制?我错过了什么?
附加信息
使用<SomeContext.Consumer>
将按预期工作。
export default class ChildOne extends Component {
public render(){
return (
<SomeContext.Consumer>
{context =>
<div>
{`Context of ChildOne: ${context.someValue}`}
</div>
}
</SomeContext.Consumer>
);
}
}
当然,这不是解决此问题的方法,但可能是有用的信息。