2016-11-18 3 views
3

Fiddle: hereKann ich von Getter in Vuex do Versand

Ich bin ein Webapp mit Vue 2 mit Vuex zu schaffen. Ich habe einen Speicher, in dem ich Zustandsdaten von einem Getter abholen möchte. Was ich will, ist, wenn Getter herausfindet, dass Daten noch nicht aufgefüllt sind, ruft er ab und holt die Daten.

Es folgt mein Vuex Speicher:

const state = { 
    pets: [] 
}; 

const mutations = { 
    SET_PETS (state, response) { 
    state.pets = response; 
    } 
}; 

const actions = { 
FETCH_PETS: (state) => { 
     setTimeout(function() { 
      state.commit('SET_PETS', ['t7m12qbvb/apple_9', '6pat9znxz/1448127928_kiwi']) 
    }, 1000) 
} 
} 

const getters = { 
    pets(state){ 
    if(!state.pets.length){ 
     state.dispatch("FETCH_PETS") 
    } 
    return state.pets 
    } 
} 

const store = new Vuex.Store({ 
    state, 
    mutations, 
    actions, 
    getters 
}); 

Aber ich bin immer folgende Fehlermeldung:

Uncaught TypeError: state.dispatch is not a function(…)

Ich weiß, dass ich das tun kann, von beforeMount von Vue Komponente, aber ich habe mehrere Komponenten, die benutzt denselben Vuex-Speicher, also muss ich es in einer der Komponenten machen, welche sollte das sein und wie wird es sich auf andere Komponenten auswirken.

Antwort

1

Getter kann Versand nicht nennen, da sie die state nicht context des Ladens

Aktionen aufrufen Zustand übergeben werden, Versand, begehen, da sie den Kontext übergeben werden.

Getter werden verwendet, um einen "abgeleiteten Zustand" zu verwalten.

Wenn Sie setzen stattdessen auf den pets Zustand auf die Komponenten, die sie benötigen, dann würden Sie nur FETCH_PETS von der Wurzel Ihrer App aufrufen und die Notwendigkeit für die Getter

+0

Dank für die Antwort, zwei Dinge entfernen: 1. Wenn Es gibt mehrere Komponenten, die die Haustiere benutzen, in welchen Komponenten sie geholt werden sollte. Was kann ein zentraler Ort sein, um dies zu tun? 2. In ähnlicher Weise kann dies nicht auch von berechnet werden? – Saurabh

+0

1. vuex ist Ihr zentraler Speicher, so dass alle über eine berechnete Eigenschaft darauf zugreifen können, z. B. 'compressed: {pets() {return this. $ Store.state.pets}}' Übergeben des Speichers in den Stamm Ihrer App ermöglicht dies. 2. Sie könnten die mounted-Methode Ihres Apps-root verwenden, aber ich würde keine berechnete Eigenschaft verwenden, um asynchrone Updates für vuex zu erstellen. Stattdessen können sie nur den Speicher überwachen (wie oben) und aktualisiert werden, wenn der asynchrone Vorgang abgeschlossen ist und der Commit den Status seiner neuen Pet-Daten übergeben hat. – GuyC

+0

, um Punkt 1 zu klären. Ich würde die Async-Vuex-Dispatch() innerhalb Ihrer Apps-Root oder einer Komponente auslösen, die logisch aufgerufen wird, wenn das Tierobjekt zuerst benötigt wird. Ohne die App-Struktur zu sehen, die schwer zu lokalisieren ist, aber ich bin mir sicher, dass Sie einen Ort finden, der Sinn ergibt. – GuyC

Verwandte Themen