Приложение Vue правильно отображает данные API только в локальной версии, а не в производственной сборке (с использованием vuex, axios и parcel) - PullRequest
0 голосов
/ 14 октября 2018

У меня есть базовое клиентское визуализированное приложение vue, которое извлекает массив json из конечной точки API и отображает данные из каждого элемента массива как элемент списка в упорядоченном списке.

Данные отображаются так, как ожидалось, когда я работаю локально, используя parcel index.pug, чтобы ускорить мою локальную среду разработки.Вот снимок экрана с ожидаемым упорядоченным списком, как показано в моей локальной среде разработчиков на localhost:1234:

enter image description here

Однако данные не отображаются должным образомкогда я строю для производства (используя parcel build index.pug).Вот снимок экрана с неожиданным поведением в производственном режиме (который вы можете увидеть в прямом эфире по адресу https://errands.netlify.com/):

enter image description here

Обратите внимание, что производственная версия знает о выбранныхДанные API - это массив длиной 6 (потому что он выводит 6 пустых <li> с), но по какой-то причине рабочая версия не знает данных внутри каждого объекта массива.

Полный исходный коддля этого приложения здесь https://github.com/brianzelip/groceries-vue.

Основной соответствующий код (вызов axios API, который обновляет хранилище vuex, а затем выводит упорядоченный список) живет в TheGroceryForm.vue, который также включен здесь:

<template>
  <form action="/submit" method="POST">
    <ol class="list-reset border rounded">
      <li class="item" v-for="item in allGroceryItems" v-bind:key="item._id">
        <GroceryFormItemEditLink/>
        <GroceryFormItemCheckboxInput :slug="item.slug"/>
        <GroceryFormItemCheckboxLabel :slug="item.slug" :name="item.name"/>
        <GroceryFormItemQtySelector :slug="item.slug"/>
        <GroceryFormItemStoresSelector
          :stores="item.stores"
          :slug="item.slug"
          :defaultStore="item.defaultStore"/>
      </li>
    </ol>
  </form>
</template>

<script>
import axios from 'axios';

import GroceryFormItemEditLink from './GroceryFormItemEditLink.vue';
import GroceryFormItemCheckboxInput from './GroceryFormItemCheckboxInput.vue';
import GroceryFormItemCheckboxLabel from './GroceryFormItemCheckboxLabel.vue';
import GroceryFormItemQtySelector from './GroceryFormItemQtySelector.vue';
import GroceryFormItemStoresSelector from './GroceryFormItemStoresSelector.vue';

export default {
  data() {
    return {};
  },
  components: {
    GroceryFormItemEditLink,
    GroceryFormItemCheckboxInput,
    GroceryFormItemCheckboxLabel,
    GroceryFormItemQtySelector,
    GroceryFormItemStoresSelector
  },
  computed: {
    allGroceryItems() {
      return this.$store.state.allGroceryItems;
    },
    allGroceryItemsCount() {
      return this.$store.getters.allGroceryItemsCount;
    }
  },
  getters: {},
  created() {
    axios
      .get('https://groceries-vue-api.glitch.me/get')
      .then(res => {
        console.log('axio.get worked! res.data =', res.data);
        console.log(`typeof res.data = ${typeof res.data}`);

        const groceryData = res.data;
        console.log('groceryData =', groceryData);
        console.log(`typeof groceryData = ${typeof groceryData}`);

        const newData = res.data.map(obj => obj);
        console.log('newData', newData);
        return newData;
      })
      .then(data => {
        console.log('data from second then() =', data);
        return data;
      })
      .then(data => (this.$store.state.allGroceryItems = data))
      .catch(error => {
        console.log('ERROR! ->', error);
      });
  }
};
</script>

Почему данные меняются, когда я создаю свое приложение для производства? И как я могу изменить это поведение, чтобы получить ожидаемый результат?

1 Ответ

0 голосов
/ 15 октября 2018

Вам следует избегать использования самозакрывающихся тегов.

https://github.com/vuejs/vue/issues/1036

Так что ваш TheGroceryForm.vue будет

<template>
    <form action="/submit" method="POST">
        <ol class="list-reset border rounded">
            <li class="item" v-for="item in allGroceryItems" v-bind:key="item._id">
        <GroceryFormItemEditLink></GroceryFormItemEditLink>
        <GroceryFormItemCheckboxInput :slug="item.slug"></GroceryFormItemCheckboxInput>
        <GroceryFormItemCheckboxLabel :slug="item.slug" :name="item.name"></GroceryFormItemCheckboxLabel>
        <GroceryFormItemQtySelector :slug="item.slug"></GroceryFormItemQtySelector>
        <GroceryFormItemStoresSelector
          :stores="item.stores"
          :slug="item.slug"
          :defaultStore="item.defaultStore"></GroceryFormItemStoresSelector>

      </li>
    </ol>
  </form>
</template>
...