由于一个新问题,我重新发布了一个与我上一个类似的问题。我试图在我的react应用程序中使用带有钩子的上下文来管理身份验证。我得到了错误TypeError: Cannot destructure property 'isAuthenticated' of 'Object(...)(...)' as it is undefined.
,但是当我console.log
它定义的属性时,我看到的是false
而不是undefined
。
我在authContext.js
中有上下文定义和提供程序
import React, { useState, useEffect, createContext } from "react";
import axios from "axios";
const AuthContext = createContext();
export { AuthContext };
const AuthContextProvider = (props) => {
const [isAuthenticated, setIsAuthenticated] = useState(false);
const setAuth = (boolean) => {
setIsAuthenticated(boolean);
};
const apiOptions = {
url: "users/is-verified",
method: "GET",
headers: {
token: localStorage.token,
},
};
function isAuth() {
axios(apiOptions)
.then((response) => {
console.log("auth ran");
const resData = response.data;
resData === true ? setIsAuthenticated(true) : setIsAuthenticated(false);
})
.catch((error) => {
console.log(error.response);
});
}
useEffect(() => {
isAuth();
}, []);
console.log(isAuthenticated);
return (
<AuthContext.Provider
value={{ isAuthenticated, setIsAuthenticated, setAuth }}
>
{props.children}
</AuthContext.Provider>
);
};
export default AuthContextProvider;
然后,我将路由 Package 在app.js
中的提供程序中
import React from "react";
import {
Switch,
Route,
} from "react-router-dom";
import "./App.css";
import Register from "./components/pages/register";
import AuthContextProvider from "./components/context/authContext";
import RegisterRoutes from "./components/routing/registerRoutes";
function App() {
return (
<AuthContextProvider>
<div className="App h-100 ">
<Switch>
<Route
exact
path="/register"
render={(props) => (
<RegisterRoutes {...props} />
)}
/>
</Switch>
</div>
</AuthContextProvider>
);
}
export default App;
然后,我有一个RegisterRoutes
组件,它根据isAuthenticated
值返回两个页面中的一个
import React, { useContext } from "react";
import AuthContext from "../context/authContext";
import { Redirect } from "react-router-dom";
import Register from "../pages/register";
function RegisterRoutes(props) {
const { isAuthenticated, setAuth } = useContext(AuthContext);
console.log(isAuthenticated);
return !isAuthenticated ? (
<Register {...props} setAuth={setAuth} />
) : (
<Redirect to="/login" />
);
}
export default RegisterRoutes;
7条答案
按热度按时间30byixjq1#
默认导出为AuthContextProvider(组件),而不是AuthContext(上下文对象):这不会像你期望的那样工作。此外,你正在尝试导出另一个对象中的上下文对象:
溶液1
而是正常导出上下文变量(不作为默认值):
方案2(推荐)
更好的做法是将上下文保存在单独的文件中,并将其导出为默认值:
cbeh67ev2#
我通过做一件简单的事情解决了这个问题。在index中,react-app,只需将我的提供程序涉及我的应用程序。
当我尝试在localStorage中设置日志记录时,也遇到了同样的问题。
a2mppw5e3#
对于在页面组件中使用
gatsby
和上下文API的用户:你需要用
gatsby-browser.js
和gatsby-ssr.js
中的上下文提供程序 Package 根元素。示例:
ikfrs5lh4#
尝试在App.js中定义provider中的值= {{state,dispatch}}
5sxhfpxr5#
你必须把这个{}用于在发送过程中在其他文件中写入上下文
ippsafx76#
在我的App.js文件中添加AuthState后,我的错误得到了解决。
lx0bsm1f7#
这是我解决它的方法,用
authProvider
将所有组件 Package 在app.js文件中。