React Context API 在传递 null 时不起作用
React Context API doesn't work when passing null
我正在为一个 React/Firebase 应用程序设置身份验证,我希望用户的登录 in/off 状态是全局的,因此我可以有条件地呈现某些元素(在任何组件中)基于那种状态。
我从firebase中拉取当前用户状态,设置为context,如下:
FirebaseContext.js
import { auth } from "./firebaseConfig";
import { createContext } from "react";
export const FirebaseContext = createContext()
const user = auth.currentUser
const FirebaseContextProvider = (props) => {
return(
<FirebaseContext.Provider value = {user}>
{props.children}
</FirebaseContext.Provider>
)
}
export default FirebaseContextProvider
问题是这样的 - 当用户的状态为注销时,传递下来的 user
值为 null
。当我尝试在我使用上下文的任何组件中解构 user
属性 时,这会使我的应用程序崩溃:
Uncaught TypeError: Cannot destructure property 'user' of '(0 , react__WEBPACK_IMPORTED_MODULE_0__.useContext)(...)' as it is null.
...这是我使用上下文的 header 组件的第一部分:
import { useContext, useRef } from 'react'
import { FirebaseContext } from '../FirebaseContext';
import { Link } from 'react-router-dom'
import { getAuth, signOut } from "firebase/auth";
const Header = () => {
const { user } = useContext(FirebaseContext)
...以及我如何设置我的应用程序
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Landing from './pages/landing'
import Venue from './pages/venues'
import SignUp from './pages/sign-up';
import Login from './pages/login';
import FirebaseContextProvider from './FirebaseContext'
import './styles.css';
function App() {
return (
<FirebaseContextProvider>
<Router>
<div>
<Routes>
<Route path = '/' exact element = {<Landing />} />
<Route path = '/venue/:id' element = {<Venue/>}/>
<Route path = '/signup' element = {<SignUp/>}/>
<Route path = '/login' element = {<Login/>}/>
</Routes>
</div>
</Router>
</FirebaseContextProvider>
);
}
export default App;
我尝试在 FirebaseContext.js
中设置一个条件来克服这个问题,return 一个我将用来有条件地渲染元素的字符串:
const activeUser = user ? user : 'no active user'
,但这并没有帮助,因为它 returned undefined
。
有什么建议吗?
上下文提供者的值是一个对象。要在传入 null 时避免此问题,请尝试这样做:
const FirebaseContextProvider = (props) => {
return(
<FirebaseContext.Provider value = {{user}}>
{props.children}
</FirebaseContext.Provider>
)
}
我正在为一个 React/Firebase 应用程序设置身份验证,我希望用户的登录 in/off 状态是全局的,因此我可以有条件地呈现某些元素(在任何组件中)基于那种状态。
我从firebase中拉取当前用户状态,设置为context,如下:
FirebaseContext.js
import { auth } from "./firebaseConfig";
import { createContext } from "react";
export const FirebaseContext = createContext()
const user = auth.currentUser
const FirebaseContextProvider = (props) => {
return(
<FirebaseContext.Provider value = {user}>
{props.children}
</FirebaseContext.Provider>
)
}
export default FirebaseContextProvider
问题是这样的 - 当用户的状态为注销时,传递下来的 user
值为 null
。当我尝试在我使用上下文的任何组件中解构 user
属性 时,这会使我的应用程序崩溃:
Uncaught TypeError: Cannot destructure property 'user' of '(0 , react__WEBPACK_IMPORTED_MODULE_0__.useContext)(...)' as it is null.
...这是我使用上下文的 header 组件的第一部分:
import { useContext, useRef } from 'react'
import { FirebaseContext } from '../FirebaseContext';
import { Link } from 'react-router-dom'
import { getAuth, signOut } from "firebase/auth";
const Header = () => {
const { user } = useContext(FirebaseContext)
...以及我如何设置我的应用程序
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Landing from './pages/landing'
import Venue from './pages/venues'
import SignUp from './pages/sign-up';
import Login from './pages/login';
import FirebaseContextProvider from './FirebaseContext'
import './styles.css';
function App() {
return (
<FirebaseContextProvider>
<Router>
<div>
<Routes>
<Route path = '/' exact element = {<Landing />} />
<Route path = '/venue/:id' element = {<Venue/>}/>
<Route path = '/signup' element = {<SignUp/>}/>
<Route path = '/login' element = {<Login/>}/>
</Routes>
</div>
</Router>
</FirebaseContextProvider>
);
}
export default App;
我尝试在 FirebaseContext.js
中设置一个条件来克服这个问题,return 一个我将用来有条件地渲染元素的字符串:
const activeUser = user ? user : 'no active user'
,但这并没有帮助,因为它 returned undefined
。
有什么建议吗?
上下文提供者的值是一个对象。要在传入 null 时避免此问题,请尝试这样做:
const FirebaseContextProvider = (props) => {
return(
<FirebaseContext.Provider value = {{user}}>
{props.children}
</FirebaseContext.Provider>
)
}