Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在react中使localStorage反应?

如何在react中使localStorage反应?
EN

Stack Overflow用户
提问于 2021-11-07 07:33:30
回答 2查看 144关注 0票数 4

我使用localStorage在登录时保存用户数据。我已经将其命名为"jwt_data“。我已经在saperate js文件上创建了一个函数来检索数据,如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export const auth = () => {
  if(localStorage.getItem('jwt_data')){
    return JSON.parse(localStorage.getItem('jwt_data'))
  }else{
    return false
  }
}

我在react上有一个带有<徽标,搜索栏,dropdown>的导航栏组件。我想在用户注销后隐藏它,并在我登录时显示它。我使用代码作为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const auth_user = auth()
........
<>
{auth_user ? (// if logged in..... )  : (// if user is logged out........)

</>

它确实起作用了。但问题是,它不是反应性的。我需要重新加载网站才能看到这种效果。

我还尝试使用其他方法,比如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const [auth_user, setAuth_user] = useState(false)
useEffect(() => {
 if(auth()) {setAuth_user(true)}    
 else {setAuth_user(false)}
})

它们的结果与前面的相同。我不知道我哪里错了。其他人建议使用redux和things,这对我的头脑和简单的应用程序来说太复杂了。

我的app.js看起来像这样

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

登录后,我移动到主页,同时,我想删除导航栏中的所有内容,只显示身份验证,就像在这种情况下,也是一般的其他情况。

我有什么遗漏的吗?谢谢你友善的回答。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-07 09:23:03

所以在本例中需要使用useContext。

在你的app.js中

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

然后在你的Nav.js中

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

在您的Login组件中:

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

和注销:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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>
  )
}
票数 2
EN

Stack Overflow用户

发布于 2021-11-07 09:31:14

我认为这里的问题是,您将localStorage视为您的状态,这在React空间中是不太正确的。为了让组件进行更新,您需要将此信息保持在组件可以订阅的状态。React状态(useState)或全局状态(redux、context等)。

那么你的locale存储键就是初始化这个状态(例如刷新时)的一种方式。因此,当登录状态更改时,您必须同时更新这两个状态。

为了简单起见,最好的方法是在应用程序组件中创建一个loggedIn状态,然后将loggedIn状态(导航组件)或setLoggedIn设置器(登录/注销组件)委托给子组件来更新它。

您可以找到有关如何创建利用this onelocaleStorage用法的react挂钩的示例。你可以在下面找到你的应用程序的代码,如果你使用的是链接中的useLocalStorage,或者任何其他类似的实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react';
import Nav from './Nav';
import Home from './Home';
import Login from './Login';
import Logout from './Logout';
import useLocaleStorage from 'somewhere'


function App() {
  const [loggedIn, setLoggedIn] = useLocalStorage('jwt_data', false);

  return (
    <div className="App">
      <Router>
     <Router>
      <Nav loggedIn={loggedIn} /> // and hide what's need to be hidden
      <Routes>
        <Route exact path="/home" element={<Home/>}/>
        <Route exact path="/login" element={<Login setLoggedIn={setLoggedIn} />}/>
        <Route exact path="/logout" element={<Logout setLoggedIn={setLoggedIn} />}/>
      </Routes>
      </Router>
    </div>
  );
}

然而,随着你的应用程序变得越来越复杂,你可能会重新考虑将其保持在一个内部的react状态,并使用context来避免从你的App组件到它的子组件的正确钻取。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69873857

复制
相关文章
GCC、ARM-LINUX-GCC、ARM-ELF-GCC浅析
The GNU Compiler Collection,通常简称GCC,是一套由GNU开发的编译器集,为什么是编辑器集而不是编译器呢?那是因为它不仅支持C语言编译,还支持C++, Ada, Objective C等许多语言。另外GCC对硬件平台的支持,可以所无所不在,它不仅支持X86处理器架构, 还支持ARM, Motorola 68000, Motorola 8800, Atmel AVR, MIPS等处理器架构。
全栈程序员站长
2022/07/18
6.8K0
GCC 优化级别
1. gcc中指定优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。
KINGYT
2019/10/22
8.1K0
第009课 gcc和arm-linux-gcc和Makefile
hello.c(预处理)->hello.i(编译)->hello.s(汇编)->hello.o(链接)->hello
韦东山
2020/09/30
4.9K0
第009课 gcc和arm-linux-gcc和Makefile
【图片+代码】:GCC 链接过程中的【重定位】过程分析
最近因为项目上的需要,利用动态链接库来实现一个插件系统,顺便就复习了一下关于Linux中一些编译、链接相关的内容。
IOT物联网小镇
2022/04/06
8140
【图片+代码】:GCC 链接过程中的【重定位】过程分析
arm-gcc各版本区别
从本质来讲他们都是编译器,而gcc是linux系统下面用来将代码编译成一个可执行程序的手段。编译出来的是适用于linux系统的可执行二进制文件。可执行程序其实就是一堆的0101二进制机器码。这些机器码代表什么含义只有机器本身能理解。所以你用gcc编译出来的可执行程序只有在linux系统下面可以运行。
云深无际
2020/08/12
3.4K0
arm-gcc各版本区别
Ubuntu18.04安装arm-linux-gcc交叉编译工具(附arm-linux-gcc 5.4.0包)
下载(百度云)链接:https://pan.baidu.com/s/1AeqzkboWkJDJjU9HxtXhrA 提取码:uzup
全栈程序员站长
2022/06/28
4.3K0
Ubuntu18.04安装arm-linux-gcc交叉编译工具(附arm-linux-gcc 5.4.0包)
GCC编译优化选项
查看GCC各选项打开的优化项:gcc -Q --help=optimizers。分为如下:
叫你不戴帽子
2019/01/03
8K0
arm-linux-gcc 4.3.2编译uboot 1.1.6
在第三期项目的视频中,官方提供了一整套新的工具链,bootloader, 内核和文件系统(arm-linux-gcc_4.3.2, uboot-2012.04.01, linux-3.4.2)其中uboot-2012.04.01来源于毕业班,其下载烧写功能远不如uboot-1.1.6,因此我更偏向于使用老版的Uboot。但是第三期的工具链却无法直接编译uboot-1.1.6, 现在将解决这一问题。
韦东山
2022/09/08
2.8K0
qt交叉编译环境搭建_arm linux gcc
AArch64 是随 ARMv8 ISA 一起引入的 64 位架构,用于执行 A64 指令的计算机。而且在 AArch64 状态下执行的代码只能使用 A64 指令集。,而不能执行 A32 或 T32 指令。但是,与 AArch32 中不同,在64位状态下,指令可以访问 64 位和 32 位寄存器。
全栈程序员站长
2022/11/07
6.6K0
qt交叉编译环境搭建_arm linux gcc
Linux系统中使用GCC CPU参数优化代码编译
在编译程序时,借助参数传递的方法,使用与系统CPU相匹配的gcc参数,编译出的程序就是为系统CPU而进行特定优化过的,因而执行速度和效率都会是最好。
一见
2018/08/07
2.4K0
arm 开发板更新 gcc/gcc++ | Debain 更新 gcc,无需编译直接更新 gcc
网上的方法,大多是copy的,要下载gcc源码包,然后编译。我想说,你就算用 8G 内存的电脑,解压、配置、编译,没几个小时搞不来。
痴者工良
2021/04/26
7990
ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍[通俗易懂]
  在讲解各编译器之前,必须先了解一下以下这些文件。这些文件在编译器目录下或者编译生成目标平台的可执行程序时经常见到。此外,还需要注意区分 Windows 平台 和 Linux 平台的文件。
全栈程序员站长
2022/06/28
15.5K0
ARM 之七 主流编译器(armcc、iar、gcc for arm、LLVM(clang))详细介绍[通俗易懂]
STM32高级开发——gcc-arm-none-eabi
素材来源:https://blog.csdn.net/zhengyangliu123/article/details/54783443
李肖遥
2022/12/22
1.4K0
STM32高级开发——gcc-arm-none-eabi
遍历ArrayList的过程中移除元素的方式
原因:在匹配到第一个要删除的元素并移除时,后面元素会往前移位,导致索引位置改变,从而漏掉后面一个元素。
全栈程序员站长
2022/09/15
6180
GCC生成的汇编代码
GCC产生的汇编代码有点难读,它包含一些我们不关心的信息。所有以 "." 开头的行都是指导汇编器和链接器的命令,称为“汇编器命令”。
Java架构师必看
2021/03/22
2.2K0
GCC生成的汇编代码
在arm上编译php
其实在arm上编译php和在x86没有太大区别,主要是很多依赖都需要重新编译,这里拿openssl和curl举例。
老高的技术博客
2022/12/29
1K0
在centos中更新gcc到6.4.0
本文由腾讯云+社区自动同步,原文地址 http://blogtest.stackoverflow.club/update-gcc-in-centos/
羽翰尘
2019/11/21
1.1K0
Ubuntu 14.04 LTS下使用arm-linux-gcc交叉编译OpenCV 2.4.9
本文介绍了如何将OpenCV库移植到ARM平台上,包括编译工具链、依赖库、配置方法以及运行时注意事项。
剑影啸清寒
2018/01/02
9.5K1
Ubuntu 14.04 LTS下使用arm-linux-gcc交叉编译OpenCV 2.4.9
点击加载更多

相似问题

GCC ARM乘法优化

223

GCC优化:使用ARM条件指令?

27

停止ARM GCC优化函数调用

217

gcc代码的ARM源代码

15

GCC优化移除功能序言与启示

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文