Maison > Questions et réponses > le corps du texte
P粉7885713162023-09-06 19:21:54
Je ne sais pas si vous l'avez configurélockSitesLoading = true
, et je ne sais pas où vous l'avez configuré.
Voici un exemple fonctionnel.
Vue.use(Vuex) const store = new Vuex.Store({ state: { sites: [], lockSitesLoading: false }, actions: { async loadSites(context) { context.state.lockSitesLoading = true; const sites = await context.dispatch('getSites'); context.state.sites = sites.data; context.state.lockSitesLoading = false; }, async getSites(context) { return new Promise(function(resolve, reject){ setTimeout(function(){ resolve({ data: ['site1', 'site2', 'site3']}) },1000) }) } } }) new Vue( { el:'#app', store: store, async mounted() { await this.$store.dispatch('loadSites') }, computed: { sites() { return this.$store.state.sites }, lockSitesLoading() { return this.$store.state.lockSitesLoading } }, watch: { lockSitesLoading(newVal, oldVal) { console.log(`lockSitesLoading: ${oldVal} -> ${newVal}`) } } } )
#app { line-height: 1.75; } [v-cloak] { display: none; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.7.14/vue.min.js"></script> <script src="https://unpkg.com/vuex@3.6.2/dist/vuex.js"></script> <div id="app" v-cloak> sites: {{sites}}<br/> lockSitesLoading: {{lockSitesLoading}} </div>
P粉0630399902023-09-06 09:50:26
Nécessite essentiellement une promesse d'attendre :
let unwatch; await new Promise(resolve => { unwatch = vm.$watch('$store.state.lockSitesLoading', loading => { if (!loading) { resolve(); } }, { immediate: true }); }); unwatch(); await vm._getSitesOnline();
Veuillez noter que si lockSitesLoading
bloque l'exécution pour une raison quelconque, cela entraînera une fuite de mémoire.
Il existe peut-être un moyen plus propre d'y parvenir en utilisant l'API de composition et les compositions VueUse.