【问题标题】:Nuxt not adding bodyAttr on refresh / ssrNuxt 没有在刷新/ssr 时添加 bodyAttr
【发布时间】:2019-09-18 08:03:25
【问题描述】:

我的一个布局中有以下代码。

bodyAttrs: {
    class: this.$store.state.user.theme + '-scheme'
}

不幸的是,我使用的是旧的引导主题 c​​ss。我不想重做,所以我必须想出一些解决方法。

bootstrap 主题的主题颜色附加到 body 标记。不幸的是,body 标签在 nuxt 中是不可以的。

我注意到的是,刷新页面时会使用基本状态值呈现。

例子:

//store/index.js <- not modular
var state = () => ({
   user: {
    id: 0,
    avatar: 'default.jpg',
    status: 'offline',
    nickname: 'Guest',
    admin: false,
    theme: 'brownish' //-> this is the value
  }
})

整个页面使用用户详细信息进行渲染,但主题变量未放入渲染中。如果我转到另一个页面(ajax 路由),页面将更新为正确的颜色。

基本上页面加载为棕色,然后在后续页面上加载为蓝色。如果页面被刷新,那么颜色会恢复为棕色,然后在后续页面上它会再次变为蓝色。

如何让 SSR 显示正确的 bodyAttr?

我正在使用 vuex-persistedstate 和 cookie 都是客户端 nuxt 服务器没有任何会话,因为这是在单独的域(api)上处理的

【问题讨论】:

标签: vue.js vuex server-side-rendering nuxt.js


【解决方案1】:

我找不到纯 vuejs 的方法来做到这一点,所以我做了一个修复。

这在技术上是个坏主意,因为它直接修改了 DOM,这在 vue 中是一个禁忌。但是,vue 不会在 body 标签上使用反应性。因此我认为使用起来相当安全。此外,使用 vuex-presistedstate 将确保 vue 在后续加载时设置正确的状态变量..

//这是 layouts/default.vue

head() {
 return {
  bodyAttrs: {
    class: this.$store.state.user.theme + '-scheme'
  }
 }
},
mounted() {
 window.onNuxtReady(() => {
  document.body.className = this.$store.state.user.theme + '-scheme'
 })
}

【讨论】:

    【解决方案2】:

    您是否使用基于 cookie 的 vuex-persistedstate 版本? Customize Storage 记得在nuxt.config.js中为插件开启ssr模式

    【讨论】:

    • 使用本地存储版本。无论哪种方式,cookie/本地存储都是客户端,而 SSR 是服务器端,这是问题
    • Cookies 可以传递到服务器端(检查这个link 以获得通用库)但我还没有尝试使用 vuex-persistedstate。如果你还没有解决,我明天试试。
    猜你喜欢
    • 2022-08-06
    • 2019-12-11
    • 2021-04-01
    • 2019-03-25
    • 2022-01-23
    • 2021-07-26
    • 1970-01-01
    • 2021-03-24
    • 2018-11-17
    相关资源
    最近更新 更多