Ich möchte ein einfaches Spinner aktivieren/deaktivieren.Vuejs Vuex-Komponente nicht aktualisiert, wenn Store-Änderung
Ich habe einen Speicher erstellen, um den Zustand des Spinners handhaben:
const spinnerStore = {
state: {
isActive: false
},
mutations: {
startSpinner: function (state) {
console.log('start');
state.isActive = true
},
stopSpinner: function (state) {
console.log('stop');
state.isActive = false
}
},
actions: {
startSpinner: function ({commit}) {
commit('startSpinner');
},
stopSpinner: function ({commit}) {
commit('stopSpinner');
}
}
}
const store = new Vuex.Store({
modules: {
'mapEditor': mapEditorStore,
'spinner': spinnerStore
}
});
Und ich erstellen Vue um die Ansicht zu behandeln.
<script type="x-template" id="vueSpinnerTemplate">
<div class="mdl-spinner mdl-js-spinner mdl-spinner--single-color" style="position: absolute; bottom: 50px; right: 50px; z-index: 10" v-bind:class="{'is-active': isActive}"> </div>
</script>
<script>
var vm = new Vue({
store,
template: '#vueSpinnerTemplate',
computed: {
isActive: function() {
console.log('called');
return this.$store.state.spinner.isActive
}
}
}).$mount('#spinner-mount-point');
</script>
Vue.use (Vuex) irgendwo genannt, weil ich diese Meldung, wenn ich diese Zeile versuchen: [vuex] already installed. Vue.use(Vuex) should be called only once.
Wenn ich im Laden den Standardwert auf true
gesetzt sehe ich meine Spinner so html/template ist in Ordnung.
In meinem Code verwende ich JQuery eine async Anfrage zu machen, und ich möchte, dass meine Spinner so zeigen, die ich benutze:
store.dispatch('startSpinner');
$.ajax({
url : "myUrl",
success: function (data) {
store.dispatch('stopSpinner');
}
});
Unfortanutelly, ich kann nicht der Spinner sehen auftauchen. (Meine Anfrage dauert 2 secondes)
Also habe ich in der Konsole sah, und ich sehe:
genannt Start Stopp genannt
das bedeutet, dass die Komponente nicht isActive zwischen Start angerufen hat und stoppen .
Wie das
Dank
bearbeiten zu beheben: Ich habe eine beggining Lösung.
Meine Ajax-Anfrage ist synchron. Ich denke, es blockiert die Komponente zu rendern oder so ähnlich ... Wenn ich async: true
setzen kann die Spinner sehen
Ich sehe keine 'Vue.use (Vuex)' irgendwo in Ihrem Code und Sie erstellen keinen Vuex-Speicher ('neuer Vuex.Store') - Sie erstellen nur eine gemeinsam genutzte Statusvariable. – PatrickSteele
Ich habe nicht den ganzen Code in den Post, siehe meine Bearbeitung :) – Epitouille