uonick
@uonick
Сгибатель бананов

Как разрулить ситуацию с асинхронными данными в Vue?

Привет!
Что делать, когда данные в дочернем компоненте вызывают ошибки? Я изначально сделал что-то не так?

Проблема такая:
Существует самая обычная страница просмотра поста в блоге. Под нее создан компонент.
Он является родительским для дочерних типа "мета информация", "контент самого поста", "футер" и т.д.
В дочерние компоненты передается объект post он и содержит всю необходимую информацию.
Но родительский компонент (страница поста) получает данные из хранилища vuex на этапе beforeMount или created а там происходит запрос данных с сервера.

Чтобы внести ясность, вот код родителя:

<template lang="pug">
  div
    page-title(v-bind="page")
    .container.padding-bottom-3x.mb-2
      .row.justify-content-center
        .col-lg-10
          post-meta(v-bind="post")
          post-content(v-bind="post")
          post-footer(v-bind="post")
          post-navigation(v-bind="post")
          comments(v-bind="comments")
          new-comment-form(v-bind="post")
</template>

<script>
export default {
  name: 'PostsShow',
  computed: {
    post() {
      return this.$store.getters['blogs/getPostContent']
    },
    page() {
      return {
        title: this.post.title,
      }
    },
    comments() {
      return this.post.comments
    }
  },
  beforeMount() {
    this.$store.dispatch('blogs/fetchPost', this.$route.path)
  },
  components: {
    ...
  }
}
</script>


Сама же проблема наблюдается в дочерних. Например компонент post-meta использует в коде author.name но на момент загрузки этого компонента этого свойства нет и валит ошибками:

5b1d0222f197b386088408.png5b1d0231c3ff0290107582.png

Что-то мне подсказывает, что этот компонент вообще не должен грузиться, если в него не попал объект post.

Это код дочернего компонента:
<template lang="pug">
  .single-post-meta
    .column
      .meta-link
        span {{__('blogs.show.by')}}
        router-link(
          :to="{name:'members.show', params: {login: author.login}}"
          ) {{author.name}}
      .meta-link
        span {{__('blogs.show.in')}}
        router-link(
          v-for="tag in tags",
          :key="tag.name"
          :to=""
        ) {{tag.name}},
    .column
      .meta-link
        a(href="#")
          i.icon-clock
          | {{published_at}}
      .meta-link
        a.scroll-to(href="#")
          i.icon-speech-bubble
          | {{comments_count}}
</template>

<script>
export default {
  name: 'PostMeta',
  props: {
    author: Object,
    tags: {
      type: Array,
      default: ()=>([]),
    },
    comments_count: Number,
    published_at: String,
  }
}
</script>


Причем эта ситуация наблюдается с вложенными свойствами, типа: post.author.name
Что я делаю не так?
  • Вопрос задан
  • 225 просмотров
Пригласить эксперта
Ответы на вопрос 1
kulakoff
@kulakoff Куратор тега Vue.js
Vue.js developing
Может просто скрыть вот так:
.col-lg-10(v-if="post")
          post-meta(v-bind="post")
          post-content(v-bind="post")
          post-footer(v-bind="post")
          post-navigation(v-bind="post")
          comments(v-bind="comments")
          new-comment-form(v-bind="post")
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы