javascript - 推迟 Vue block 的渲染,直到数据加载

标签 javascript vue.js vue-router

我正在使用 Vue 和 Vue 路由器。一个常见的问题是加载显示某种需要异步加载的外部资源的组件时。

假设我有一个简单的 Vue 组件,它显示从外部存储库加载的帖子的标题:

<template>
  <div>
    {{ post.title }}
  </div>
</template>

<script>
export default {
  data () {
    return {
      post: null
    }
  },

  route: {
    waitForData: true,
    data () {
      return postRepo.fetch(this.$route.params.id)
      .then(post => {
        return {post: post}
      })
      .catch(err => { console.warn(err) })
    }
  }
}
</script>

我的路由 data 方法返回一个 promise ,当解析时返回插入到组件数据中的 post 对象。

这一切都工作正常,一旦加载帖子,帖子标题就会显示在页面中,但控制台会抛出警告:

[Vue warn]: Error when evaluating expression "post.title": TypeError: Cannot read property 'title' of null

问题是 Vue 试图在设置帖子之前渲染模板。有没有办法阻止模板渲染(这就是我认为 waitForData 的用途),直到 route.data() 方法得到解析?

我知道我可以使用 v-if 但我希望尽可能避免过多的 DOM 操作。

最佳答案

http://router.vuejs.org/en/pipeline/data.html

推荐的方法是将依赖于加载数据的内容放入:

<div v-if="!$loadingRouteData"></div>

关于javascript - 推迟 Vue block 的渲染,直到数据加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38461845/

相关文章:

javascript - angularjs 应用程序中的异步函数

javascript - 为什么 jQuery 将其原型(prototype)别名为 `fn` ?

javascript - 如何在 ChartJS 中创建自定义图例

vue.js - 在 Vue Bootstrap 中动态生成指令名称

ios - CapacitorJS iOS 使用 Vue Router 向后滑动会导致空白页面

javascript - 如何将所有内容(相对的,绝对的,...)向下移动?

javascript - 如何检查 Vuejs v-if 中的数组元素是否相等?

javascript - 有没有办法在 Vue JS 的路由之前在全局中指定 'any' 路由?

typescript - 在 router.ts 中访问 Vuex store 模块的状态

javascript - 如何使用 javascript 更改 css href =""?