@kirill98402
starter fron-end dev

Как вывести массив данных, Vue.js?

Есть такая проблемка, вожусь несколько дней не могу решить. Есть база данных на firebase делаю к ней GET запрос с помощью axios, вытягиваю данные из .json файла, конвертирую их и записываю в массив - присваивая каждой записи свой уникальный id. Задача: нужно вывести, по нажатию кнопки циклом, или как - передать данные в таблицу, или списком, либо обычными п-тегами. Сейчас только могу выводить определённую строку задав ей id.

Axios GET запрос:

fetchData () {
  axios.get('https://db-http.firebaseio.com/devices.json')

 .then(res => {
      console.log(res)
      const data = res.data
      const devices = []
      for (let key in data) {
        const device = data[key]
        device.id = key
        devices.push(device)
      }
      console.log(devices)
      this.named = devices.named
      this.napruga = devices.napruga
      this.location = devices.location
    })
    .catch(error => console.log(error))
}


Вот как пытаюсь вывести в теги:
<form @submit.prevent="fetchData">

      <p >Name:{{named}}-Location:{{location}}-Napruga:{{napruga}}</p>
      <ul v-if="devices && devices.length">
        <li v-for="device of devices" :key="device.id">
          <p>{{device.named}}</p>
          <p>{{device.location}}</p>
          <p>{{device.napruga}}</p>
        </li>
      </ul>

      <div class="submit">
      <button type="submit">Submit</button>
      </div>
    </form>


Вот как получается вывести, но только одну строку заданную с индексом:
fetchData () {
  axios.get('https://db-http.firebaseio.com/devices.json')

 .then(res => {
      console.log(res)
      const data = res.data
      const devices = []
      for (let key in data) {
        const device = data[key]
        device.id = key
        devices.push(device)
      }
      console.log(devices)
      this.named = devices[1].named
      this.location = devices[1].location
      this.napruga = devices[1].napruga
    })
    .catch(error => console.log(error))
}
}


Вот результаты со скринами + как данные передаются в консоль и массив: нужно сделать так чтобы все данные которые передаются, выводились построчно, а не только одна строка по заданному индексу.

5c126df3af773647388003.jpeg5c126e036bc23081658183.jpeg
  • Вопрос задан
  • 1895 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
Так, и в чём проблема-то? У вас же уже всё есть - при обработке ответа вы собираете массив devices, в шаблоне вы массив devices выводите. Надо только закинуть devices из обработки ответа в data - вместо той ерунды, что у вас сейчас (отдельные свойства одного элемента).

UPD. Вынесено из комментариев:

Немного недопонял, можешь продемонстрировать как это задать?

В data компонента определяете массив devices:

data: () => ({
  devices: [],
}),

При получении ответа закидываете в devices полученные данные:

this.devices = Object.entries(res.data).map(([ id, n ]) => ({ ...n, id }));

Ну и выводите их:

<ul>
  <li v-for="d in devices" :key="d.id">
    ...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@nvdfxx
Senior Pomidor developer
по-моему, с firebase как-то по другому работают, не? В проект его подключить, например, и юзать родные методы получения данных, чтоб все в реал-тайме работало
Ответ написан
Комментировать
kleinmaximus
@kleinmaximus
Senior Full-stack Javascript Developer
Метод fetchData должен возвращать Promise.
fetchData () {
  return ...
}

Поставьте return - в противном случае серверный рендеринг не сработает.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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