【问题标题】:(Nuxt) Vue component doesn't show up until page refresh(Nuxt) Vue 组件直到页面刷新才显示
【发布时间】:2022-01-21 04:15:06
【问题描述】:

我将导航项存储在我的 Vuex 存储中,并以 Vue/Bulma 组件的形式对它们进行迭代以进行条件输出,如下所示:

<b-navbar-item
  v-for='(obj, token) in $store.state.nav'
  v-if='privatePage'
  class=nav-link
  tag=NuxtLink
  :to=token
  :key=token
>
  {{obj.text}}
</b-navbar-item>

如图所示,只有当组件的 privatePage 数据项解析为 true 时才应输出,它确实如此:

export default {
  data: ctx => ({
    privatePage: ctx.$store.state.privateRoutes.includes(ctx.$route.name)
  })
}

我遇到的问题是当我运行开发服务器(使用ssr: false)时,当我通过NuxtLink 标签导航到页面时,组件最初并没有显示。如果我手动导航到页面或刷新它,组件就会显示。

我以前在 Nuxt 看到过这种情况,但不确定是什么原因造成的。有人知道吗?

【问题讨论】:

  • 首先,您不应按照文档中的说明同时使用v-ifv-for。数据也是如此,请在此处使用return。检查您的控制台中是否有任何错误或来自 ESlint 的错误。您可以使用 Vue devtools 检查您的页面以查看问题所在(Vuex、本地状态等)。不要忘记为所有道具/属性使用双引号,并且请不要在您的案例中使用v-for(命名为token)的索引。或许可以为我们提供一些minimal reproducible example 以便更快地调试!
  • 谢谢@kissue。我的data 确实有一个隐含的return - 这只是我使用箭头函数语法。出于兴趣而不使用index 作为密钥的原因是什么?
  • 您正在失去使用this 设置一些数据的能力。此外,return 对于不具有跨组件共享状态很重要。至于v-for 中的index,这里是an article,说明为什么这与它应该做的相反。
  • 谢谢。但是我仍然对 return 感到困惑——我正在使用 return,只是一个隐式的,以箭头函数的形式。即ctx =&gt; ({...})ctx =&gt; { return {...}; }相同
  • 对不起,我误会了你。你说得很对。谢谢。

标签: javascript vue.js components nuxt.js


【解决方案1】:

推荐:

  1. 使用mapState 和其他 vuex 映射助手以获得更易读的代码:)。

  2. 不要在同一个元素上使用 v-for 和 v-if

  3. "nuxt-link" 用作您的tag

  4. / 用于to(如果您的地址没有尾部斜杠)

<template v-if='privatePage'>
  <b-navbar-item
    v-for='(obj, token) in nav'
    class=nav-link
    tag="nuxt-link"
    :to="token"  Or "`/${token}`"
    :key="token"
  >
    {{obj.text}}
  </b-navbar-item>
</template>

在你的脚本中:

<script>
import {mapState} from 'vuex'

export default{
   data(){
    return {
      privatePage: false
    }
   },
   computed:{
     ...mapState(['privateRoutes','nav'])
   },
   mounted(){
       // it's better to use name as a query or params to the $route
     this.privatePage = this.privateRoutes.includes(this.$route.name)
   }
}

</script>

最后,如果它不能帮助你,我建议通过dev tools 检查你的页面,看看 html 中呈现的组件是什么。它应该是带有href 属性的&lt;a&gt; 标签。另外,我认为您可以将链接地址(适用于刷新而不是通过 nuxt 链接)添加到您的问题中,因为在 navbar-item 中创建的 href 可能不正确。

注意:token 是导航数组的索引。所以你的网址是例如yourSite.com/1.so 这就是你想要的吗?

【讨论】:

  • 可能不会。国际海事组织。
  • 实际上是-我的状态导航对象采用URI =>链接数据的形式,因此to 属性的token 是正确的。感谢其他提示 - 我会尝试的。
猜你喜欢
  • 2019-07-12
  • 2014-11-13
  • 2019-11-22
  • 2016-04-06
  • 2021-09-23
  • 2019-11-27
  • 2023-03-27
  • 2020-02-20
  • 1970-01-01
相关资源
最近更新 更多