【发布时间】:2021-08-21 01:42:37
【问题描述】:
Nuxt 和 SSR 的新手。我要做的很简单:我试图在页面加载之前触发一个函数,该函数将 SSR 我的 Firestore 数据。如果我用@onclick 添加一个按钮,它工作正常。但是当我尝试用 @onloadstart 或类似的东西替换 Button/OnClick 时,什么也没有发生。
我错过了什么?我怀疑我是从客户端的角度考虑这个问题。不是 SSR 镜头。
<template @onloadstart="beforeCreate()">
<section>
<div>
<div v-for="article in articles" id="articleCardList" :key="article">
<v-card elevation="1" outlined>
<div class="d-flex">
<v-avatar class="ma-1" size="125" tile>
<v-img :src="article.thumbnail"></v-img>
</v-avatar>
<div>
<v-card-title
class="text-h5 text-wrap d-flex justify-space-between text-caption"
v-text="article.title"
>
{{ article.title }}
</v-card-title>
</div>
</div>
</v-card>
</div>
</div>
</section>
</template>
<script>
import { fireDb } from '~/plugins/firebase.js'
export default {
data() {
return {
articles: [],
}
},
methods: {
async asyncData() {
this.articles = []
await fireDb
.collection('articles')
.get()
.then((querySnapShot) => {
querySnapShot.forEach((doc) => {
this.articles.push({
id: doc.id,
title: doc.data().title,
description: doc.data().description,
thumbnail: doc.data().thumbnail,
date: doc.data().date,
link: doc.data().link,
source: doc.data().source,
})
console.log(this.articles)
})
})
},
beforeCreate() {
window.addEventListener('beforeCreate', this.asyncData)
},
},
}
</script>
【问题讨论】:
-
实际上是
@click。你试过了吗?@click只是客户端。 -
否则,使用
fetch()钩子并管理加载状态可能会很好,同时从 firebase 获取数据。你也可以使用created(),但是这个不会阻塞渲染,直到它完成获取。实际上,只有asyncData可以,但它只是在页面转换之间,因此,如果您到达此页面,它将不会被处理。不确定,但也许中间件可能会阻塞,需要尝试一下。你的事件监听器是否正常工作? -
是的,如果我添加一个带有@click=“asyncData”的按钮,它就可以工作。但我不想通过手动点击触发数据加载。我希望数据在渲染时自动加载。
-
不,
beforeCreate。它会触发什么吗?否则,我给了你替代方案 (fetch()hook)。 -
这个顺便说一句:
$fetchState.pending如文档中所述:nuxtjs.org/docs/2.x/components-glossary/pages-fetch
标签: javascript vue.js nuxt.js server-side-rendering