【问题标题】:React context returns undefined反应上下文返回未定义
【发布时间】:2019-08-20 12:10:21
【问题描述】:

我想在 React 中使用上下文将身份验证信息传递给子组件。我的上下文提供程序位于一个名为 AuthContext.js 的文件中:

import React, { Component, createContext } from 'react';

export const AuthContext = createContext();

class AuthContextProvider extends Component {
    state = {
        isAuthenticated: false
    };
    toggleAuth = () => {
        this.setState({ isAuthenticated: !this.state.isAuthenticated });
    };
    render() {
        return (
            <AuthContext.Provider value={{...this.state, toggleAuth: this.toggleAuth}}>
                {this.props.children}
            </AuthContext.Provider>
        );
    }
}

export default AuthContextProvider;

但是当我从子组件访问上下文时,它返回undefined

import { AuthContext } from "../contexts/AuthContext";

export default function ButtonAppBar() {
    return(
        <AuthContext.Consumer>{(authContext) => {
            console.log(authContext);
        }}</AuthContext.Consumer>
    );
}

在查看了 React Developer Tools 之后,我发现 ButtonAppBar 不在 AuthContextProvider 中。导入是正确的。除了导入错误之外还有什么原因吗?

React 版本: 16.9.0

【问题讨论】:

  • 您如何使用 AuthContextProvider?你用的是什么版本的反应?
  • @Federkun 我正在使用 React 16.9.0。我正在使用上下文消费者来访问上下文……如果这就是你要问的?
  • 我在问你是否可以确认AuthContextProvider被用作ButtonAppBar的父组件,也许可以提供一个例子

标签: javascript reactjs react-context


【解决方案1】:

如果您查看此working codesandbox,您会发现您的代码是正确的,并且如果您一切正常,应该可以正常工作。

使其无法正常工作的原因

  • 可能你导入错误了?请检查您的导入方式。
  • 可能ButtonAppBar 不在AuthContextProvider 内。

为了使上下文起作用,消费者需要在提供者内部。

这会起作用

  <AuthContextProvider>
    <ButtonAppBar /> {// consumer inside the provider }
  </AuthContextProvider>

这行不通

  <AuthContextProvider>
      ...
  </AuthContextProvider>
  <ButtonAppBar /> {// consumer outside the provider }

在问题的屏幕截图中,您没有 AuthContextProvider 包装路线,因此您将永远无法获得上下文。

您没有正确提供代码,但我猜您需要做的是

<App>
    <AuthContextProvider> {// AuthContextProvider wrapping routes so you can get the context}
        <BrowserRouter>
            ...
        </BrowserRouter>
    </AuthContextProvider>
</App>

【讨论】:

  • 这是第二个原因。我已经更新了我的问题,你能看看吗?
  • @AnubhavDas 请分享您在哪里以及如何使用AuthContextProviderButtonAppBar
  • 在你的截图中,你没有使用AuthContextProvider,你应该把它放在路由器周围,这样所有路由都可以有这个上下文。
【解决方案2】:

关闭我的朋友。您的子组件正在执行 anónimo us 函数,并且该回调由浏览器执行,如果您 console.log this 您将看到这是 window 并且您可以想象 window 没有该功能

【讨论】:

  • "如果你 console.log this" 为什么? OP 永远不会在 ButtonAppBar 中使用 this。 “你可以想象窗口没有那个功能”哪个功能? OP 需要做什么来解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多