Я не знаю, является ли это лучшей практикой, но я разрешил компонентам обрабатывать исключения. Этот метод имеет свои плюсы (вам не нужно загрязнять состояние управлением ошибками) и минусы (вы должны повторять код управления ошибками для каждого вызова действия).
- Все сервисные звонки будут совершаться в действиях
- Состояние будет устанавливаться только в мутациях.
- Все сервисные вызовы будут возвращать обещание с разрешением (данные для загрузки в состоянии) и отклонением (сообщение об ошибке для представления).
- Будет перехватчик, который отклонит ответ в случае пользовательской ошибки (здесь вы можете указать, если ответ содержит ошибку, отклонить ответ и отправить в качестве ошибки проп, теперь вам не нужно деконструировать ответ в действии).
Я приведу упрощенный пример (я использую axios, вы можете узнать, как это сделать с используемой вами библиотекой).
Действия в Vuex являются асинхронными. Так что вам не нужно пытаться / ловить их.
ApiService - Добавить пользователя
const addUser = () => {
return new Promise((resolve, reject) => {
axios
.post(url, user)
.then(response => resolve(response.data))
.catch(error => reject(error));
});
};
магазин
async addUser({commit}) {
const data = await apiService.addUser();
commit('SET_USER', data);
return data;
}
если обещание в apiService.addUser
разрешено, то будет выполнено принятие, если отклоненный axios вернет обещание, и вы можете отловить ошибку в компоненте, который вызывает действие.
Компонент
async addUser() {
this.isLoading = true;
try {
await this.$store.dispatch('updatePatient', this.form);
} catch (error) {
// here goes the code to display the error or do x if there is an error,
// sometimes I store an errors array in the data of the component other times I do x logic
}
this.isLoading = false;
}
Состояние
Теперь ваше состояние станет чище, так как вам не нужно хранить там эти ошибки.
state {
users: []
}