2017-05-05 3 views
0

Ich gewöhne mich an Vuex, da ich in der Lage sein muss, einen Speicher zu haben, auf den ich leicht zugreifen und aktualisieren kann, wenn eine andere Komponente geändert wird.VueJS - Vuex Daten in einer Mutation zuweisen

Derzeit meine store sieht wie folgt aus:

import vue from 'vue'; 
import Vuex from 'vuex'; 

vue.use(Vuex); 

export default new Vuex.Store({ 
    state: { 
     users: { 

      columns: [], 
      model: [], 

     } 
    }, 

    mutations: { 
     fetchUsers: function(state) { 
      axios.get(`/users?search_input=`) 
      .then(function(response) { 


      }); 
     } 
    } 

}); 

Die columns und model wird dynamisch nach unten gezogen von einem Ajax-Request und meine Users sieht wie folgt aus:

<script> 

    export default { 

    mounted() { 
     this.$store.commit('fetchUsers'); 
    }, 
    computed: { 
     columns() { 
      return this.$store.state.users.columns; 
     } 

     model() { 
      return this.$store.state.users.model 
     } 
    }, 
    } 

</script> 

Mein Problem ist, dass die Anwendung Daten von Ajax geladen haben muss. Zum Beispiel columns werden von einer AJAX-Anfrage in fetchUsers und innerhalb der Users ich this.$store.commit('fetchUsers'); setzen, aber gibt es eine alternative Möglichkeit, die ich tun kann, ohne commit vorzugsweise im Laden selbst zu verwenden?

+0

Vuex [Mutationen] (https://vuex.vuejs.org/en/mutations.html) ** ** mutieren die Zustand - hier ändern Sie den Zustand selbst - sie sind immer synchron. Vuex [Aktionen] (https://vuex.vuejs.org/en/actions.html) tun _things_, wie Netzwerkanforderungen, um Daten zu erhalten - sie können asynchron sein. Sobald Sie eine Aktion versenden, müssen Sie sie über eine Mutation festschreiben. – wing

Antwort

2

Im Laden u ur Daten asynchron geladen werden können über Aktionen dann die Änderungen verpflichten, eine Mutation verwendet wird.

import vue from 'vue'; 
import Vuex from 'vuex'; 

vue.use(Vuex); 

export default new Vuex.Store({ 
    state: { 
     users: { 
      columns: [], 
      model: [], 

     } 
    }, 

    actions: { 
     fetchUsers: function(context) { 
       axios.get(`/users?search_input=`) 
       .then(function(response) { 

        context.commit("FETCHUSERS", { 
        columns: response.columns, 
        model: response.model 
        }); 
       }); 
     } 
    } 
    mutations: { 
     FETCHUSERS: function(state, payload) { 
       state.users.columns = payload.columns; 
       state.users.model = payload.model; 
     } 
    } 

}); 

Versand die Aktion von der Komponente

<script> 

export default { 

    ..... 
    methods: { 
     fetchUsers: function() { 
      this.$store.dispatch("fetchUsers"); 
     } 
    } 

1

Mutationen müssen synchron sein: https://vuex.vuejs.org/en/mutations.html

Sie Ajax-Request in actions bewegen sollte, die async sein kann. Sie erhalten Daten in der action, Commit-Mutation, die empfangene Daten als Nutzlast angibt, und die Mutation weist der State-Eigenschaft einen Wert zu.

Alternativ können Sie Asynchron-Anfrage in Komponentenmethode machen und einen Wert an die Speichereigenschaft direkt zuweisen: this.$store.state.prop = value

+0

Gibt es irgendwelche Dokumentation bezüglich der 'Aktionen' in vuex/vuejs - Ich kann keine Dokumentation in Bezug auf diese – Phorce

+0

finden. Ich würde empfehlen, alle Dokumentseiten über Mutationen durchzulesen und dann mit Aktionen fortzufahren: https : //vuex.vuejs.org/en/actions.html Mutationen sind so ausgelegt, dass Daten synchron mutiert werden und Aktionen asynchrone Tasks ausführen. – wostex

+0

Ich habe folgendes hinzugefügt: 'actions {fetchUsers (context) {}}' Dann innerhalb meiner Komponente mache ich: 'this. $ Store.dispatch ('fetchUsers');' aber den Fehler: 'Unbekannter Mutationstyp: fetchUsers ' – Phorce

Verwandte Themen