vue.js - vuecli2 this.router 报错???

 

问题描述:

aaa(){
         
        console.log(this.$router)
        //跳转页面
        this.$router.push('/zhifu')
      },

mian.js

import Vue from 'vue'
import App from './App'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import BaiduMap from 'vue-baidu-map'
import WotDesign from 'wot-design'
import 'wot-design/lib/theme-default/index.css'
import router from '../router/index.js'


Vue.config.productionTip = false



Vue.use(WotDesign)
Vue.use(ElementUI);
Vue.use(BaiduMap, {
  ak: 'xxxxxxxxxxxxx'
});

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>',
  render: h => h(App)
})

路由
index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
import zhifu from '../src/components/zhifu'

Vue.use(VueRouter)

export default new VueRouter({
  routes:[
    {
      path: '/zhifu',
      name:'zhifu',
      component: zhifu,
    },
  ]
})

报错如下

undefined
vue.esm.js:5105 [Vue warn]: Error in v-on handler: "TypeError: Cannot read properties of undefined (reading 'push')"

found in

---> <ElButton> at packages/button/src/button.vue
       <BmMap>
         <App> at src/App.vue
           <Root>
warn$2 @ vue.esm.js:5105
logError @ vue.esm.js:3763
globalHandleError @ vue.esm.js:3759
handleError @ vue.esm.js:3726
invokeWithErrorHandling @ vue.esm.js:3742
invoker @ vue.esm.js:1552
invokeWithErrorHandling @ vue.esm.js:3735
Vue.$emit @ vue.esm.js:2821
handleClick @ element-ui.common.js:9465
invokeWithErrorHandling @ vue.esm.js:3735
invoker @ vue.esm.js:1552
original_1._wrapper @ vue.esm.js:8013
vue.esm.js:3767 TypeError: Cannot read properties of undefined (reading 'push')
    at VueComponent.aaa (App.vue:244:1)
    at invokeWithErrorHandling (vue.esm.js:3735:1)
    at VueComponent.invoker (vue.esm.js:1552:1)
    at invokeWithErrorHandling (vue.esm.js:3735:1)
    at Vue.$emit (vue.esm.js:2821:1)
    at VueComponent.handleClick (element-ui.common.js:9465:1)
    at invokeWithErrorHandling (vue.esm.js:3735:1)
    at HTMLButtonElement.invoker (vue.esm.js:1552:1)
    at original_1._wrapper (vue.esm.js:8013:1)
l

 

第 1 个答案:

aaa()是按钮触发的, 是@click="aaa()" 这样写了吧?
渲染中就直接触发了。 要么就是你调用的时候把this指向更改了,this.$router是undefined


 

第 2 个答案:

怎么看都像是没有做好 vue-router 的初始化啊。
只看到了你引入和安装了 vue-routerimport VueRouter from 'vue-router'Vue.use(VueRouter)),并没有看到你实例化 vue-router 也没有看到你挂载到Vue实例上面。
如果有做的话,最好把业务代码贴完整一些,因为只是基础设置工作并不会牵扯到敏感信息。路由表可以脱敏为空数组([])。

正常情况下需要在引入 vue-router 之后实例化 vue-router。所以稍加修改的话 main.js 会是这样。

import Vue from 'vue'
import App from './App'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import BaiduMap from 'vue-baidu-map'
import WotDesign from 'wot-design'
import 'wot-design/lib/theme-default/index.css'
import VueRouter from 'vue-router';

Vue.use(WotDesign)
Vue.use(VueRouter)
...

const router = new VueRouter({
  mode: 'history',
  routes: [] // 路由表
})
...

const app = new Vue({
  el: '#app',
  // ...
  router,
  render: h => h(App)
})

回答更新:

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import BaiduMap from 'vue-baidu-map'
import WotDesign from 'wot-design'
import 'wot-design/lib/theme-default/index.css'
- import VueRouter from 'vue-router';
+ import router from '/router/index.js'


Vue.use(WotDesign)
- Vue.use(VueRouter)


Vue.config.productionTip = false

- const router = new VueRouter({
-   mode: 'history',
-   routes: [] // 路由表
- })


Vue.use(ElementUI);

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>',
  render: h => h(App)
})

以及修改一下 /router/index.js 文件

+ import Vue from 'vue'
import VueRouter from 'vue-router'
import zhifu from '../src/components/zhifu'

+ Vue.use(VueRouter)

export default new VueRouter({
  routes:[
    {
      path: '/zhifu',
      name:'zhifu',
      component: zhifu,
    },
  ]
})

 

第 3 个答案:

在router文件夹下的index.js下加这个试下

VueRouter.prototype.push=function(location,resolve,reject){
    if(resolve&&reject){
        originPush.call(this,location,resolve,reject);
    }else{
        originPush.call(this,location,()=>{},()=>{});
    }
}
https://blog.csdn.net/m0_46615524/article/details/125898988

<input type="text" class="input-name" v-model ...