lahma
@lahma
Фронтенд

Почему не работает forEach?

Получаю ошибку: Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'forEach')

<script setup>
import { ref, watchEffect } from 'vue'

const posts = ref()
const database = ref()

watchEffect(async () => {
  const response = await fetch('http://localhost:3000/posts')
  posts.value = await response.json()
})

posts.value.forEach((item) => {
  database.value.push({ id: item.id, name: item.name })
})

</script>

<template>
  <div v-for="item in posts">
    {{ item.name }}
  </div>
</template>


Почему не forEach не работает. Из-за обращения к .value все ломается. Подскажите в чем дело плиз!
  • Вопрос задан
  • 167 просмотров
Пригласить эксперта
Ответы на вопрос 2
yarkov
@yarkov Куратор тега Vue.js
Помог ответ? Отметь решением.
const posts = ref([]);
const database = ref([]);
Ответ написан
@Smirator
Привет.
Проблема была в том, что posts.value в момент вызова forEach ещё не был инициализирован, так как данные загружаются асинхронно через fetch. Вначале posts.value — это undefined, и из-за этого попытка вызвать forEach на нём вызывала ошибку.

Попробуй такой вариант:
import { ref, watchEffect } from 'vue'

const posts = ref([])
const database = ref([])

watchEffect(async () => {
  const response = await fetch('http://localhost:3000/posts')
  posts.value = await response.json()

  if (posts.value.length) {
    posts.value.forEach((item) => {
      database.value.push({ id: item.id, name: item.name })
    })
  }
})
</script>

<template>
  <div v-for="item in posts" :key="item.id">
    {{ item.name }}
  </div>
</template>


Теперь posts и database изначально инициализированы как пустые массивы, и forEach вызывается только после того, как данные загружены. Ошибка не должна появиться.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы