Vue — как показать массив данных в таблице?

Я пытаюсь создать компонент, который при загрузке страницы выполняет запрос к моему серверу, получает некоторые данные и показывает эти данные в vuetify-datatable. Мне удалось получить данные, но моя таблица их не покажет, так как она просто пуста.

Вот компонент:

<template>
  <v-simple-table dark>
    <template v-slot:default>
      <thead>
        <tr>
          <th class = "text-left">
            Asset
          </th>
          <th class = "text-left">
            Total
          </th>
        </tr>
      </thead>
      <tbody>
        <tr
          v-for = "item in balances"
          :key = "item.asset">
          <td>{{ item.asset }}</td>
          <td>{{ item.total }}</td>
        </tr>
      </tbody>
    </template>
  </v-simple-table>
</template>


<script>

var balancesArr = []

fetch('http://127.0.0.1:8000/binance/getbalance')
  .then(response => response.json())
  .then(data => {
    balancesArr = data
    console.info(balancesArr)
  })

export default {
    data () {
      return {
        balances: balancesArr,
      }
    },
}

</script>

Вот main.js:

import Vue from "vue/dist/vue.js";
import Vuex from "vuex";
import storePlugin from "./vuex/vuex_store_as_plugin";
import App from './App.vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
import Vuetify from "vuetify";
import "vuetify/dist/vuetify.min.css";

Vue.use(Vuetify);
Vue.use(Vuex);
Vue.use(storePlugin);
Vue.config.productionTip = false;
Vue.use(VueAxios, axios)

new Vue({
  render: h => h(App)
}).$mount('#app')

И html-файл:

<div id = "app">
        <app></app>
    </div>

Я успешно вижу, что данные печатаются на моей консоли, но ничего не отображается в таблице. Что я здесь делаю неправильно?

Просто объявите balances пустым массивом в data: data: () => ({ balances: [] }) . Это сделает его реактивным, и когда он изменится (после того, как вы получите данные), шаблон будет уведомлен об изменении.

tao 21.12.2020 12:01

Большое спасибо! Я пробовал это, но получил неопределенную ошибку на балансах

JayK23 21.12.2020 12:05

Вам нужно будет быть намного более конкретным, чем «получил неопределенную ошибку на балансах». Это может означать слишком многое.

tao 21.12.2020 12:08

Я имею в виду, что ошибка в том, что баланс не определен: Uncaught (в обещании) ReferenceError: балансы не определены

JayK23 21.12.2020 12:10

О, проблема в том, что вы извлекаете данные за пределы экземпляра. Вы должны получить после того, как компонент смонтирован. Если вы сделаете это раньше, вы можете получить ответ до того, как компонент будет смонтирован, поэтому ответ будет некуда поместить. Конечно, вы можете сохранить его, а затем поместить на компонент в mounted(). Однако наиболее распространенный способ сделать это — поместить fetch() внутрь mounted().

tao 21.12.2020 12:12

Да, я понимаю, что я должен сделать это по-другому. Я пришел из JQuery, просто новичок в Vue, и я чувствую себя ошеломленным, если не сказать больше.

JayK23 21.12.2020 12:20

Давайте продолжим обсуждение в чате.

tao 21.12.2020 12:25
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
0
7
1 408
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы делаете это неправильно, вы неправильно используете vue:

<script>



export default {
    created() {

      fetch('http://127.0.0.1:8000/binance/getbalance')
       .then(response => response.json())
       .then(data => {
         this.balances = data
        
       })
    },
    data () {
      return {
        balances: [],
      }
    },
}

</script>

Спасибо за ваш ответ. Очень возможно, что я использую его неправильно, я только начал работать с Vue и пытаюсь понять это. Я пробовал это, но я все еще получаю пустую таблицу

JayK23 21.12.2020 12:03

@ Томер, как ты видишь, не так важно отвечать первым. Гораздо важнее дать полный ответ. Вместо того, чтобы заявлять, что «вы делаете это неправильно», объясните конкретно, что ОП делает неправильно и, что более важно, почему это неправильно. Публикация кода без его объяснения гораздо менее полезна, чем объяснение проблемы и предлагаемого вами решения.

tao 21.12.2020 12:52
Ответ принят как подходящий

Цитата

Вы можете использовать хук жизненного цикла mounted для получения данных о начальной загрузке страницы.

export default {
  data() {
    return {
      balances: [],
    }
  },
  mounted() {
    this.fetchData()
  },
  methods: {
    fetchData() {
      fetch('http://127.0.0.1:8000/binance/getbalance')
        .then(response => response.json())
        .then(data => {
          this.balances = data
        })
    }
  }
}

вы также можете использовать created для получения данных на начальной странице, созданной перед монтированием для справки введите здесь описание ссылки например.

export default {
  data() {
    return {
      balances: [],
    }
  },
  created() {
    this.fetchData()
  },
  methods: {
    fetchData() {
      fetch('http://127.0.0.1:8000/binance/getbalance')
        .then(response => response.json())
        .then(data => {
          this.balances = data
        })
    }
  }
}

Спасибо за ваш ответ! Я пробовал это, но таблица все еще пуста

JayK23 21.12.2020 12:03

Вы можете поместить журнал консоли в строку this.balances = data и увидеть, как вы получаете данные

Nilesh Patel 21.12.2020 12:07

Да, я пытался добавить console.info, но он не запускается

JayK23 21.12.2020 12:09

Я обновил свой, вот что я получил: [Vue warn]: $listeners только для чтения, [Vue warn]: $attrs только для чтения. Я пытаюсь понять, что вызывает эти ошибки

JayK23 21.12.2020 12:21

Другие вопросы по теме