Способ сделать это - сохранить значения состояния.
Например, если ваш магазин использует один API, вы должны сделать что-то подобное.Однако для нескольких API рекомендуется хранить каждое состояние загрузки API по отдельности или использовать отдельный объект для каждого API.
Обычно вы можете иметь 4 состояния, которые я предпочитаю иметь вглобально доступный модуль:
// enums.js
export default {
INIT: 0,
LOADING: 1,
ERROR: 2,
LOADED: 3
};
Затем переменная может храниться в состоянии vuex, где apiState инициализируется с помощью INIT
.Вы также можете инициализировать массив с помощью []
, но в этом нет необходимости.
import ENUM from "@/enums";
// store.js
export default new Vuex.Store({
state: {
apiState: ENUM.INIT,
accounts: [],
// ...other state
},
mutations: {
updateAccounts (state, accounts) {
state.accounts = accounts;
state.apiState = ENUM.LOADED;
},
setApiState (state, apiState) {
state.apiState = apiState;
},
},
actions: {
loadAccounts ({commit) {
commit('setApiState', ENUM.ERROR);
somFetchInterface()
.then(data=>commit('updateAccounts', data))
.catch(err=>commit('setApiState', ENUM.ERROR))
}
}
});
Затем, добавив несколько computed
s, вы можете выбрать, какой компонент отображается.Это показывает преимущество использования состояния, поскольку вы можете легко определить состояние ошибки и показать анимацию загрузки, когда состояние не готово.
<template>
<ChildComponent v-if="apiStateLoaded"/>
<Loader v-if="apiStateLoading"/>
<Error v-if="apiStateError"/>
</template>
<script>
import ENUM from "@/enums";
export default {
computed: {
...mapState({
apiState: state=> state.apiState
}),
apiStateLoaded() {
return this.apiState === ENUM.LOADED;
},
apiStateLoading() {
return this.apiState === ENUM.LOADING || this.apiState === ENUM.INIT;
},
apiStateError() {
return this.apiState === ENUM.ERROR;
},
})
}
</script>
В качестве альтернативы, если вы просто инициализируете свой asyncListValues
в хранилище пустым массивом []
, вы можете избежать ошибок, ожидающих массив.