我正在尝试从浏览器本地存储获取项目,但无法获取,请帮助我。但我无法从localStorage检索存储的数据。我的Web开发人员工具显示存储的数据存在,但当我打开或重新加载页面时,我无法获取数据。
const LOCAL_STORAGE_KEY = "contacts";
const App = () => {
const [contacts, setContacts] = useState([]);
const addContactHandler = (contact) => {
console.log(contact);
setContacts([...contacts, contact]);
};
useEffect(() => {
const retrieveContacts = JSON.parse(
localStorage.getItem(LOCAL_STORAGE_KEY)
);
if (retrieveContacts) {
setContacts(retrieveContacts);
}
}, []);
useEffect(() => {
localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(contacts));
}, [contacts]);
return (
<>
<div className="app">
<Header />
<AddContact addContactHandler={addContactHandler} />
<ContactList contacts={contacts} />
</div>
</>
);
};
我查了参考资料。但还是不行。
3条答案
按热度按时间drkbr07n1#
所有的useEffects在渲染的时候都会运行一次,所以最初你的联系人状态是
[]
,你把它存储到localStorage中。因此,要解决这个问题,请尝试在存储到localStorage时添加简单的if检查。
有关详细说明,请参见代码中的注解。
4bbkushb2#
为什么不起作用?
您的第一个
useEffect
工作正常但是这个
setContacts(retrieveContacts)
在第二个useEffect
运行之前不会更改状态,因此下面的contacts
是[]
如何让它发挥作用?
您可以检查
contacts
是否不为空,但在移除项目时会导致bug您可以在每次更改联系人时更新存储:
或者在状态初始化器中加载存储:
或将两种方法结合使用
1yjd4xko3#
如前所述
当组件装载时,将调用此效果,并且由于在时间点的状态始终是useState默认值中所述的空数组([]),因此这将把本地存储设置为空数组([])。
当应用程序在
<StrictMode>
中运行时会发生这种情况,这是一件好事。当在StrictMode中时,react运行useEffects两次,以确保存在不安全的生命周期。所以render和“shouldComponentUpdate”方法都运行了两次。因此出现了问题。
请确保不要禁用严格模式,而是修复生命周期。