Raj*_*boy 5 javascript local-storage reactjs
我正在使用 localStorage 来保存登录时的用户数据。我将其保存为“jwt_data”。我在单独的 js 文件上创建了一个函数来检索该数据
export const auth = () => {
if(localStorage.getItem('jwt_data')){
return JSON.parse(localStorage.getItem('jwt_data'))
}else{
return false
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个导航栏组件与<徽标,搜索栏,下拉菜单>反应。我想在用户注销后隐藏它并在我登录后显示。我使用代码作为
const auth_user = auth()
........
<>
{auth_user ? (// if logged in..... ) : (// if user is logged out........)
</>
Run Code Online (Sandbox Code Playgroud)
它确实有效。但问题是它不是反应性的。我需要重新加载网站才能看到效果。
我也尝试使用其他例如
const [auth_user, setAuth_user] = useState(false)
useEffect(() => {
if(auth()) {setAuth_user(true)}
else {setAuth_user(false)}
})
Run Code Online (Sandbox Code Playgroud)
其结果与之前相同。我不知道我错在哪里。其他人建议使用 redux 和 things,这对于我的头脑和我的简单应用程序来说太复杂了。
我的 app.js 看起来像这样
import React from 'react';
import Nav from './Nav';
import Home from './Home';
import Login from './Login';
import Logout from './Logout';
function App() {
return (
<div className="App">
<Router>
<Router>
<Nav/>
<Routes>
<Route exact path="/home" element={<Home/>}/>
<Route exact path="/login" element={<Login/>}/>
<Route exact path="/logout" element={<Logout/>}/>
</Routes>
</Router>
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
登录后,我搬到了家,在这样做的同时,我想删除导航栏中仅显示经过身份验证的所有内容,就像在本例中以及一般其他场景中一样。
我在这里缺少什么吗?谢谢您的友善答复。
所以在这种情况下你需要 useContext 。
在你的 app.js 中
import React, { useContext } from "react";
export const AuthContext = React.createContext(null);
function App() {
const [authContext, setAuthContext] = useState(localStorage.getItem("auth"));
return (
<AuthContext.Provider value={authContext, setAuthContext}>
<Router>
<Nav/>
<Routes>
<Route exact path="/home" element={<Home/>}/>
<Route exact path="/login" element={<Login/>}/>
<Route exact path="/logout" element={<Logout/>}/>
</Routes>
</Router>
</AuthContext.Provider>
);
}
Run Code Online (Sandbox Code Playgroud)
然后在你的 Nav.js 中
import React, { useContext } from "react";
import { AuthContext } from "./App.js"
function Nav() {
const [authContext, setAuthContext] = useContext(AuthContext);
return (
authContext
? /*Navbar with user stuff*/
: /*Empty Navbar */
)
}
Run Code Online (Sandbox Code Playgroud)
并在您的登录组件中:
import React, { useContext } from "react";
import { AuthContext } from "./App.js"
function Login() {
const [authContext, setAuthContext] = useContext(AuthContext);
const login = () => {
const jwt = "jwt"; // fetch your jwt
localStorage.setItem("auth", jwt)
setAuthContext(jwt);
}
return (
<div>Login form</div>
)
}
Run Code Online (Sandbox Code Playgroud)
和注销:
import React, { useContext } from "react";
import { AuthContext } from "./App.js"
function Logout() {
const [authContext, setAuthContext] = useContext(AuthContext);
const logout = () => {
localStorage.setItem("auth", null)
setAuthContext(null);
}
return (
<button onClick={logout}>Logout button</button>
)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1391 次 |
| 最近记录: |