VUEJS vue-router 从嵌套路由访问路由器

VUEJS vue-router access router from nested routes

我在从嵌套视图访问路由 object 时遇到问题。这是简化的代码:

main.js

import Vuetify from 'vuetify'
import VueRouter from 'vue-router'
import Vuetify from 'vuetify'

Vue.use(VueRouter)
Vue.use(Vuetify)

const router = new VueRouter({
  routes : [
    {path : '/contacts', component: Contacts,
      children: [
        {
          path: ':id',
          component: ContactDetails
        }
      ]
    },
  ],
  mode: 'history'
})


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

ContactDetails.vue

<template>
    <v-btn icon dark class="mr-3" @click.native="editContact">
            <v-icon>edit</v-icon>
    </v-btn>
</template>

<script>

    export default {
        data : () => ({

        }),
        methods: {
           editContact: ()=>{
                console.log('edit contact');
                this.$router.go(-1) //this gives an error
           } 
        },


    }
</script>

它说 "router is undefined",当我使用

this.$router.go(-1)

从主要路线(又名/contacts),它有效。我在 child:

上尝试了以下所有代码
router.go(-1)
$router.go(-1)
this.$router.go(-1)
this.router.go(-1)
this.$parent.$router.go(-1)

None 其中有效。有没有办法从嵌套路由到达路由器 object?或者我应该向 parent 发出事件并从那里更改视图?

我在您的代码中发现了一个错误 - 它在 ()=>{...} 函数中:)

使用箭头函数,您正在寻址 ContactDetails-component this(对象),它确实不包含任何 $router。将箭头函数更改为 function() {} 后,您的代码将按预期工作,因为 Vue 重新绑定到声明 $router 的实例。

现在,让我们看一下您的 working copy (codepen) 代码:

Vue.use(VueRouter)

let ContactDetails = {
    mounted() {
      console.log('ContactDetails mounted...');
    },
    methods: {
       editContact: function() {
            console.log('edit contact');
            this.$router.go(-1) //this DOES NOT give an error ANYMORE
       } 
    },
    template: `<button @click="editContact">edit</button>`,
}
let Contacts = {
  components: {ContactDetails},
  mounted() {
    console.log('Contacts mounted...');
  },
  template: `Contacts... <ContactDetails></ContactDetails>`,
};

const router = new VueRouter({
  mode: 'hash',
  routes : [{
      path : '/contacts',
      component: Contacts,
      children: [{
          path: 'id',
          component: ContactDetails
        }]
    }],
});

const vm = new Vue({
  el: '#app',
  components: {
    Contacts,
    ContactDetails,
  },
  router
});

vm.$router.push("/contacts/id");
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue-router/3.0.2/vue-router.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <router-view></router-view>
</div>