2016-11-23 10 views
7

私が使用してきた:Vuex州からVue Routerを使うには?私のコンポーネントで

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

はルートを変更するには。私は今、メソッドを私のVuexアクションに移しました。もちろん、this.$routerは動作しません。 Vue.routerもありません。だから、どうやってVuex州からルータメソッドを呼び出すのですか?

+1

重複するhttp://stackoverflow.com/questions/40736799/how-to-navigate-route-from-vuex-actions – Saurabh

答えて

11

vuex-router-syncはルータのインスタンスが必要なのでここで助けにならないと思います。

ので、これは理想的に感じることはありませんが、あなたが今、あなたのことができるようにすべきであるすなわち

global.router = new VueRouter({ 
    routes 
}) 

const app = new Vue({ 
    router 
    ... 

、WebPACKの内のグローバルとしてインスタンスを設定できますどこでも、あなたのアプリの中


から router.push({ name: 'home', params: { id: 1234 }})

上記の考えが気に入らない場合は、あなたの行動からプロミスを返すことができます。その後、アクションが正常に完了すると、私はそれが突然変異か何かを呼び出すと仮定し、あなたはresolveというPromiseを行うことができます。しかし、それが失敗し、リダイレクトが必要とする条件があれば、rejectプロミス。

あなたは、ルータを移動することができます。この方法は、あなたが渡されたと仮定すると、私はrootState.routerは、あなたの行動に利用可能になると信じすなわち

# 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

あなたの最初の提案は機能します - ありがとう。なぜルータをグローバルに接続するのは悪い考えですか?同様に、私はVueリソースへのグローバルアクセスが必要です。何らかの理由でVueをインポートし、Vue.httpを使用するとうまく動作しますが、最適ですか?Vue-Resourceが必要です。グローバルにもVue-Resourceを添付する必要がありますか?あなたの第2のポイントについては、私はそれを調べます(私は約束をあまり理解していません) – daninthemix

+0

私は本当に悪い考えではないと思っています。ちょっと間違っていると感じます。これは** vuex -router-sync **私は2番目のアイデアについて精緻化しました。 vue-resourceのご使用のポイントでは、うまくいきます。「Vue.http」はこの方法で使用することを意図しており、そのグローバル化を行う必要はありません。 – GuyC

+0

私のPromise構文に問題があります。もう一度見てみてください。 http://jsbin.com/webezelaki/edit?js – daninthemix

0

、単に拒否約束をキャッチし、VUE-ルータのプッシュを起動コンポーネントにリダイレクトメインVueコンストラクタのオプションとしてrouterを使用してください。

GuyCが言及したように、私はあなたが解決した後であなたの行動とルーティングから約束を返す方が良いかもしれないとも考えていました。簡単な言葉で:dispatch(YOUR_ACTION).then(router.push())

+0

はい、私は最終的にGuyCが述べたPromiseのアプローチに行きました。どのようにして/どのようにrootStateについて知りたいと思いますか?それはどこにも書かれていない。 – daninthemix

+0

ええ、ドキュメントに重点を置いていない可能性があります。これは、Vuex [actions](https://vuex.vuejs.org/en/actions.html)のドキュメントで言及されているものであり、[modules](https://vuex.vuejs.org/ja/)にのみ記載されています。 modules.html)documentation - それは間違いなくあなたに飛び乗ることはありません。 – Chris

+0

デフォルトでは、rootStateには「router」はありません。 vuex-router-syncを使用している場合、状態の一部である 'route'自体を除いて、ルータのインスタンスはほとんど不変であるため、手動で注入することは過度になります。 –

関連する問題