繁体   English   中英

渲染前如何在类星体中进行异步

[英]How to do async in quasar before rendering

在我的 vue 应用程序中,我希望元标记的内容是网络请求的结果。 为了完成这项工作,我正在学习类星体以使我的应用程序部分 SSR,但我无法弄清楚如何在服务器端渲染完成之前运行一些异步的东西。

这是隔离问题的一点 MRE。 我尝试延迟承诺,然后在下面的元数据中设置一个值metaData

<script>
import { defineComponent } from 'vue'
import { useMeta } from 'quasar'

const metaData = {
  // sets document title
  title: 'title initial value',

  // optional; sets final title as "Index Page - My Website", useful for multiple level meta
  titleTemplate: title => `The title is: ${title}`,

  // meta tags
  meta: {
    // note: for Open Graph type metadata you will need to use SSR, to ensure page is rendered by the server
    ogTitle: {
      property: 'og:title',
      // optional; similar to titleTemplate, but allows templating with other meta properties
      template (ogTitle) {
        return `${ogTitle} - My OG Website`
      }
    }
  }
}

const delay = time => new Promise(resolve => setTimeout(resolve, time))

export default defineComponent({
  async beforeCreate () {
    await delay(3000)
    // I want this to be in the rendered page
    metaData.title = 'title, initialized after a delay'
  },
  setup () {
    useMeta(metaData)
  },
  name: 'IndexPage'
})
</script>

我已经证明beforeCreate正在执行,但我认为正在发生的事情是它在await上返回一个承诺,而 SSR 只是向前推进。 title的初始值最终出现在客户的标签中,而不是我想要的。

有没有一种方法可以使用 SSR 但在渲染之前做一些异步工作?

在服务器端呈现的 Vue 应用程序中处理异步数据的一种方法是使用asyncData方法。 在服务器端呈现发生之前调用此方法。 它允许您执行异步操作。

例如:

export default {
    async asyncData({ params, $http }) {
      const post = await $http.$get(`https://api.nuxtjs.dev/posts/${params.id}`)
      return { post }
    }
  }

您可以通过在 Quasar 应用程序的quasar.conf.js文件中设置ssr: true选项来使用 Quasar 中的asyncData方法。 然后,您可以在 Vue 组件中使用asyncData方法,如上例所示。

更多信息: https ://nuxtjs.org/docs/features/data-fetching/#async-data

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM