Ich versuche, eine Liste von Ankündigungen (von der API abgerufen) auf einer Seite anzuzeigen. Ich verwende einen Vuex-Store und habe einen Status namens Announcement. Ich m?chte auch, dass diese Liste jedes Mal aktualisiert wird, wenn der Benutzer die Seite aktualisiert/betritt. Deshalb habe ich Lifecycle-Hooks verwendet, insbesondere Mounted(). Ich habe eine Versandfunktion, die eine Club-ID als Parameter akzeptiert. Das Problem ist, dass ich versuche, auf das Ankündigungs-Array in der Vue-Komponente zuzugreifen, und es ist einen Schritt langsamer als die Version im Vuex-Store.
Der folgende Inhalt befindet sich in der Vue-Komponente ClubDetails.vue
name: "ClubDetails", data(){ console.log("inside data") return { club_id: this.$route.params.clubID, announcements: this.$store.state.ClubDetails.announcements } }, mounted() { this.$store.dispatch('ClubDetails/getAnnouncements', this.club_id) console.log("After dispatch function") },
Das ist mein ShopClubDetails.js
namespaced: true, state: { announcements: [], }, mutations: { setAnnouncements(state, newArr) { state.announcements = newArr console.log("Inside Mutation") }, }, actions: { async getAnnouncements({ commit, state }, club) { const params = new URLSearchParams([ ['clubId', club] ]); await axios.get("http://127.0.0.1:8000/api/announcements", { params }).then(res => { console.log("inside dispatch function") commit('setAnnouncements', res.data) }).catch(err => { console.log(err) }) }, }, getters: { getAllAnnouncements(state) { return state.announcements; } }, };
Nach der Druckanweisung entspricht die Ausführungsreihenfolge nicht meinen Erwartungen
Die Reihenfolge, die ich erwarte, ist diese: interne Daten –> interne Mutation –>
Ein weiteres Problem besteht darin, dass ich beim Aktualisieren der Seite erwarte, dass mount() erneut aufgerufen wird und das Array aktualisiert und erneut angezeigt wird, aber wenn ich die Seite aktualisiere, verschwinden alle Inhalte des Arrays
這是因?yàn)?this.$store.dispatch('ClubDetails/getAnnouncements', this.club_id)
正在對(duì)服務(wù)器做出響應(yīng)并且是異步的,并且需要時(shí)間從服務(wù)器獲取公告。而 console.log("Afterdispatch function")
在從服務(wù)器收到響應(yīng)之前執(zhí)行。
這就是為什么您首先看到后調(diào)度函數(shù),然后再看到內(nèi)部調(diào)度函數(shù)。
嘗試像這樣在調(diào)度之前放置等待。
async mounted() { await this.$store.dispatch('ClubDetails/getAnnouncements', this.club_id) console.log("After dispatch function") },
你應(yīng)該返回axios.get方法,因?yàn)樗且粋€(gè)Promise,不需要同時(shí)使用await和then。您還可以從 getAnnouncements
中刪除異步,因?yàn)槟辉偈褂玫却?/p>
getAnnouncements({ commit, state }, club) { const params = new URLSearchParams([ ['clubId', club] ]); return axios.get("http://127.0.0.1:8000/api/announcements", { params }).then(res => { console.log("inside dispatch function") commit('setAnnouncements', res.data) }).catch(err => { console.log(err) }) },