Rob*_*ius 8 javascript node.js reactjs react-hooks
我正在制作一个身份验证系统,在后端将我重定向到前端页面后,我正在为 userData 发出 API 请求,并将该数据保存到 localStorage。然后我试图加载 Spinner 或 UserInfo。
我正在尝试使用 useEffect 侦听 localStorage 值,但登录后我得到“未定义”。当 localStorage 值更新时 useEffect 不会再次运行并且 Spinner 永远保持旋转。
我试图做:JSON.parse(localStorage.getItem('userData')),但后来我得到了一个 useEffect 无限循环。
只有当我刷新页面时,我的 localStorage 值才会出现,我可以显示它而不是 Spinner。
我做错了什么?
也许有更好的方法在准备好时加载 userData?
我正在尝试以正确的方式更新 DOM?
感谢您的回答;)
import React, { useState, useEffect } from 'react';
import { Spinner } from '../../atoms';
import { Navbar } from '../../organisms/';
import { getUserData } from '../../../helpers/functions';
const Main = () => {
const [userData, setUserData] = useState();
useEffect(() => {
setUserData(localStorage.getItem('userData'));
}, [localStorage.getItem('userData')]);
return <>{userData ? <Navbar /> : <Spinner />}</>;
};
export default Main;
Run Code Online (Sandbox Code Playgroud)
小智 17
最好在此处为 localstorage 添加事件侦听器。
useEffect(() => {
function checkUserData() {
const item = localStorage.getItem('userData')
if (item) {
setUserData(item)
}
}
window.addEventListener('storage', checkUserData)
return () => {
window.removeEventListener('storage', checkUserData)
}
}, [])
Run Code Online (Sandbox Code Playgroud)
小智 11
“存储”事件的事件侦听器在同一页面中不起作用
当存储区域 (localStorage) 在另一个文档的上下文中被修改时,将触发 Window 接口的存储事件。
https://developer.mozilla.org/en-US/docs/Web/API/Window/storage_event
小智 5
解决方案是使用这个结构:
useEffect(() => {
window.addEventListener("storage", () => {
// When storage changes refetch
refetch();
});
return () => {
// When the component unmounts remove the event listener
window.removeEventListener("storage");
};
}, []);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13888 次 |
| 最近记录: |