【发布时间】: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