如何使本地存储在反应中反应?

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)

登录后,我搬到了家,在这样做的同时,我想删除导航栏中仅显示经过身份验证的所有内容,就像在本例中以及一般其他场景中一样。

我在这里缺少什么吗?谢谢您的友善答复。

SoG*_*gly 3

所以在这种情况下你需要 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)