2016-11-23 21 views
7

ben kullanıyorum:Vuex eyaletinden Vue Router nasıl kullanılır? Benim bileşenleri olarak

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

rotayı değiştirmek için. Şimdi Vuex işlemlerine bir yöntem taşıdım ve elbette this.$router artık çalışmıyor. Ayrıca Vue.router. Peki, Vuex eyaletinden yönlendirici yöntemlerini nasıl arayabilirim, lütfen?

+1

http://stackoverflow.com/questions/40736799/how-to-navigate-route-from-vuex-actions sayfasının kopyası – Saurabh

cevap

11

sana yönlendirici örneğini ihtiyaç olarak vuex-router-sync burada yardımcı olmaz tahmin ediyorum. bu WebPack içinde global olarak örneğini ayarlayabilirsiniz İdeal hissetmez rağmen nedenle

, yani

şimdi
global.router = new VueRouter({ 
    routes 
}) 

const app = new Vue({ 
    router 
    ... 

Eğer mümkün olmalıdır: uygulamanız içindeki herhangi bir yerden router.push({ name: 'home', params: { id: 1234 }})


Alternatif olarak, yukarıdaki fikirlerden hoşlanmıyorsanız, eyleminizden bir Söz verebilirsiniz. Sonra eylem başarıyla tamamlanırsa, bir mutasyon veya bir şey çağırır varsayalım ve resolve Sözünü yapabilirsiniz. Ancak başarısız olursa ve yönlendirme gereksinimleri ne olursa olsun size reject Sözünü çarptı.

sen yönlendiricileri taşıyabilirsiniz Bu şekilde geçirilen varsayarak yani sadece reddedilen Promise yakalar ve vue-yönlendirici itmek ateşler bir bileşeni, ben rootState.router eylemleriniz satışa sunulacak inanıyoruz

# 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

İlk öneri çalışmanız - teşekkürler. Yönlendiriciyi global olarak bağlamak neden kötü bir fikir? Benzer şekilde, Vue-Kaynağına global erişime ihtiyacım var - bazı nedenlerle Vue içe aktarma ve Vue.http kullanımı iyi çalışıyor (ancak en uygun mu?). Vue-Kaynak'ı global'e de eklemeli miyim? İkinci noktanıza baktığımda (ben çok fazla söz anlayamıyorum) – daninthemix

+0

Bunun kötü bir fikir olduğundan emin değilim, bu biraz yanlış geliyor - bunun gibi bir şey olmalı ** vuex -router senkronize **. Promises'i gerçekten sevdiğim gibi ikinci fikrini hazırladım! Vue-source ile olan noktasında, evet bu iyi - 'Vue.http', bu şekilde kullanılmaya, bu küresel yapmaya gerek yok. – GuyC

+0

Promise sözdizimimle sorun yaşıyorum - bakması için bir saniye bekler misiniz? http://jsbin.com/webezelaki/edit?js – daninthemix

0

içine yönlendirmek Ana Vue yapıcınızdaki bir seçenek olarak router. Guyc belirtildiği gibi

, ben de bunu giderir sonra eylem ve yönlendirme gelen bir söz dönen daha iyi olabilir düşünüyordum. Basit anlamda: dispatch(YOUR_ACTION).then(router.push()).

+0

Evet, sonuçta GuyC'nin bahsettiği Promise yaklaşımına girdim. RootState hakkında nasıl bilgi edineceğimizi/nasıl öğrendiniz? Bunu herhangi bir yerde belgelenmiş görmedim. – daninthemix

+0

Evet, muhtemelen olması gereken dokümanlardaki vurgu verilmiyor. Vuex [eylemleri] (https://vuex.vuejs.org/en/actions.html) belgelerinde yer alan ve aksi takdirde yalnızca [modüller] 'de belirtilen (https://vuex.vuejs.org/en/) modules.html) belgeler - kesinlikle size atlamıyor. – Chris

+0

Varsayılan olarak rootState'de "yönlendirici" yoktur. Manuel olarak enjekte etmek de, vuex-router-sync kullanılıyorsa durumun bir parçası olan 'rotanın kendisi' dışında yönlendirici örneği çoğunlukla değişmez olduğu için fazladan olacaktır. –

İlgili konular