React+Firebase项目中App.js调用useAuth()获取Context返回undefined
问题解决
核心原因
React Context API存在作用域限制,useContext(AuthContext)只能获取调用该Hook的组件**上层最近的AuthContext.Provider**提供的值。你当前的组件结构大概率是将AuthProvider放在了App组件的返回内容里,App本身处于Provider的外层,自然无法获取Context值,返回undefined;而LoginPage等子组件属于AuthProvider的children,在作用域范围内,所以可以正常获取。
错误结构示例:
function App() { const auth = useAuth() // App在Provider外层,拿不到上下文 return ( <AuthProvider> <LoginPage /> {/* 子组件在Provider内部,可正常获取 */} </AuthProvider> ) }
解决方案
方案1:将AuthProvider移到App外层
在入口文件index.js中用AuthProvider包裹整个App组件,让App处于Provider作用域内:
// index.js 代码 import React from 'react' import ReactDOM from 'react-dom/client' import App from './App' import { AuthProvider } from './providers/AuthProvider' const root = ReactDOM.createRoot(document.getElementById('root')) root.render( <AuthProvider> <App /> </AuthProvider> )
修改后直接删除App组件内部的AuthProvider标签即可,此时App内调用useAuth就能正常获取值。
方案2:拆分逻辑到内层子组件
如果不想修改入口文件,可将需要用到useAuth的逻辑抽离为子组件,放在AuthProvider内部:
// 修改后的App.js import { AuthProvider, useAuth } from './providers/AuthProvider' // 内层业务组件,处于Provider作用域内 function AppContent() { const auth = useAuth() console.log({ auth }) // 可正常获取值 return ( {/* 原有App组件的业务内容 */} <LoginPage /> ) } function App() { return ( <AuthProvider> <AppContent /> </AuthProvider> ) } export default App
额外注意
你当前的AuthProvider.js代码中,导出的Context value里引用了未定义的signup方法,运行时会抛出引用错误,记得补全该方法的实现。
内容的提问来源于stack exchange,提问作者MarcL
相关产品推荐
相关产品推荐

