Как передать свойства (props), для которых данные получаются асинхронно?

Как можно корректно передать асинхронно полученный массив с объектами от родительского компонента к дочерним компонентам во Vue.js, учитывая, что данные загружаются с помощью fetch запроса? При попытке передать полученный массив в пропсы дочернего компонента, значения остаются пустыми, даже если данные от fetch запроса приходят правильно. Как я могу правильно передать эти данные в дочерний компонент?
  • 25 января 2024 г. 12:28
Ответы на вопрос 3
Чтобы передать данные, полученные асинхронно, из родительского компонента в дочерние компоненты в Vue.js, вы можете следовать следующему шаблону:

1. **Инициализация данных**: В родительском компоненте создайте пустой массив (или объект) в свойствах данных, который будет содержать асинхронные данные после их загрузки.

2. **Запрос данных**: Используйте `mounted` или `created` хуки жизненного цикла компонента, чтобы выполнить асинхронный запрос и получить данные.

3. **Обновление данных**: После получения данных в асинхронном запросе обновите ранее инициализированный массив (или объект).

4. **Прослушивание изменений**: В дочернем компоненте используйте `props` для приема данных и добавьте прослушивание изменений, если это необходимо, с помощью хуков жизненного цикла (например, `watch`), чтобы реагировать на изменения.

Пример кода для родительского компонента:

```vue
<template>
  <div>
    <!-- Передача асинхронных данных в дочерний компонент -->
    <child-component :items="items"></child-component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      items: [] // Инициализация пустого массива
    };
  },
  async mounted() {
    // Запрос данных после монтирования компонента
    try {
      const response = await fetch('URL');
      this.items = await response.json(); // Обновление данных после загрузки
    } catch (error) {
      console.error('Ошибка при получении данных:', error);
    }
  }
};
</script>
```

Пример кода для дочернего компонента:

```vue
<template>
  <div>
    <!-- Использование полученных данных -->
    <ul>
      <li v-for="item in items" :key="item.id">{{ item.name }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      default: () => [] // Определение пропса с типом Array
    }
  },
  watch: {
    // Опционально: Следим за изменениями props 'items'
    items(newItems) {
      // Реагируем на изменения
      console.log('Данные обновлены', newItems);
    }
  }
};
</script>
```

Помните, что во Vue.js пропсы предназначены для одностороннего потока данных (от родителя к ребенку), и их напрямую менять не рекомендуется. Это обеспечивает чистоту и предсказуемость потока данных.

Если дочерний компонент должен изменить эти данные и передать их обратно в родительский компонент, вы должны использовать события (`$emit`) для уведомления родителя о необходимости изменения данных.
У вас newsList не реактивно 
Замените на:
const newsList = ref([])
В методе получения данных:
newsList.value = result
v-if="list.length"
Похожие вопросы