gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:52:41 25 4
gpt4 key购买 nike

我正在使用 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 /blog Blog.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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com