Я не уверен, как оформление будет работать с Typescript / Vue, но в одном из моих проектов я просто использовал миксин для предоставления такой функции.
Следующее решение не протестировано, но дает вам Общая идея о том, как использовать этот миксин для отслеживания состояний загрузки:
// loading_mixin.js
export default {
data() {
return {
loader: {
// This object will contain various keys you pass to
// the `wrap()` function `type` parameter.
}
}
},
methods: {
/**
* @param {Promise} promise
* @param {String} type
* @returns {Promise}
*/
wrap(promise, type) {
let loaded = this.loader[type] ? this.loader[type].loaded : false;
this.$set(this.loader, type, {loading: true, loaded: loaded});
return promise.then((data) => {
this.$set(this.loader, type, {loading: false, loaded: true});
return data;
}).catch((err) => {
this.$set(this.loader, type, {loading: false, loaded: false});
throw err;
});
},
}
}
Использование (YourComponent.vue
):
<template>
<div>
<loading-component :loader="loader.load_data" />
</div>
</template>
<script>
import loadingMixin from '...';
export default {
mixin: [loadingMixin],
methods: {
load() {
this.wrap(this.loadMyData(1, 2), 'load_data').then((data) => {
// Handle success.
}).catch((err) => {
// Handle err.
})
},
loadMyData(a, b) {
return Promise.resolve(a + b);
}
}
}
</script>
Надеюсь, это даст вам некоторые идеи.