【问题标题】:Nuxt @onloadstart not triggering function using beforeCreateNuxt @onloadstart 不使用 beforeCreate 触发功能
【发布时间】: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


【解决方案1】:

就让组件在页面加载之前自动获取数据而言,您已接近可行的解决方案。而不是beforeCreate,你会使用the asyncData hook(这似乎是你最初的尝试)。

问题是您已将asyncData 声明为组件方法,但它需要位于对象定义的顶层才能用作组件挂钩。 p>

export default {
  // ✅ declared as a hook
  asyncData() {...},

  methods: {
    // ❌ this should be at the top level
    asyncData() {...} 
  },
}

请注意,asyncData 只能用于页面或布局组件。否则需要切换到the fetch hook

asyncData() 无法访问this(因为它在页面组件之前运行),因此应该删除这些引用。相反,asyncData() 应该返回一个类似于从data() 返回的数据对象(即{ ​articles }):

export default {
  ​asyncData() {
    ​const articles = []

    ​await fireDb
      ​.collection('articles')
      ​.get()
      ​.then((querySnapShot) => {
        ​querySnapShot.forEach((doc) => {
          ​articles.push(/*...*/)
        ​})
      ​})

    console.log(articles)
    return { articles }
  }
}

【讨论】:

  • 我注意到return articlesforEach 中,这没有意义。该返回需要是asyncData() 的最后一行,在forEach 之外。
猜你喜欢
  • 2014-02-01
  • 2018-02-16
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多