初步回答
在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',我们可以访问Vuex 中我们需要的任何内容,例如vm.$root,这是bootstrap-vue 的某些组件所需要的。
P.P.S.似乎我们可以在加载所有内容时使用vm。换句话说,如果我们在mounted() 中调用someMutation,我们不能在someMutation 中使用vm,因为mounted() 在vm 被创建之前出现/出现。
新答案
Constantin 的answer(接受的那个)比我的好,所以只想给新手演示一下如何实现。
在核心目录内(在我的情况下是在 /src 内),在 App.vue、main.js 和其他人旁边我有 router.js 的内容:
import Vue from 'vue'
import Router from 'vue-router'
// Traditional loading
import Home from '@/components/pages/Home/TheHome'
// Lazy loading (lazy-loaded when the route is visited)
const Page404 = () => import(/* webpackChunkName: "Page404" */ '@/components/pages/404)
const Page503 = () => import(/* webpackChunkName: "Page503" */ '@/components/pages/503)
Vue.use(Router)
const router = new Router({
mode: 'hash',
base: process.env.BASE_URL,
linkExactActiveClass: 'active',
routes: [
{
path: '*',
name: 'Page404',
component: Page404
},
{
path: '*',
name: 'Page503',
component: Page503
},
{
path: '/',
name: 'Home',
component: Home
},
// Other routes
{....},
{....}
]
})
// Global place, if you need do anything before you enter to a new route.
router.beforeEach(async (to, from, next) => {
next()
})
export default router
将我们的路由器导入main.js:
import Vue from 'vue'
import App from './App.vue'
import router from './router'
Vue.config.productionTip = false
const vm = new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
export { vm }
最后,在你的组件内部,或者 Vuex 或者其他任何地方import router from './router' 做任何你需要的事情,比如router.push(...)