Вот одна идея: создать компонент, который предоставляет (используя Vue s provide
/ inject
API):
- Функция, которая запускает операцию. Это вызывается при отправке формы. Он обеспечивает
whenDone
обратный вызов, который либо выполняется, либо игнорируется, в зависимости от того, отменена ли операция. - Функция, которая отменяет все ожидающие операции. Функция отмены может быть вызвана, когда пользователь уходит.
Реализация может выглядеть так:
const CancellableOperationProvider = {
name: "CancellableOperationProvider",
props: {},
data: () => ({
pendingOperations: []
}),
/*
* Here we provide the theme and colorMode we received
* from the props
*/
provide() {
return {
$addOperation(func) {
this.pendingOperations.push(func);
func(function whenDone(callback) {
if (this.pendingOperations.includes(func)) callback();
});
},
$cancelAllOperations() {
this.pendingOperations = [];
}
};
},
render() {
return this.$slots.default[0];
}
};
Использование будет выглядеть следующим образом:
const Home = {
template: '<div><button @click="submit">Save and go Bar!</button></div>',
inject: ['$addOperation', '$cancelAllOperations'],
methods: {
async submit() {
this.$addOperation(whenDone => {
await setTimeout(() => {
whenDone(() => this.$router.push("/bar"));
}, 5000);
});
}
}
};
Затем вы можете добавить навигационную охрану к маршрутизатору Vue, чтобы вызывать $cancelAllOperations
после нажатия любой ссылки. Поскольку $cancelAllOperations
доступен только через API inject
, вам нужно будет создать компонент, который обязательно добавит навигационный щит к маршрутизатору Vue после монтирования и удалит его при размонтировании. Дайте мне знать, если это не сработает - я давно не делал Vue.