前端

vue-router用法记录

2017-11-27  本文已影响130人  SunnySky_

Vue-Router简介

Vue-Router是Vue.js官方维护的路由插件,同时也是官方推荐的路由插件。它与Vue.js内核深度结合,让开发单页应用更加容易简便。

基本配置

<router-link> 对应的路由匹配成功,将自动设置 class 属性值 .router-link-active

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <!-- 使用 router-link 组件来导航. -->
    <!-- 通过传入 `to` 属性指定链接. -->
    <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
    <router-link to="/foo">Go to Foo</router-link>
    <router-link to="/bar">Go to Bar</router-link>
  </p>
  <!-- 路由出口 -->
  <!-- 路由匹配到的组件将渲染在这里 -->
  <router-view></router-view>
</div>
Vue.use(VueRouter)

//定义路由
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

//创建router实例
const router = new VueRouter({
  routes // (缩写)相当于 routes: routes
})

//挂载实例
const app = new Vue({
  router
}).$mount('#app')

动态路由配置

响应路由参数的变化

当使用路由参数时,例如从 /page1/123 导航到 /page1/321,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。

复用组件时,想对路由参数的变化作出响应的话,你可以简单地watch(监测变化) $route 对象。

watch: {
  '$route' (to, from) {
    // 对路由变化作出响应...
  }
}

或者使用 2.2 中引入的 beforeRouteUpdate 守卫:

beforeRouteUpdate (to, from, next) {
    // react to route changes...
    // don't forget to call next()
  }

嵌套路由

实际生活中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件。借助 vue-router,使用嵌套路由配置,就可以很简单地表达这种关系。

使用 children 配置

const router = new VueRouter({
  routes: [
    { path: '/user/:id', component: User,
      children: [
        {
          // 当 /user/:id/profile 匹配成功,
          // UserProfile 会被渲染在 User 的 <router-view> 中
          path: 'profile',
          component: UserProfile
        },
        {
          // 当 /user/:id/posts 匹配成功
          // UserPosts 会被渲染在 User 的 <router-view> 中
          path: 'posts',
          component: UserPosts
        }
      ]
    }
  ]
})

编程式导航

除了使用 <router-link> 创建a 标签来定义导航链接,我们还可以借助router 的实例方法,通过编写代码来实现。

// 字符串
router.push('home')

// 对象
router.push({ path: 'home' })

// 命名的路由-> /user/123
router.push({ name: 'user', params: { userId: 123 }})

// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})

注意:如果提供了 path,params 会被忽略

const userId = 123
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user

命名路由

有时候,通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候。命名路由可以通过$route.name来获取名称。

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

路由元信息

定义路由的时候可以配置meta 字段。可通过$route.meta访问。

{
   path: '/user/:userId',
   name: 'user',
   component: User,
   meta: {
     title: 'user'
   }
}

全局钩子和路由独享的钩子

正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。

记住参数或查询的改变并不会触发进入/离开的导航守卫。你可以通过观察 $route 对象来应对这些变化,或使用 beforeRouteUpdate 的组件内守卫。

上一篇 下一篇

猜你喜欢

热点阅读