首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用本地存储的Logot函数

使用本地存储的Logot函数
EN

Stack Overflow用户
提问于 2021-03-28 16:34:29
回答 1查看 42关注 0票数 0

所以这里我通过本地存储令牌实现了登录功能。在开发工具/应用程序中创建用户时,我会获得令牌,它会将我重定向到主页。但是它应该显示注销而不是登录,当我登录时,它没有这样做,我不知道为什么。任何帮助都会很方便

上下文

代码语言:javascript
运行
AI代码解释
复制
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 };

登录组件

代码语言:javascript
运行
AI代码解释
复制
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;

标题

代码语言:javascript
运行
AI代码解释
复制
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>
    )
}

登录链接

代码语言:javascript
运行
AI代码解释
复制
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>;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-28 16:52:56

代码语言:javascript
运行
AI代码解释
复制
// here you get "authToken", so you hope user is Object struct, not string.
function getUserFromLocalStorage() {
    return localStorage.getItem("authToken")
      ? JSON.parse(localStorage.getItem("authToken"))
      : { username: null, token: null };
  }

// here you store "authToken"
localStorage.setItem("authToken", JSON.parse({ username: data.username || "", token: data.token }))
user.token = data.token;
setUser(user)

// here you use token in "authToken"
if (user.token) {
    return (
      <button
        onClick={() => {
          logoutHandler();
        }}
        className="login-btn"
      >
        logout
      </button>
    );
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66843694

复制
相关文章
在 Emacs 中编辑 crontab
一般来说,编辑 crontab 时可以用 crontab -e ,它会读取 EDITOR 环境变量来决定需要打开的编辑器,比如:
飞驰的西瓜
2023/03/01
6870
在 Emacs 中编辑 crontab
在 Docker 容器中编辑文件
我希望每次在docker容器中安装vi的时候谁会给我1美元...我想要一个在运行的docker容器编辑文件的更简单的方式。首先,尝试避免编辑文件,这违背了容器的哲学理念(见最后一段)。
星哥玩云
2022/07/03
5.5K0
在 Docker 容器中编辑文件
使用nano在Linux中编辑文件
GNU nano,简称nano,是大多数Linux发行版的基本内置编辑器。GNU nano是一个小巧友好的文本编辑器. 与基本的文本编辑相比,nano提供许多额外的特性,例如:交互式的查找和替换,定位到指定的行列,自动缩进,特性切换,国际化支持,以及文件名标记完成。本教程中,我们将介绍一些帮助您入门的基本知识。
风研雨墨
2018/08/17
7.4K0
【6】VScode 无法在终端输入问题,提示:无法在只读编辑器中编辑
2.在设置中输入 run code config 找到里面的 run in terminal 打勾即可,往下滑动几秒就看到了
汀丶人工智能
2022/12/21
7.3K0
【6】VScode 无法在终端输入问题,提示:无法在只读编辑器中编辑
在 Hue 中启用 Phoenix SQL 编辑器
在CDP7.1.8开始,Hue支持了很多编辑器,这里介绍了在CDP7.1.8中配置Hue支持Phoenix SQL。
大数据杂货铺
2022/12/02
1.7K0
在 Hue 中启用 Phoenix SQL 编辑器
在可编辑div中定位光标和设置光标
当我们去点击一个输入框的时候,就会产生一个选中对象 selection,就是我们可以看到的文字变成蓝色的那个区域,selection在火狐浏览器可以直接用 window.getSelection()获取,在HTML里面,selection只有一个的,并且selection是一个区域,你可以想象成一个长方形,它是有开始和结束的。
越陌度阡
2020/11/26
9.6K0
在 Vim 编辑器中开发 Python 应用的 Vim 插件
企鹅号小编
2018/01/05
1.8K0
在 Vim 编辑器中开发 Python 应用的 Vim 插件
使用LaTex语法在MD编辑器内编辑公式
编辑公式这个任务一直也没有什么好的办法,目前也是,因为LaTex的环境在Ubuntu里面。懒得打开了,就用MD写了。
云深无际
2021/12/02
1.2K0
使用LaTex语法在MD编辑器内编辑公式
在pycharm中如何使用anaconda环境进行编辑_pycharm中导入pygame
2. 将pyinstaller tool加入到pycharm的 extern tool中
全栈程序员站长
2022/09/27
2.5K0
在pycharm中如何使用anaconda环境进行编辑_pycharm中导入pygame
在 STEP 7 (TIA Portal) 中,如何打开、编辑及升级全局库?
为了打开一个全局库, TIA Portal 的版本必须等于或者高于库的版本。如果不是这样, 则必须升级全局库。
剑指工控
2021/11/09
5.2K0
在 STEP 7 (TIA Portal) 中,如何打开、编辑及升级全局库?
SharePoint中在线编辑文档
我一直以为只有在Document Library里面的File才会支持在线编辑。直到今天早上我才发现用IE打开List里面的Attachments也是支持在线编辑的,但前提是必须是IE浏览器。 目前正在开发的项目,我开始设计时是把所有的审批信息存放在List中,上传的文档以Attachments形式保存于List中,昨天客户来公司,我演示的时候,用Chrome打开附件,直接下载了(以后建议用IE),客户需要在线编辑功能,还狠狠的批了我们一顿,附件不能在线编辑,那我审核个毛线。(其实是可以的,用IE就行。
用户1161731
2018/01/11
3.1K0
SharePoint中在线编辑文档
在VSCode中编辑HTML文档时,在Dom标签上写style属性时智能提示的问题
首先在VSCode中打开一个HTML文件 然后点右下角的“选择语言模式” image.png 然后点击配置HTML语言的基础设置 image.png 然后在打开的界面中(右侧) 输入如下代码 { "editor.quickSuggestions": { "other": true, "comments": true, "strings": true }, "[html]": { } } 然后重启VSCode 再试试看
liulun
2018/01/12
3.2K0
在VSCode中编辑HTML文档时,在Dom标签上写style属性时智能提示的问题
0677-在CDSW1.6中使用你喜爱的编辑器
自2017年Cloudera Data Science Workbench(CDSW)推出以来,我们一直致力于加速企业数据科学从研究到生产。我们正在帮助IQVIA和Deutsche Telekom等数百家客户建立自己的AI工厂,使大型数据科学团队能够安全,自助地访问业务数据,计算资源以及开源工具和库,这样他们能够更快的创新和影响业务。
Fayson
2019/07/30
1.1K0
0677-在CDSW1.6中使用你喜爱的编辑器
页面状态保持机制(编辑中)
Web应用程序中,有很多状态需要在页面的反复回调中能够保持住,还有一些状态需要在页面之间保持。对于状态的保持,是一个值得研究的问题。状态处理不当是页面失效或错误的一个重要的原因。 对于ASPX页面来说,控件可以通过VIEWSTATE来保持状态。VIEWSTATE机制非常好用,有时甚至可以用来保存页面后台代码中属性变量的状态值:因为变量的状态在回调时是不保存的,但是控件的状态却可以保持,因此可以通过控件来保持变量的状态,把控件设置为隐藏状态就不影响页面显示了。 但是VIEWSTATE却不能包打天下,我们的很多
用户1075292
2018/01/23
1.2K0
在 Linux 命令行上编辑 PDF
你收到的许多文件都是 PDF 格式的。有时这些 PDF 需要进行处理。例如,可能需要删除或添加页面,或者你可能需要签署或修改一个特定的页面。
用户1880875
2021/09/07
2.1K0
在鼠标右键上加入使用notepad++编辑
个人博客:https://suveng.github.io/blog/​​​​​​​ 在鼠标右键上加入使用notepad++编辑 阅读原文
suveng
2019/09/18
1.2K0
WinEdit编辑器中中文乱码
这个问题困扰了我很久。我的电脑上装的CTEX的最新版本,原来我的系统是windows 7 64位系统。装好了CTEX之后,在里面可以直接输入中文,显示和编译生成的PDF文件都正常。但是后来系统崩溃了一
24K纯开源
2018/01/18
1.6K0
WinEdit编辑器中中文乱码
linux中C++文件编辑操作
/先安装一下c++的配置环境 yum install –y gcc gcc-c++ readline-devel gcc-objc gcc-objc++ libobjc
知识浅谈
2020/03/25
3.5K0
点击加载更多

相似问题

为什么PKDrawing() != PKDrawing()?(PencilKit)

24

PKDrawing /个人笔画在PencilKit中的界

211

如何修改PKDrawing中的单个笔画?- PencilKit / SwiftUI

10

在Swift中使用PencilKit。将PKDrawing保存到数据库中的最佳方法是什么?如何序列化?

13

PencilKit in SwiftUI

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档