路由实例的构造配置

路由实例的构造配置,指的是:构造配置 routes 中的每一个路由对象( 路由规则、路由记录 )。

var routerObj = new VueRouter({
  // 构造配置 
   routes:[
      // 路由规则 & 路由元信息
      {path:'/login',component:login},
      {path:'/register',component:register}			
   ],
  // 其他配置
});
  • 路由规则:routes 中的每个路由对象,被称为一个路由规则或路由记录;
  • 路由元信息:定义路由规则的时候,可以配置相应的 meta 字段,即路由元信息

routes,类型: Array<RouteConfig>,以下是 RouteConfig 类型( 即,路由规则 & 路由元信息)的定义:

{
  path: string,  // 路由匹配
  component: Component,  // 组件
  name: string,   // 命名路由
  components: { [name: string]: Component },   // 命名视图
  redirect: string | Location | Function,    // 重定向
  alias: string | Array<string>,    // 别名
  children: Array<RouteConfig>,   // 嵌套路由
  beforeEnter: (to: Route, from: Route, next: Function) => void,
  meta: any
}

路由重定向

对于不识别的URL地址,常常使用重定向功能,将页面定向到首页显示。

const router = new VueRouter({
  routes: [
    { path: '/a', redirect: '/b' }  // 从 /a 重定向 /b
  ]
})

// 代码示例

const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar },
  { path: '*', redirect: "/foo"},
]
// 重定向的目标也可以是一个命名的路由

const router = new VueRouter({
  routes: [
    { path: '/a', redirect: { name: 'foo' }}
  ]
})

// 甚至是一个方法,动态返回重定向目标
const router = new VueRouter({
  routes: [
    { path: '/a', redirect: to => {
      // 方法接收 目标路由 作为参数
      // return 重定向的 字符串路径/路径对象
    }}
  ]
})

默认子路由

如果要设置默认子路由,即点击 foo 时,自动触发 foo1,则需要进行如下修改:

将 router 配置对象中 children 属性的 path 属性设置为 '',并将对应的 router-link 的 to 属性设置为 '/foo'。

// 路由导航
<router-link to="/foo">to Foo1</router-link>
<router-link to="/foo/foo2">to Foo2</router-link>
<router-link to="/foo/foo3">to Foo3</router-link>
// 视图渲染
<router-view></router-view>
const router = new VueRouter({
  routes: [
    { 
        path: '/', 
        component: Home 
    },
    { 
        path: '/foo', 
        component: Foo,
        children:[
            {path:'',component:Foo1},
            {path:'foo2',component:Foo2},
            {path:'foo3',component:Foo3},
          ]
    }
  ]
})

路由别名

路由别名,可以让我们自由的将 UI 结构映射为任意的 URL,而不受限于配置的嵌套的路由结构

const router = new VueRouter({
  routes: [
    { path: '/login', component: login, alias: '/denglu' }
  ]
})
<router-link to="/denglu">登录</router-link>

嵌套路由

路由记录是可以嵌套的(children),因此,当一个路由匹配成功后,它可能匹配多个路由记录。

  • 在构造配置中,children 属性里的 path 属性只设置为当前路径,因为其会依据层级关系
  • 而,在 router-link 的 to 属性,则需要设置为完全路径

实际应用中,界面通常由多层嵌套的组件组合而成。而,URL 中各段动态路径,也按某种结构对应嵌套的各层组件。

/user/bar                    
+------------------+                  
| User             |                 
| +--------------+ |                 
| | Bar          | |    
| |              | |                
| +--------------+ |                 
+------------------+

vue-router 中,使用构造配置中的嵌套路由,可以很简单的表达这种关系:

// app.vue
<template>
  <div id="app">
    <div>HelloWorld!</div>
    <router-link to="/foo">Foo</router-link>
    <router-link to="/bar">Bar</router-link>
    <router-view></router-view>    // /foo或/bar路由的出口
  </div>
</template>
// router.js
export default new Router({
  routes: [
    {
      path: '/bar',    
      component: Bar,
      // 当/bar/user 匹配成功,User组件会被渲染在Bar组件的<router-view>中
      children:[    // 嵌套路由
          {
            path:'user',    // 不需要设置根路径
            component: User
          }
      ]
    },
    {
      // 动态路由匹配,以 : 开头
      path: '/foo',
      component: Foo
    }
  ]
})
// Bar.vue
<template>
  <div class="content">
    Bar组件内容
    <router-view></router-view>   // 嵌套路由/bar/user的出口
  </div>
</template>