Vue-Router 动态路由

某个模式下匹配到的所有路由,都映射到同一组件User。

by logan70

HTML

<script src="https://cdn.bootcss.com/vue/2.5.17/vue.min.js"></script>
<script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>

<div id="app">
  <h1>Vue-Router 动态路由</h1>
  <input type="text" v-model="userId">
  <button @click="$router.push(`/user/${userId}`)">查询用户</button>
  <p>
    <!-- 路由导航,to属性决定导航地址 -->
    <!-- router-link编译后默认渲染为a标签 -->
    <router-link to="/user/1">1号用户</router-link>
    <router-link to="/user/2">2号用户</router-link>
  </p>
  <!-- 路由渲染出口 -->
  <router-view></router-view>
</div>

JavaScript

const User = {
	template: '<div><p>这是User组件。</p><p>用户ID:{{$route.params.id}}</p><p v-html="msg"></p></div>',
  data() {
  	return {
    	nameDB: {
      	1: '乌木喂喂威 恩耶吞温威 乌温穆补 欧萨斯',
        2: '布里秋秋 迪不利多'
      },
      msg: ''
    }
  },
  // 路由独享的导航守卫
  beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`,通过传回调给 next并把组件实例作为回调方法的参数来访问组件实例
    next(vm => {
      vm.getUserName(to.params.id)
      vm.msg += '<br/>路由进入前(beforeRouteEnter)触发'
    })
  },
  // 路由独享的导航守卫
  beforeRouteUpdate(to, from, next) {
  	// 在当前路由改变,但是该组件被复用时调用
  	this.getUserName(to.params.id)
  	this.msg += '<br/>路由更新前(beforeRouteUpdate)触发'
    next()
  },
  methods: {
  	getUserName(id) {
    	this.msg = this.nameDB[id] ? ('用户名:' + this.nameDB[id]) : '用户不存在!'
    }
  }
}

const router = new VueRouter({
  routes : [
    { path: '/user/:id', component: User },
    { path: '/', redirect: '/user/1'}
  ]
})

const app = new Vue({
  router,
  data() {
  	return {
    	userId: 1
    }
  },
  methods: {
    queryUser(id) {
    	this.$router.push(`/user/${id}`)
    }
  }
}).$mount('#app')