2016-11-23 2 views
7

In meinen Komponenten Ich habe mit:Wie verwende ich Vue Router vom Vuex-Zustand?

this.$router.push({ name: 'home', params: { id: this.searchText }});

Route zu ändern. Ich habe jetzt eine Methode in meine Vuex-Aktionen verschoben, und this.$router funktioniert natürlich nicht mehr. Noch tut Vue.router. Also, wie rufe ich Router-Methoden aus dem Vuex-Zustand, bitte?

+1

Duplikat von http://stackoverflow.com/questions/40736799/how-to-navigate-route-from-vuex-actions – Saurabh

Antwort

11

Ich nehme an, vuex-router-sync wird hier nicht helfen, wie Sie die Router-Instanz benötigen.

Deshalb, obwohl dies nicht ideal fühlt man die Instanz als globale innerhalb webpack einstellen könnte, das heißt

global.router = new VueRouter({ 
    routes 
}) 

const app = new Vue({ 
    router 
    ... 

jetzt sollten Sie in der Lage: router.push({ name: 'home', params: { id: 1234 }}) von überall in Ihrer App


Als eine Alternative, wenn Sie die Idee des oben genannten nicht mögen, könnten Sie ein Versprechen von Ihrer Aktion zurückgeben. Dann, wenn die Aktion erfolgreich abgeschlossen wird, nehme ich an, es ruft eine Mutation oder etwas und Sie können die Promise resolve. Wenn es jedoch fehlschlägt und die Bedingung, die die Weiterleitung braucht, ist Sie reject die Promise.

Auf diese Weise können die Router umzuleiten in eine Komponente bewegen kann, die einfach die abgelehnte Versprechen fängt und feuert die vue-Router schieben, dh

# vuex 
actions: { 
    foo: ({ commit }, payload) => 
    new Promise((resolve, reject) => { 
     if (payload.title) { 
     commit('updateTitle', payload.title) 
     resolve() 
     } else { 
     reject() 
     } 
    }) 

# component 
methods: { 
    updateFoo() { 
    this.$store.dispatch('foo', {}) 
     .then(response => { // success }) 
     .catch(response => { 
     // fail 
     this.$router.push({ name: 'home', params: { id: 1234 }}) 
     }) 
+0

Ihr erster Vorschlag funktioniert - danke. Warum ist es eine schlechte Idee, den Router an global anzuhängen? Ebenso benötige ich globalen Zugriff auf Vue-Resource - aus irgendeinem Grund funktioniert das Importieren von Vue und die Verwendung von Vue.http gut (aber ist es optimal?), Wo immer ich Vue-Resource benötige. Soll ich Vue-Resource auch global anhängen? Was deinen zweiten Punkt betrifft, werde ich das untersuchen (ich verstehe Versprechungen nicht viel) – daninthemix

+0

Ich bin mir nicht wirklich sicher, dass es eine schlechte Idee ist, es fühlt sich nur ein bisschen falsch an - so sollte etwas in ** vuex eingebaut sein -router-sync **. Ich habe die zweite Idee ausgearbeitet, nur für den Fall, dass ich Promises wirklich mag! Auf deinen Punkt mit Vue-Ressource, ja, das ist in Ordnung - "Vue.http" soll auf diese Weise verwendet werden, keine Notwendigkeit, das global zu machen. – GuyC

+0

Ich habe Probleme mit meiner Promise-Syntax - würde es dir etwas ausmachen, eine Sekunde zu suchen? http://jsbin.com/webezelaki/edit?js – daninthemix

0

Ich glaube rootState.router in Ihre Aktionen zur Verfügung stehen wird, vorausgesetzt, Sie übergeben router als eine Option in Ihrem Haupt-Vue-Konstruktor.

Wie GuyC erwähnte, dachte ich auch, dass es besser wäre, ein Versprechen von Ihrer Aktion und dem Routing zurückzugeben, nachdem es verrechnet wurde. In einfachen Worten: dispatch(YOUR_ACTION).then(router.push()).

+0

Ja, ich ging letztendlich mit dem Promise-Ansatz, den GuyC erwähnt. Wie haben Sie erfahren, wie wir von rootState wissen sollen? Hab das nirgendwo dokumentiert gesehen. – daninthemix

+0

Ja, es ist wahrscheinlich nicht der Schwerpunkt in der Dokumentation, die es sein sollte. Es wird in der Dokumentation zu Vuex [actions] (https://vuex.vuejs.org/en/actions.html) erwähnt und ansonsten nur in den [modules] erwähnt (https://vuex.vuejs.org/en/ modules.html) Dokumentation - es springt definitiv nicht auf dich hinaus. – Chris

+0

Im rootState gibt es standardmäßig keinen 'router'. Die manuelle Injizierung wäre ebenfalls übertrieben, da die Router-Instanz größtenteils unveränderbar ist, mit Ausnahme der "route" selbst, die Teil des Status ist, wenn vuex-router-sync verwendet wird. –