• React问题:LocalStorage 在提交后不显示数据并且状态在刷新时不能持续存在的问题


    问题描述:

        我正在编写一个简单的待办事项应用程序并尝试将数据保存在本地存储中。我看过几个考虑在 React 中使用 localStorage 的教程,并按照他们说的一步一步做,代码似乎还不错。似乎是问题所在,是本地存储本身。当我使用 localStorage.setItem() 添加待办事项时,它应该会自动更新并显示数据,但事实并非如此。只有当我刷新它(应用程序 - > 本地存储中控制台中带有键值对的字段上方的小刷新按钮)时,我才能看到显示的键值对,所以看起来它已经工作了。但是,即使手动刷新后似乎保留了数据,但当我刷新整个页面时,数据消失了。下面我包含了我的分代码:

    1. const [todos, setTodos] = useState([]);
    2. const addTodo = (e) => {
    3. e.preventDefault();
    4. if (inputValue.trim() === "") return;
    5. setTodos([
    6. ...todos,
    7. {
    8. text: inputValue,
    9. id: uuidv4(),
    10. },
    11. ]);
    12. setInputValue("");
    13. };
    14. useEffect(() => {
    15. const localData = localStorage.getItem("TODO_APP");
    16. if (localData !== null) setTodos(JSON.parse(localData));
    17. }, []);
    18. useEffect(() => {
    19. localStorage.setItem("TODO_APP", JSON.stringify(todos));
    20. }, [todos]);

    解决思路一:

    我将添加另一个稍作修改的版本。应该管用:

    1. const [todos, setTodos] = useState(JSON.parse(localStorage.getItem('TODO_APP')) || []);
    2. const addTodo = (e) => {
    3. e.preventDefault();
    4. if (inputValue.trim() !== '') {
    5. setTodos([
    6. ...todos,
    7. {
    8. text: inputValue,
    9. id: uuidv4()
    10. }
    11. ]);
    12. }
    13. setInputValue('');
    14. };
    15. useEffect(() => {
    16. localStorage.setItem('TODO_APP', JSON.stringify(todos));
    17. }, [todos]);

    解决思路二:

    其他解决方案可能对您有用,但如果您正在使用React 18,您的代码非常好,问题是useEffects在刷新时调用了两次,它正在重置 localStorage。这是一种已知问题。

    您只需要StrictModesrc/index.js文件中禁用index.js

    1. import React from "react";
    2. import ReactDOM from "react-dom/client";
    3. import "./index.css";
    4. import App from "./App";
    5. import reportWebVitals from "./reportWebVitals";
    6. const root = ReactDOM.createRoot(document.getElementById("root"));
    7. root.render(<App />);
    8. reportWebVitals();

    我尝试完成组件的缺失部分,最终组件如下所示:

    1. import { useState, useEffect } from "react";
    2. const Todo = () => {
    3. const [todos, setTodos] = useState([]);
    4. const [inputValue, setInputValue] = useState("");
    5. const onChangeHandler = (e) => {
    6. setInputValue(e.target.value);
    7. };
    8. const addTodo = (e) => {
    9. e.preventDefault();
    10. if (inputValue.trim() === "") return;
    11. setTodos([...todos, { text: inputValue }]);
    12. setInputValue("");
    13. };
    14. useEffect(() => {
    15. console.log("1st");
    16. const localData = localStorage.getItem("TODO_APP");
    17. console.log(localData);
    18. if (localData.length !== 0) setTodos(JSON.parse(localData));
    19. }, []);
    20. useEffect(() => {
    21. console.log("2nd");
    22. localStorage.setItem("TODO_APP", JSON.stringify(todos));
    23. }, [todos]);
    24. return (
    25. <form onSubmit={addTodo}>
    26. <input type="text" value={inputValue} onChange={onChangeHandler}>input>
    27. <button type="submit">ADD TODObutton>
    28. form>
    29. );
    30. };
    31. export default Todo;

    console.log()在代码中添加了 sso 你可以观察它们useEffects是如何在刷新时调用的

    解决思路三(这是解决小编问题的思路):

    以上仅为部分解决思路,添加下方公众号后回复001,即可查看全部内容。公众号有许多评分最高的编程书籍和其它实用工具,无套路,可放心使用

    如果您觉得有帮助,可以关注公众号——立志于成为对程序员有益的公众号

  • 相关阅读:
    域名个人信息备案的能用 websocket 吗
    Java之多线程的生产者消费者问题的详细解析
    Spring Boot 中的过滤器 (Filter) 使用方案
    一文理解Hadoop分布式存储和计算框架入门基础
    【第四篇】XiaoZaiMultiAutoAiDevices之核心机制
    postgresql常用操作指令
    【情感识别】BP神经网络语音情感识别【含Matlab源码 349期】
    网盘——删除文件夹
    【2022河南萌新联赛第(三)场:河南大学】【部分思路题解+代码解析】
    数组some和every的区别
  • 原文地址:https://blog.csdn.net/qq_38334677/article/details/126147723