【发布时间】:2019-03-28 18:45:45
【问题描述】:
为什么this.context 在这个 React 组件生命周期方法中是一个空对象?
该上下文在Consumer 中具有该上下文的正确值。只有this.context API 失败。
const LoremContext = React.createContext({
lorem: "ipsum",
})
class MenuItem extends React.Component {
componentDidMount() {
console.log(
"In MenuItem.componentDidMount, this.context is:",
this.context)
}
render() {
console.log(
"In MenuItem.render, this.context is:",
this.context)
return ( <LoremContext.Consumer>{
(lorem) => {
console.log("In LoremContext.Consumer, lorem is:", lorem)
return (
<li>
{ `Eat ${this.props.dish} at ${lorem}` }
</li>
)
}
}</LoremContext.Consumer> )
}
}
MenuItem.contextType = LoremContext
class Menu extends React.Component {
render() {
…
}
}
class Application extends React.Component {
render() {
return (
<LoremContext.Provider value={ this.props.world.lorem }>
<section className="app">
<Menu menuItems={ [ … ] } />
<p>Fusce varius id arcu egestas sodales</p>
</section>
</LoremContext.Provider>
)
}
ReactDOM.render(
<Application world={ { lorem: "consecteur" } } />,
document.getElementById('app-container'),
)
这是使用 React 16.4,因此它使用了 documented context API(在 React 16.3 中引入)。
根据文档化的 API,上面的代码应该可以通过两种方式访问上下文(在 React.createContext 的返回值中定义):
-
LoremContext.Consumer组件接收LoremContext.Provider传递的上下文值。然后消费者将该上下文值作为参数提供给该组件中的函数。在这种情况下,
lorem是接收上下文值的参数。 this.context属性在“生命周期方法”内接收(由于 declaredMenuItem.contextTypeclass property)上下文值。
其中只有一个对我有用。
-
LoremContext.ConsumerAPI 正在正确获取和传递上下文值。console.log输出为:
In LoremContext.Consumer, lorem is: consecteur
-
this.context没有获得正确的值,而是获得了一个空对象。console.log输出为:
In MenuItem.render, context is: Object { }
In MenuItem.componentDidMount, context is: Object { }
所以消费者收到了正确的值,但this.context 不是。为什么有区别?如何获得this.context 收到的正确值?
【问题讨论】:
-
类似的问题 stackoverflow.com/q/49809884/70157 没有回答这个问题(答案似乎假设 API 无法按文档说明工作,并提供替代解决方法)。
标签: reactjs