javascript - 如何让 useEffect 监听 localStorage 的任何变化?

标签 javascript reactjs

我正在尝试让我的 React 应用程序从 localStorage 获取 todos 对象数组并将其提供给 setTodos。为此,我需要一个 useEffect 来监听本地存储中发生的任何更改,所以这就是我所做的:

  useEffect(() => {
      if(localStorage.getItem('todos')) {
        const todos = JSON.parse(localStorage.getItem('todos'))
        setTodos(todos);
      }
  }, [ window.addEventListener('storage', () => {})]);

问题是每次我在 localStorage 中添加或删除内容时都不会触发 useEffect。 这是让 useEffect 监听 localStorage 的错误方式吗?

我尝试了解决方案 explained here但它对我不起作用,我真诚地不明白为什么它应该起作用,因为监听器没有作为 useEffect 中的第二个参数传递

最佳答案

您不能以这种方式重新运行 useEffect 回调,但您可以设置一个事件处理程序并让它重新加载 todos,请参阅评论:

useEffect(() => {
    // Load the todos on mount
    const todosString = localStorage.getItem("todos");
    if (todosString) {
        const todos = JSON.parse(todosString);
        setTodos(todos);
    }
    // Respond to the `storage` event
    function storageEventHandler(event) {
        if (event.key === "todos") {
            const todos = JSON.parse(event.newValue);
            setTodos(todos);
        }
    }
    // Hook up the event handler
    window.addEventListener("storage", storageEventHandler);
    return () => {
        // Remove the handler when the component unmounts
        window.removeEventListener("storage", storageEventHandler);
    };
}, []);

注意 storage event仅当存储在不同窗口中的代码更改为当前窗口时才会发生。如果您在同一窗口中更改 todos,则必须手动触发。

关于javascript - 如何让 useEffect 监听 localStorage 的任何变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67683616/

相关文章:

javascript - Google reCAPTCHA 上的 jQuery 点击事件

javascript - Mongoose.js 使用异常但看似可接受的字符串值保存文档时出错

javascript - SharePoint 框架应用程序中的 ReactDom.Render()

javascript - 来自带有 Angular 和 django/python 的 URL 的 JSON

javascript - nsIXMLHttpRequest 仅执行到readyState 1

javascript - 在一个js文件中为不同的wordpress页面添加多个自定义脚本

javascript - React setState 嵌套对象回调

javascript - 如何在 react 中以两种方式绑定(bind)数据输入?

reactjs - enzyme 模拟子组件的onChange事件

javascript - 如何使用 FilePond 使所选文件类型仅接受 docx?