当前位置: 首页 > 知识库问答 >
问题:

通过本地存储注销功能

昌和悦
2023-03-14

所以这里我有通过本地存储令牌的登录功能。我在开发工具/应用程序中创建用户时获得令牌,它将我重定向到正在工作的家庭。不起作用的是这个。创建一个用户,它正在工作,但当它加载时,它应该显示logout而不是login,并且应该隐藏购物车组件。我在哪里犯了一个错误上下文Api


import React from "react";
const UserContext = React.createContext();

function getUserFromLocalStorage() {
    return localStorage.getItem("authToken")
      ? JSON.parse(localStorage.getItem("authToken"))
      : { username: null, token: null };
  }

function UserProvider({ children }) {
  const [user, setUser] = React.useState(getUserFromLocalStorage());
  
    const history = useHistory();
    const logoutHandler = () =>{
      localStorage.removeItem("user");
      history.push("/")
  }
  return (
    <UserContext.Provider
      value={{ user, logoutHandler  }}
    >
      {children}
    </UserContext.Provider>
  );
}

export { UserContext, UserProvider };

登录链接

import React from "react";
import { Link } from "react-router-dom";
import { UserContext } from "../../context/user";
import { useHistory } from "react-router-dom"
export default function LoginLink() {

  const { user, logoutHandler } = React.useContext(UserContext);

  if (user.authToken) {
    return (
      <button
        onClick={() => {
          logoutHandler();
        }}
        className="login-btn"
      >
        logout
      </button>
    );
  }
  return <Link to="/login">login</Link>;
}

标题

import React from 'react';
import { Link, useHistory } from "react-router-dom";
import Search from './Search';
import './Header.css'
import SearchBooks from './SearchBooks';
import LoginLink from '../Signin/LoginLink';
import CartLink from '../Cart/CartLink';
import { UserContext } from '../../context/user';

const Header = () => {
const { user } = React.useContext(UserContext);

    return (
        <div className='header__container'>
            <Link to='/'>
            <img src='/audi.png' />
            </Link>  
            <li>
              <LoginLink />
            </li>
           {user.authToken &&(
            <CartLink /> 
           )    
           }      
        </div>
    )
}

export default Header

登录组件

import { useState, } from "react";
import { useHistory } from "react-router-dom"
import axios from "axios";
import { Link } from "react-router-dom";
import "./Signin.css";

const Login = () => {
  const { user, setUser } = React.useContext(UserContext);
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const [error, setError] = useState("");
  const history = useHistory()

  
  const loginHandler = async (e) => {
    e.preventDefault();
    const config = {
      header: {
        "Content-Type": "application/json",
      },
    };

    try {
      const { data } = await axios.post(
        "http://localhost:5000/api/auth/login",
        { email, password },
        config
      );

      localStorage.setItem("authToken", data.token);
      setUser(user)
      history.push("/");
    } catch (error) {
      if (error.response) {
        setError(error.response.data.error);
      }
      setTimeout(() => {
         setError("");
      }, 5000);
    }
  };

  return (
    <div className="login-screen">
      <form onSubmit={loginHandler} className="login-screen__form">
        <h3 className="login-screen__title">Login</h3>
        {error && <span className="error-message">{error}</span>}
        <div className="form-group">
          <label htmlFor="email">Email:</label>
          <input
            type="email"
            required
            id="email"
            placeholder="Email address"
            onChange={(e) => setEmail(e.target.value)}
            value={email}
            tabIndex={1}
          />
        </div>
        <div className="form-group">
          <label htmlFor="password">
            Password:{" "}
            <Link to="/forgotpassword" className="login-screen__forgotpassword">
              Forgot Password?
            </Link>
          </label>
          <input
            type="password"
            required
            id="password"
            autoComplete="true"
            placeholder="Enter password"
            onChange={(e) => setPassword(e.target.value)}
            value={password}
            tabIndex={2}
          />
        </div>
        <button type="submit" className="btn btn-primary">
          Login
        </button>

        <span className="login-screen__subtext">
          Don't have an account? <Link to="/register">Register</Link>
        </span>
      </form>
    </div>
  );
};

export default Login;

共有1个答案

督烨赫
2023-03-14

登录后,只将authToken设置到localStorage中,而不是设置到提供程序中。您需要在登录后调用setUser,以便Header组件知道user已登录。

 类似资料:
  • localStorage 本地存储 存储针对QQ帐号隔离 数据存储于本地文件中。游戏结束后不会被删除 函数 key( index) 获取对应索引的key 手q 版本7.8.5 参数 参数名 类型 说明 index number 索引值 返回值 类型 说明 string 说明 示例 var stringKey = BK.localStorage.key(0); getItem( key) 获取ke

  • 本地存储提供了localstore和sessionstore两个类。localstore使用本地文件持久化数据,因此该类存储的数据不会失效。sessionstore存储的数据会在插件运行结束时清空,因此有效期为插件运行期。localstore和sessionstore的API接口一致。 set QN.localstore.set({ query: { key: 'name'

  • 问题内容: 除了是非持久性的并且仅限于当前窗口之外,会话存储与本地存储相比是否还有其他好处(性能,数据访问等)? 问题答案: localStorage和sessionStorage都扩展了Storage。除了的预期的“非持久性”外,它们之间没有区别。 也就是说,存储在中的数据将 一直保留到明确删除为止 。所做的更改将被保存,并且可用于当前和将来对该站点的所有访问。 对于, 更改仅在每个选项卡上可用

  • 问题内容: 我想通过将所有Cookie移到本地存储中来减少其加载时间,因为它们似乎具有相同的功能。除了明显的兼容性问题以外,使用本地存储替换cookie功能是否有任何利弊(尤其是性能方面的优势)? 问题答案: Cookies和本地存储有不同的用途。Cookies主要用于读取 服务器端 ,本地存储只能由 客户端 读取。所以问题是,在您的应用程序中,谁需要此数据-客户端还是服务器? 如果它是您的客户端

  • BaaS 提供本地存储功能,皆为同步方法。 保存数据 wx.BaaS.storage.set(key, value) 如果 storage 里面 key 值对应的 value 已经存在,执行此函数会覆盖掉原来该 key 对应的 value。 参数说明 参数 类型 必填 说明 key String 是 本地存储中指定的 key 值 value Object/String 是 需要存储的内容 示例代码

  • 我的登录页面http://localhost:8080/nradmin/welcome,主页(登录成功后)http://localhost:8080/nradmin/home 我想注销,不再能够访问任何其他页面,如主页,但只能访问欢迎(登录)页面。如果我键入http://localhost:8080/nradmin/home在注销后的浏览器上,我可以继续访问主页,而无需登录。 我已经实现了从抽象类