[英]How to get localStorage value on client-side from global middleware using Nuxt.js
我已经在我的Nuxt.js
项目中实现了在深色和浅色之间更改主题的功能,但我还有一个问题。
在用户更改设置主题后,他会在本地存储中获得标志。 标志_t
(主题)和值 - _d
代表黑暗, _l
代表光明。 根据这些值,脚本必须将属性data-theme
设置为暗或亮,然后根据scss
变量设置主题。
问题是 - 我怎样才能从localStorage
获得这个值。 当然,在每个页面上我都可以创建mounted()
钩子并检查localStorage
中的值,但是我必须在我创建的每个页面上都这样做,这似乎不是正常的解决方案。 我正在考虑全局中间件并创建了一个。
export default function() {
if (process.server) return
const t = localStorage.getItem('_t')
if (!t) {
localStorage.setItem('_t', '_d')
document.documentElement.setAttribute('data-theme', 'dark')
} else {
document.documentElement.setAttribute('data-theme', t === '_l' ? 'light' : 'dark')
}
}
我工作,但不太正确。 Nuxt.js
与 SSR 一起使用,因此基本上第一次在服务器上调用中间件,然后才在客户端调用。 这就是为什么我有这个if (process.server)
检查,因为localStorage
在服务器端不可用。
这个解决方案的问题是,在页面重新加载后,您不会在HTLM
中看到这个data-theme="dark"
。 正因为如此,风格似乎被“打破”了。 仅当您通过单击nuxt-link
进入此页面时它才有效,因为它适用于客户端。
那么,在这种情况下,最佳做法是什么。 是否有机会在全局范围内实施此检查,而不是在每个页面上的mounted()
挂钩中检查localStorage
值?
您可以使用相同的方法,但可以使用cookies
而不是localStorage
,因为cookies
是通过每个 HTTP 请求发送的,因此您可以在服务器端和客户端访问它。
您可以使用此库来管理您的 cookie。
https://www.npmjs.com/package/cookie-universal-nuxt
有关 cookie 的更多资源。
https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.