【发布时间】:2021-07-23 18:26:16
【问题描述】:
我构建了一个 Todo 应用程序,它运行顺畅,但 localStorage 在刷新后不会持续存在这一事实。 localStorage 命令以前在我的事件处理程序较少时有效,但现在似乎在某个地方,存储被擦除了。我已经尝试过我在这里看到的基本解决方案,但似乎有一些独特的东西会导致错误。这是我的保存/获取功能:
保存:
const saveLocalTodos = () => {
localStorage.setItem("todos", JSON.stringify(todos));
};
获取:
const getLocalTodos = () => {
if (localStorage.getItem("todos") === null) {
localStorage.setItem("todos", JSON.stringify(todos));
} else {
let localTodo = JSON.parse(
localStorage.getItem("todos", JSON.stringify(todos))
);
setTodos(localTodo);
}
};
实际上,通过将“待办事项”项设置为字符串化数组待办事项(当添加新的待办事项/完成状态更改/项目已加星标/等时,它可以工作并显示在本地存储中)来保存该过程。 useState函数如下:
useEffect(() => {
filteredTodosHandler();
saveLocalTodos();
}, [todos, status, starredToggle]);
所以就像我说的,当 todos 数组改变、可点击状态过滤器改变或星号复选框被点击时调用。这些都不会破坏 localStorage。下面是 getLocalTodos 的 useEffect:
useEffect(() => {
getLocalTodos();
}, []);
如果我理解正确,一个空数组大致意味着它在页面刷新时被调用。问题是当我刷新时,我总是得到一个空数组。我试过添加“窗口”。在 localStorage 函数调用的开头,将 e.preventDefault 添加到 saveLocalTodos 案例中涉及的事件处理程序中,并确保我将数组转换为字符串化对象。似乎没有任何效果。我在 GitHub 存储库中有一份该应用程序的副本,并通过 Firebase 托管,如果这样可以增加更多洞察力的话。
【问题讨论】:
-
localstorage 是否在刷新时完全被擦除/清空,或者只是像
[]一样清空数组? -
它变成了一个带有“todos”键的空数组。我自己也想知道这个问题,似乎问题是 也许 与 if 语句中的错误处理有关?
-
然后
useEffect在您刷新时更改初始渲染时的本地存储。查看useEffect的依赖数组 -
埃姆雷听起来不错。下班后我会回来解决这个问题的。
标签: javascript reactjs local-storage