为啥子组件中未定义上下文?

Posted

技术标签:

【中文标题】为啥子组件中未定义上下文?【英文标题】:Why is Context undefined in child component?为什么子组件中未定义上下文? 【发布时间】:2022-01-12 11:06:33 【问题描述】:

我正在尝试学习 React 和上下文。

在以下示例中,我的控制台在 app.js 中正确记录了用户(当前已设置),但在 RequireAuth 组件(及其子组件)中未定义日志。

我可能可以将 user 和 setUser 作为 props 传递并让它们工作,但目标是了解发生了什么问题并学习如何正确使用上下文。

感谢您的帮助!

userContext.js

import React,  createContext, useContext, useState  from "react";

const UserContext = createContext();

export function useAuth() 
    return useContext(UserContext);


const UserProvider = ( children ) => 
    const [state, setState] = useState(undefined);

    return (
        <UserContext.Provider value=[state, setState]>
             children 
        </UserContext.Provider>
    );


export default UserProvider;

app.js

import React from 'react';
import  BrowserRouter as Router, Route, Routes  from 'react-router-dom';

// Components
// [...]

// Auth Components
import RequireAuth from './requireAuth';

// Context
import UserProvider from './userContext';
import  useAuth  from './userContext';

function App() 

  return (
    <Router>
      <UserProvider>
        <Main />
      </UserProvider>
    </Router>
  );


function Main() 
  const [ user, setUser ] = useAuth();
  console.log(user) // LOGS USER
  return (
    <div className="App">
      <Navbar />
      <Title />
      <Routes>
        <Route
          path="/home"
          element= 
            <RequireAuth>
              <Home />
            </RequireAuth> 
           />
      </Routes>
      <Footer />
    </div>
  )


export default App;

requireAuth.js

import React from 'react';
import  useAuth  from './userContext';


const RequireAuth = ( children ) => 
    const [ user, setUser ] = useAuth();
    console.log(user) // LOGS UNDEFINED
    
    /* Some logic running if user is set or not */

    return children;


export default RequireAuth;

【问题讨论】:

你能不能创建一个minimal reproducible example 以便我们帮助调试问题,有一些在线工具可以帮助响应应用程序,例如codesandbox。 感谢您的评论。我创建了一个代码沙盒,那里一切正常。所以它帮助我了解问题出在其他地方。 【参考方案1】:

发现问题所在。我的问题是我没有正确使用路由器链接,并且每次重置上下文时。 显示的代码,在设置正确的链接后,工作正常。

【讨论】:

你应该考虑在你的答案中添加一些代码。

以上是关于为啥子组件中未定义上下文?的主要内容,如果未能解决你的问题,请参考以下文章

错误:颤动中未定义的名称“上下文”

Nextjs:getStaticProps 中未定义的上下文

useContext 给出未定义的

TypeError:超级表达式必须为空或函数,在 ReactJS 中未定义 [重复]

清除 React Hooks 中未安装组件上的内存泄漏

为啥子组件样式被全局 css 覆盖?