nuxt.js - 推送新路由时,Nuxt 静态不加载获取的状态

标签 nuxt.js server-side-rendering ssg

我正在使用 nuxt 生成完整的静态 Web 应用程序,如下所述 https://nuxtjs.org/blog/going-full-static/#crazy-fast-static-applications
我也有一个小博客要加载为静态站点,所以我使用 fetch 钩子(Hook)从 api 加载数据。

async fetch() {
  this.posts = await fetch(`${this.baseApi}/posts`).then(res => res.json())
},
当我生成( npm run generate )时,获取的状态在 dist/assets/static 内正确生成,所以直接访问 /blog 时,状态已正确加载并且数据显示正确。
但是,当我在主页中并使用
this.$router.push

<nuxt-link to="/blog">Blog</nuxt-link>
获取的状态没有被加载,我必须再次调用api,或者调用this.$fetch()再来一次 mounted()
我已经添加了一个
watch: {
  '$route.query': '$fetch'
}
到主页
我需要在使用导航时正确加载获取的状态我还缺少什么?
澄清
我没有遇到 fetch 钩子(Hook)本身的任何问题,而是导航没有检索目标路线的状态。
甚至 HTML 也在那里
我需要页面来获取目标路由的状态,当路由改变时,因为vue模板依赖它,所以如果没有加载,ui不会显示任何东西,我被迫调用fetch钩子(Hook)手动
为了更清晰,这是我的开发工具在直接访问/blog 时的屏幕截图,注意 state.js 是如何正确检索的(它包含所有呈现的内容)
State correctly fetched when directly accessing
以下是我的 devtools 访问/时的屏幕截图,然后使用 nuxt-link 或 this.$router.push 访问博客(结果相同)
State not fetched after navigation
静态截图:
Static state.js of /blogBlog.vue
<template>
  <b-container class="container blog">
    <b-row>
      <b-col lg="12" md="12" sm="12" cols="12" class="logo-col">
        <SbLogoSingle />
      </b-col>
    </b-row>
    <b-row v-if="$fetchState.pending" class="text-center">
      <b-spinner style="margin: auto"></b-spinner>
    </b-row>
    <b-row v-else>
      <b-col
        v-for="(post, idx) in posts.data"
        :key="idx"
        lg="4"
        md="4"
        sm="6"
        cols="12"
        class="blog-post-col"
      >
        <b-card
          v-if="post !== undefined"
          no-body
          class="shadow-lg blog-post-card"
          :img-src="post.media.url"
          img-top
        >
          <b-card-body class="text-left">
            <b-card-title>{{ replaceSlugByString(post.slug) }}</b-card-title>
            <b-card-text
              class="post-short-description"
              v-html="post.localizations[0].shortDescription"
            ></b-card-text>
          </b-card-body>
          <template #footer>
            <div class="text-left">
              <b-button class="apply-btn read-more-btn" @click="openBlogPost(idx)">Read more</b-button>
            </div>
          </template>
        </b-card>
      </b-col>
    </b-row>
  </b-container>
</template>

<script>
import { mapState } from 'vuex'

export default {
  data() {
    return {
      slug: 'test',
      posts: {},
      currentPage: 1,
      perPage: 12,
      pageIndex: 1,
      totalPages: 1,
    }
  },
  async fetch() {
    const response = await fetch(`${this.baseApi}/StaticPage`)
    const fetchedPosts = await response.json()

    this.posts = fetchedPosts
    // this.posts = await fetch(`${this.baseApi}/StaticPage`).then(res =>res.json())
  },
  computed: {
    ...mapState('modules/settings', ['baseApi']),
  },
  beforeMount() {
    this.$fetch() // i want to remove this because the pages are statically generated correctly, I'm only adding it to refresh the state. which can be retrieved as a separate js file when accessing the route directly
  },
  methods: {
    openBlogPost(idx) {
      const pageObject = this.posts.data[idx]
      this.$router.push({
        name: `blog-slug`,
        params: {
          slug: pageObject.slug,
          page: pageObject,
        },
      })
    },
    replaceSlugByString(slug) {
      return slug.replaceAll('-', ' ')
    },
  },
}
</script>
这是 slug.vue 的 pastebin
https://pastebin.com/DmJa9Mm1

最佳答案

编辑:

  • fetch() hook 很好用,即使你第一次来到这个特定的页面,它也会被触发
  • Vue devtools 可以帮助您找出某些状态是否丢失或行为异常。
  • 静态文件夹中没有状态这样的东西,因为状态根本不是静态变量或事物,它是动态的并且仅在运行时可用。
  • 此答案可能会帮助您查看 JSONplaceholder 的工作示例(带有列表 + 详细信息页面):How to have list + details pages based on API fetched content

  • 尽量不要混用async/awaitthen .
    所以,这种语法应该更适合。
    async fetch() {
      const response = await fetch(`${this.baseApi}/posts`)
      const fetchedPosts = await response.json()
      console.log('posts', fetchedPosts)
      this.posts = fetchedPosts
    },
    
    然后,您可以使用 devtools 的网络选项卡进行调试,看看它是否被触发。不过我觉得那时候应该没问题。

    我刚刚写的更深入的这个答案也可以帮助更多地理解fetch() Hook :https://stackoverflow.com/a/67862314/8816585

    关于nuxt.js - 推送新路由时,Nuxt 静态不加载获取的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67879210/

    相关文章:

    vue.js - Vue/Nuxt - 安装 : () => Vs mounted: function()

    javascript - nuxt js 中的异步组件延迟

    scala - 使用服务器端渲染编写 scala-js 前端框架。无法在服务器上使用 scala-js-dom

    reactjs - 错误 : getStaticPaths is required for dynamic SSG pages and is missing for "xxx". NextJS

    vue.js - 如何在 Nuxtjs 中创建一个 utils

    webpack - 如何停止显示 webpack 的构建日志?

    Angular 通用服务器 API 请求

    vue.js - 使用 Nuxt.js 时如何在前端进行异步请求?

    next.js - NextJS、_app、SSG、getInitialProps 与 getStaticProps 以及我应该如何坚持 DRY?