【发布时间】:2018-09-03 16:27:36
【问题描述】:
我正在尝试使用 React 上下文 API 在我的应用程序中实现共享状态。
我正在树的根部创建一个errorContext 状态。错误上下文如下所示:
// ErrorContext.js
import React from 'react';
const ErrorContext = React.createContext({
isError: false,
setError: (error) => {}
});
export default ErrorContext;
期望的结果
- 我想从应用中的任何位置(特别是在 Promise 中)更新(使用)此上下文
- 理想情况下,消耗步骤应提取到导出的辅助函数中
帮助函数的示例用法
http.get('/blah')
.catch((error) => {
HelperLibrary.setError(true);
})
按照反应上下文文档:
我可以像这样创建一个提供者:
class ProviderClass {
state = {
isError: false,
setError: (error) => {
this.state.isError = error;
}
}
render() {
return (
<ErrorContext.Provider value={this.state}>
{this.props.children}
</ErrorContext.Provider>
)
}
}
然后我可以通过在渲染调用中使用 Consumer 包装器来使用此提供程序:
<ErrorContext.Consumer>
{(context) => {
context.setError(true);
}}
</ErrorContext.Consumer>
这种方法的问题
这种方法需要我团队中的每个开发人员在每次希望处理 Web 服务错误时编写大量样板代码。
例如他们必须将 ErrorContext.Consumer 放在组件 render() 方法中,并根据 Web 服务响应有条件地呈现它。
我尝试过的
在辅助函数中使用 ReactDOM.render。
const setError = (error) =>{
ReactDOM.render(
<ErrorContext.Consumer>
// boilerplate that i mentioned above
</ErrorContext.Consumer>,
document.getElementById('contextNodeInDOM')
) }
export default setError;
为什么这不起作用?
出于某种原因,ReactDOM.render() 总是将此代码放在 React 组件树之外。
<App>
...
<ProviderClass>
...
<div id="contextNodeInDOM'></div> <-- even though my node is here
...
</ProviderClass>
</App>
<ErrorContext.Consumer></ErrorContext.Consumer> <-- ReactDOM.render puts the content here
因此没有为消费者找到上下文父级,因此它默认为默认上下文(没有状态)
来自docs
如果上面这个上下文没有提供者,则 value 参数 将等于传递给 createContext() 的 defaultValue。
如果有人可以在我的下一步中帮助我,我来自 Angular,如果我的术语不正确或者我做了一些非常愚蠢的事情,我深表歉意。
【问题讨论】:
-
上下文 API 的目的是不允许从任何地方使用它,而只能在
组件内部使用,否则它不会与任何应用程序范围的变量不同。在 Angular 术语中, 执行 DI。您可以跳过样板代码,类似于答案的建议。
标签: reactjs