React - 在 componentDidMount 中访问上下文

Posted

技术标签:

【中文标题】React - 在 componentDidMount 中访问上下文【英文标题】:React - accessing context in componentDidMount 【发布时间】:2019-01-25 06:40:46 【问题描述】:

我是第一次使用 Context API,我在理解如何在生命周期方法中更新上下文时遇到了一些困难。我查看了official doc 和这个answer,这很有意义,但对我找到解决方案没有多大帮助。

我现在有 2 个组件:一个父母和一个孩子。

在父级中,我在 componentDidMount() 中使用 axios get() 请求来获取数据。

孩子使用上下文来呈现元素,因此一旦请求完成,它就需要更新的上下文。

我的主要问题是,一旦收到 axios 响应,我就无法找到更新提供程序状态的位置。理想情况下,我想将 axios 响应分配给提供者状态,但我不知道如何从那里访问上下文。

我通过将 axios 响应分配给父状态然后通过我的 Provider 的处理程序用它更新上下文提供程序状态并在我的 Consumer 下的 render() 中调用此处理程序来使其“工作”,因为它是我唯一的地方相信我可以访问上下文:

class ParentComponent extends Component 
    render() 
        return (
            <MyContext.Consumer>
                (context) => 
                    if(axiosSuccess) context.updateContextState(parentState);
                    return (
                        <ChildComponent/>
                    )
                
            </MyContext.Consumer>
        );
    

但是我知道这不是正确的实现,因为在 render() 中更新是一种反模式。

在生命周期方法中更新提供者状态的最佳方式是什么?

【问题讨论】:

请参阅***.com/questions/49809884/… 以获得答案。 【参考方案1】:

使用上下文与通常的 state/props/redux 用法没有太大区别。从上下文传递处理程序(除了值)与从父级(通过道具)相同的方式。将整个获取移动到上下文(组件)或至少传递处理程序以更新状态。查看文档中的toggleTheme

【讨论】:

以上是关于React - 在 componentDidMount 中访问上下文的主要内容,如果未能解决你的问题,请参考以下文章

在 react-router 中切换同一级别的路由时获取数据的正确方法?

React - 防止生命周期组件两次渲染相同的数据:WillReceiveProps & componentDidMount

如何在反应路由器内的任何路由上调用函数?

导航到不同屏幕时如何断开套接字

我可以将类组件更改为功能组件吗? - 反应

当我更改其中一个时,为什么所有的datepicker值都变为null?