Vue 2.xおよびVuex 2.xでWebアプリを作成しています。 http呼び出しを介してリモートロケーションからいくつかの情報を取得しています。その呼び出しが失敗した場合は、他のページにリダイレクトする必要があります。
GET_PETS: (state) => {
return $http.get('pets/').then((response)=>{
state.commit('SET_PETS', response.data)
})
},
error => {this.$router.Push({path:"/"}) }
)
}
しかし、this.$router.Push({path:"/"})
は次のエラーを表示します。
Uncaught(約束)TypeError:未定義のプロパティ「プッシュ」を読み取ることができません
どうすればこれを達成できますか。
シミュレートされたJsFiddle: here
import router from './router'
router.Push
を使用します
そのようなシンプル。
ルーターをアプリに挿入していないように見えるため、「未定義」になります
Vue-routerの以前のバージョンでは、次のようになりました:Vue.use(VueRouter)
、2.0では、以下のようにアプリにルーターを挿入できます。
const routes = [
{ path: '/foo', component: Foo },
]
const router = new VueRouter({
routes
})
const app = new Vue({
router // inject the router
}).$mount('#app')
これにより、アプリ全体でthis.$router
として利用できるようになります。
関連する質問に答えた後: Vuex状態からVueルーターを使用する方法は? Vuexはthis.$router
でルーターインスタンスを受信しないようです。したがって、ルータインスタンスへのアクセスを提供するために2つの方法が提案されました。
1つ目はより直接的で、インスタンスに対してグローバルなwebpackを設定することを伴います。
2つ目は、Promiseをvuexアクションで使用して、コンポーネントがPromiseの解決/拒否のアクションに従ってルーターインスタンスへの参照を利用できるようにすることです。
この例が役立ちます。
import Vue from "vue";
import VueRouter from "vue-router";
...
Vue.use(VueRouter);
export const router = new VueRouter({
mode: 'hash',
base: "./",
routes: [
{ path: "/", component: welcome},
{ path: "/welcome", component: welcome},
]
})
import {router} from "../main.js"
export const someAction = ({commit}) => {
router.Push("/welcome");
}
アプリの場所の状態をストア内の他のアプリの状態から分離し、ルーターとストアの両方を管理する必要がないため、場所の状態を管理するVuexモジュールを作成しましたinsideストア。
これで、他の状態変更と同様に、アクションをディスパッチすることでナビゲートできます。
dispatch("router/Push", {path: "/error"})
これには、アニメーション化されたページの遷移などを簡単に処理できるという追加の利点があります。
独自のrouter
モジュールをロールバックするのは難しくありませんが、次のようにすることもできます。
main.js
(すべてのモジュールを「インストール」してVue
インスタンスを作成するもの、つまりsrc/main.js
):
const vm = new Vue({
el: '#app',
router,
store,
apolloProvider,
components: { App },
template: '<App/>'
})
export { vm }
これは私の例ですが、ここで最も重要なのはconst vm
とrouter
です
store
で:
import { vm } from '@/main'
yourMutation (state, someRouteName) {
vm.$router.Push({name: someRouteName})
}
追伸import { vm } from '@/main'
を使用すると、vm.$root
の一部のコンポーネントに必要なbootstrap-vue
など、Vuex
で必要なものにアクセスできます。
P.P.S.すべてが読み込まれたときにvm
を使用できるようです。つまり、mounted()
がvm
の前に来る/発生するため、someMutation
をmounted()
の内部で呼び出す場合、someMutation
の内部ではvm
を使用できません。