React,页面刷新后使用 useEffect 丢失 localStorage 中保存的数据[重复]

2024-01-02

这可能是一个菜鸟问题,但我遇到了一些麻烦useEffect()钩。我有一个记笔记应用程序,我想让数据持久保存。我用的是2useEffects:一个用于第一次刷新/加载页面时,另一个用于当我向应用程序添加新注释时。

我放置了一些日志来检查发生了什么:

const [notes, setNotes] = useState([
  {
  noteId: nanoid(),
  text: 'This is my 1st note!',
  date: '30/07/2022'
  },
  {
    noteId: nanoid(),
    text: 'This is my 2nd note!',
    date: '30/07/2022'
  }
])

// 1st time the app runs
useEffect(() => {
  const savedNotes = JSON.parse(localStorage.getItem('react-notes'))
  console.log('refresh page call:',savedNotes)

  if(savedNotes) {
    setNotes(savedNotes)
  }
}, [])

//every time a new note is added
useEffect(() => {
  localStorage.setItem('react-notes', JSON.stringify(notes));
  console.log('new note call:', notes)
}, [notes])

这种行为有点奇怪,因为刷新页面时,新数据出现在日志中,但随后消失,仅保留硬编码数据:

它还拨打了比我预期更多的电话。对这里发生的事情有什么想法吗?


Issue

该问题是由以下原因引起的useEffect以及您最初如何设置状态:

useEffect(() => {
  localStorage.setItem('react-notes', JSON.stringify(notes));
  console.log('new note call:', notes)
}, [notes])

以上useEffect每次都运行notes变化,还要挂载。并且在安装时状态等于给定的初始数组useState。所以localStorage设置为该数组。

Solution

解决方案是更改设置状态的方式,如下所示,以便您选择localStroge如果有的话,否则使用您拥有的初始数组:

const [notes, setNotes] = useState(
  !localStorage.getItem("react-notes")
    ? [
        {
          noteId: nanoid(),
          text: "This is my 1st note!",
          date: "30/07/2022",
        },
        {
          noteId: nanoid(),
          text: "This is my 2nd note!",
          date: "30/07/2022",
        },
      ]
    : JSON.parse(localStorage.getItem("react-notes"))
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React,页面刷新后使用 useEffect 丢失 localStorage 中保存的数据[重复] 的相关文章

随机推荐

  • 有哪些库可帮助创建手机 2D Java 游戏?

    我想开始为手机开发 2D Java 游戏 在 J2ME 上 因此我想知道是否存在任何库或 引擎 来帮助完成各种图形任务 用像素字体绘制文本 为具有多个帧的精灵绘制位图 如动画 GIF 使用代码 线条 贝塞尔曲线 洪水填充和绘制图形渐变填充
  • 操作系统中的共享内存段

    共享内存属于哪里 这意味着它由每个单独的进程拥有 如堆栈和堆 所以 其他程序不能 能够访问其他程序的堆栈 或者它是由任意数量的进程使用的公共内存段 这 下图以图解方式显示了我的问题 图1 stack stack stack Shared m
  • 链接 clang-llvm

    我一直在使用 clang llvm 开发一个小工具 但我无法成功让 g 和 gnu 的链接器将我的代码与 clang 正确链接 我的链接器生成以下错误 undefined reference to clang FileManager Fil
  • 在 Heroku Server django 上安装 poppler

    我正在尝试安装poppler在我的 Heroku 服务器上 因为我正在使用pdf2image作为一个Python包 然而 我不能就这么跑brew install poppler就像我在 Mac 上所做的那样 我尝试从互联网上添加一些 Her
  • 使用 ng-model 命名数组

    我有一个添加按钮 它使用指令添加到表的 estimates tbody function EstimateCtrl scope compile scope services value c name Standard Courier val
  • locationManager:rangingBeaconsDidFailForRegion:withError: kCLErrorDomain 16

    我读过了CLLocationManager kCLErrorDomain 代码 https stackoverflow com questions 20164952 cllocationmanager kclerrordomain code
  • Ruby 中识别方法的 # 约定的基本原理/历史是什么?

    例如 我总是看到称为String split 但从来没有String split 这似乎更符合逻辑 或者甚至可能String split 因为你可以考虑 split位于命名空间中String 当类被假定 隐含时 我什至单独看到了该方法 sp
  • 获取iframe的文档对象

    我正在尝试获取 iframe 的文档对象 但我在 google 上搜索到的示例似乎都没有帮助 我的代码如下所示
  • 追加到 /etc/apt/sources.list

    我正在创建一些脚本来简化应用程序安装 我需要附加到 etc apt sources list 的末尾 下面的代码附加到 中的文件 但不附加到 etc apt 中 echo deb http ppa launchpad net person
  • 如何获取 JavaScript 对象的大小?

    我想知道 JavaScript 对象占用的大小 取以下函数 function Marks this maxMarks 100 function Student this firstName firstName this lastName l
  • ReactJS 中的登录页面与单页应用程序 (SPA) 分离

    我正在 ReactJS 中开发一个单页面应用程序 SPA 我想知道如何在单独的页面中拥有登录页面 我在用create react app作为我的应用程序的基础 我目前正在定义 SPA 的模板App js文件 以及不同 js 文件中的每个组件
  • 验证错误后重定向到操作

    如果我有通常的 编辑 操作 则 GET 操作可以通过对象的 ID 检索对象并将其显示在编辑表单中 接下来 POST 获取 ViewModel 中的值并更新数据库中的对象 public virtual ActionResult Edit in
  • 基于深色模式的 Tailwind 颜色

    有没有办法在顺风配置中定义不同的颜色 以便在不使用深色模式的情况下应用深色模式dark选择器 目前我有一个像这样的对象 const colors light red 100 880808 dark red 100 red I d like只
  • 对数组数字(包括作为字符串的数字)求和的函数

    我有一个函数需要对数组中的所有数字求和 如果这些数字是字符串 1 2 该函数也需要对它们求和 我编写了一个函数并尝试解析数字 但它不起作用 基本上 它需要将所有数字相加 你能在不使用的情况下做到这一点吗reduce 我需要一个简单的解决方案
  • YUI Compressor Maven Mojo 缩小 javascript 的使用

    我在做一个struts2项目 使用maven来编译 我正在尝试缩小位于不同位置的 javascript 文件
  • JMeter 响应时间与线程图 - 数据点

    该图使用什么数据点 该图表示 TTFB 到第一个字节的时间 还是 TTLB 到最后一个字节的时间 以下是设置 该图表示 TTLB 到最后一个字节的时间 因为它使用 JMeter 的响应时间 如果你想要TTFB 第一个字节的时间 你需要使用L
  • 出现“无法对 Null 值调用此方法或属性”错误

    更新1 该行抛出异常 client group details Add new ClientGroupDetails 原问题 我有以下代码 我已将其从数据库中的 30 列数据精简为仅 2 列 每当任何列返回 NULL 值时 我都会收到错误
  • Kendo Grid 可以一直处于编辑模式吗?

    有谁知道剑道网格是否可以始终设置为编辑模式 我们不希望用户单击单元格或按钮来激活编辑模式 我们希望小部件始终显示并可用 有可能吗 除了使用批量编辑模式之外 您还可以尝试设置每列的模板并使用 MVVM 将输入元素绑定到数据项 grid ken
  • Android模拟器运行后如何获取序列号或ID?

    如果我在一台机器上运行多个带有 no window 选项的模拟器 命令 adb devices 显示 List of devices attached emulator 5554 device emulator 5556 device em
  • React,页面刷新后使用 useEffect 丢失 localStorage 中保存的数据[重复]

    这个问题在这里已经有答案了 这可能是一个菜鸟问题 但我遇到了一些麻烦useEffect 钩 我有一个记笔记应用程序 我想让数据持久保存 我用的是2useEffects 一个用于第一次刷新 加载页面时 另一个用于当我向应用程序添加新注释时 我