У меня есть простое приложение с общим стеком:
- Внутренний сервер (Rails)
- Приложение внешнего интерфейса (Vue)
- База данных (PG)
Приложение Vue извлекает данные из серверной части, используя действие библиотеки хранилища Vuex следующим образом:
// store/store.js
import Vue from 'vue';
import Vuex from 'vuex';
import * as MutationTypes from '@/store/mutation-types';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
investment: {},
},
mutations: {
[MutationTypes.SET_INVESTMENT_SHOW](state, investment) {
state.investment = investment;
},
},
actions: {
fetchInvestment({ commit }, id) {
InvestmentsApi.get(id).then((response) => {
commit(MutationTypes.SET_INVESTMENT_SHOW, response.data);
});
},
},
getters: {
participation: state =>
state.investment.included[0],
},
});
Действие вызывается в ловушке созданного жизненного цикла моего компонентавот так:
// components/Investment.vue
import { mapActions, mapGetters } from 'vuex';
export default {
name: 'Investment',
computed: {
...mapState(['investment']),
...mapGetters(['participation']),
},
created() {
this.fetchData(this.$route.params.id);
},
methods: mapActions({
fetchData: 'fetchInvestment',
}),
};
В коде, который я написал выше, есть проблема, я на самом деле использую вычисленное значение 'участие' в моем шаблоне так:
<BaseTitleGroup
:subtitle="participation.attributes.name"
title="Investissements"
/>
Иконечно, поскольку я использую участие во время визуализации компонента, я получаю эту ошибку из метода getter:
Error in render: "TypeError: Cannot read property '0' of undefined"
found in
---> <InvestmentSummary> at src/views/InvestmentSummary.vue
<App> at src/App.vue
<Root>
Я думаю, что есть несколько решений для решения этой проблемы, и мне интересно, какое из нихЭто лучшая практика или, если есть, лучшая.
- Первым решением было бы добавить атрибут v-if в мой шаблон, чтобы предотвратить рендеринг элемента во время ожидания данных
- Con: Смещение рендеринга (элемент начинает рендеринг, когда данные есть)?
- Con: Мне бы пришлось делать это для каждого компонента моего приложения, который имеет дело с асинхронными данными, интуитивно я бы предпочел иметь дело с этим где-то еще (может быть,store?).
- Рендеринг элемента и помещение поддельных данных в хранилище, например «Загрузка ...»
- Con: Небольшой сбой, который видит пользователь при загрузкеего страница ужасна, когда текст переходит от загрузки к реальному тексту.
- Con: Пустую версию моего магазина было бы больно писать и очень большой, когда мое приложение масштабируется
- Измените получатель, чтобы он возвращал исходные пустые данные, а не хранилище.
- Con: Получатели усложняются
- Con: Как насчет данных, которые не нуждаются в получателе (возможно, онинапрямую доступны из штата)
- Что-то еще?
Я ищу лучшее решение для работы с этим шаблоном, даже если он один извыше, я просто не уверен, чтокоторый был бы лучшимБольшое спасибо за чтение!Кроме того, я использую vue framework, но я думаю, что это скорее общий вопрос о современной среде javascript, обрабатывающей асинхронные данные и рендеринг.
Извините за длинный пост, вот картошка!(Упс, не на 9гаг;))