【问题标题】:Having trouble with persisting React state using localStorage with a SSR (Next.js) app使用带有 SSR (Next.js) 应用程序的 localStorage 持久化 React 状态时遇到问题
【发布时间】:2020-01-10 17:54:30
【问题描述】:

我正在制作的应用具有可自定义的设置。我想加载默认设置,然后当用户进行任何更改时,自定义设置将存储在 localStorage 中。现在,下次用户回来时,我们将从他们的 localStorage 加载设置。

我正在像这样使用 React 上下文...

    const SettingsContextProvider = (props: any) => {
        const [settings, setSettings] = useState(getSettings());

        useEffect(() => {
            localStorage.setItem('settings', JSON.stringify(settings))
        }, [settings]);

        return (...some jsx...);
    }

然后getSettings()...

   getSettings() {
       // get from local storage
       if (process.browser) {
           const localSettings = localStorage.getItem('settings');
           if (localSettings) return JSON.parse(localSettings );
       }

       // fall back to default settings
       return "Something else";
   }

我遇到的问题是服务器端负载(在节点端),我们没有本地存储(这就是我检查process.browser 的原因),所以它回退到默认设置。然后当它到达浏览器时,它似乎再次调用getSettings(),在这种情况下,我们确实有本地存储,它从那里加载。

这行得通,但我得到一个错误:

Text content did not match. Server: "Something else" Client: "Something custom"

所以我知道服务器与客户端不匹配并且对此感到不安。我明白为什么会这样,但我不知道如何解决它。也许我需要实现 reducer 或使用 cookie?

有人遇到过这个吗?

如果有帮助,我非常乐意分享我的完整回购代码。

【问题讨论】:

  • 究竟是什么引发了这个错误?谁比较这两个值并说Text content did not match.?
  • 很难说是什么引发了错误。打开站点后,它就在我的浏览器控制台中(index.js 第 1 行出现错误,因此该错误根本没有帮助)。我只能说,最初服务器必须按预期呈现站点,然后客户端使用不同的数据(来自本地存储)呈现它,然后事情就中断了。
  • 看起来你已经缩小了你的构建,这就是你在第 1 行看到错误的原因。你应该尝试使用未缩小的 js,这样你就可以跟踪这个错误的来源。跟踪它对于解决您的问题至关重要,因为没有它,真的很难说出代码的哪一部分负责这种字符串比较以及为什么这如此重要。

标签: javascript reactjs next.js


【解决方案1】:

我对 react 相当熟悉,但我几乎从未在自己的代码中使用过 react 钩子。

但是,我觉得我不会将 localStorage 的更新放入这样的 useEffect 函数中(我可能完全错了)。

所以,首先,我会检查 useEffect 函数是否在您期望的时候被调用。

然后,我会写一个函数

 const updateSettings = (newSettings) => {
      localStorage.setItem('settings', JSON.stringify(newSettings))
      setSettings(newSettings);
 }

并使用 updateSettings 函数向下传递给组件。

但是,我可能完全不在那儿,就像我说的那样,我不使用反应钩子,只有理论上的理解。

【讨论】:

  • 您可能是正确的关于何时更新设置。它不能解决问题,但这是一个好点。谢谢!
猜你喜欢
  • 2020-05-10
  • 2021-05-20
  • 2018-05-21
  • 1970-01-01
  • 2021-01-12
  • 2020-10-11
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多