vue-router

跳转路由

vue路由文件router.js

export default new Router({
    routes: [{
         name: 'survey',
         path: '/service/surveyService',
         component: 'surveySeriveTips'
    }]
})

在vue文件中使用路由:

this.$router.push({name: 'survey'})或this.$router.push('/service/surveyService')

第一种方式我们可以看到name是给路由命名,设置的name要唯一,表示路由的名称,使用name之后就会匹配path中的路由,渲染对应的组件,目的是方便使用,因为有的路由比较长。
第二种方式是直接匹配path中的路由,渲染对应的组件

通过路由传参

this.$router.push({name: 'survey', query: {add: 123}})或
this.$router.push({path: '/service/surveyService', query: {add: 123}})

以上使用name或path都可以。

动态路由

我们经常需要把某种模式匹配到的所有路由,全部映射到同个组件。例如,我们有一个user组件,对于所有id各不相同的用户,都要使用这个组件来渲染。那么我们可以在vue-router的路由路径中使用"动态路径参数"来达到这个效果:

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

现在呢,像vue模块中跳转路由this.router.push('user/bar')这两个路由都会被path: 'user/:id'这种模式匹配,然后都会使用user组件来渲染。在user组件可以用this.router.push('user/foo')匹配到的idName就是foo。这个动态路由可以用上述路由传参的方式来替换,两者效果一样。

响应路由参数的变化

提醒一下,当使用路由参数时,例如从/user/foo导航到/user/bar,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过这也意味着组件的生命周期钩子不会再被调用。
复用组件时,想对路由参数的变化作出响应的话,你可以简单地watch(监测变化)$route对象:

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

或使用beforeRouteUpdate导航守卫:

beforeRouteUpdate (to, from, next) {
     // 
}

捕获所有路由或404Not found路由

常规参数只会匹配被/分隔的URL片段中的字符。如果想匹配任意路径,我们可以使用通配符(*):

{
    // 会匹配所有路径
    path: '*'
}
{
   // 会匹配以'/user-'开头的任意路径
   path: 'user-*'
}

当使用通配符路由时,请确保路由的顺序是正确的,也就是说含有通配符的路由应该放在最后。路由{path: '*'}通常用于客户端404错误。如果你使用了History模式,请确保正确配置你的服务器。
当使用一个通配符时,$rote.params内会自动添加一个名为pathMath参数。它包含了URL通过通配符被匹配的部分:
vue.js:

(1)
this.$router.push('/non-existing')
// 没有找到对应的组件就会被通配符匹配到
(2)
this.$router.push('user-admin')
// 只要是user-的路由都会被匹配到

route.js:

(1)
{
    path: '*',
    component: 'default/404.vue'
}
(2)
    path: 'user-*',
    component: 'ck/user.vue'
}

注意:首先通配符需要放在最后,用来匹配上面没有匹配到的路由,不管是动态路由还是通配符都是vue中写具体路由,route.js中写匹配路由。

匹配优先级

有时候,同一个路径可以匹配多个路由,此时,匹配的优先级就按照路由的定义顺序:谁先定义的,谁的优先级高。

嵌套路由

实际生活中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL中各段动态路径也按某种结构对应嵌套的各层组件。
是最顶层的出口,渲染最高级路由匹配到的组件。同样地,一个被渲染组件同样可以包含自己的嵌套,一般用于多级菜单。例如,在user组件的模版添加一个

const user = {
     template: `
          

user {{$route.params.id}}

` }

要在嵌套的出口中渲染组件,需要在VueRouter的参数中使用chuildren配置:

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

要注意,以/开头的嵌套路径会被当作根路径。这让你充分的使用嵌套组件而无须设置嵌套的路径。
你会发现,children配置就是像routes配置路由一样配置成数组,所以呢你可以嵌套多层路由。此时,基于上面的配置,当你访问/user/foo时,user的出口(内嵌的)是不会渲染任何东西,这是因为没有匹配到合适的子路由。如果你想渲染点什么,可以提供一个空的子路由:

const router = new VueRouter({
  routes: [
    {
      path: '/user/:id', component: User,
      children: [
        // 当 /user/:id 匹配成功,
        // UserHome 会被渲染在 User 的  中
        { path: '', component: UserHome },

        // ...其他子路由
         { path: 'access', component: UserAccess },
      ]
    }
  ]
})

编程式的导航

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

router.push(location, onComplete?, onAbort?)

注意:在Vue实例内部,你可以通过router.push。
想要导航到不同的URL,则使用router.push方法。这个方法会向history栈添加一个新的记录,所以当用户点击浏览器后退按钮时,则回到之前的URL。
当你点击时,这个方法会在内部调用,所以说点击等同于调用router.push(...)。

// 声明式

// 编程式
router.push(...)

该方法的参数可以式一个字符串路径或者一个描述地址的对象。例如:

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

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

如果要给路由添加参数可以在对象中添加params或query,这两个属性都是router实例提供的。但是它们也是有区别的:

// 使用name
router.push({ name: 'user', params: { userId: '123' }})   // localhost:3000/#/user
router.push({ name: 'user', query: { userId: '123' }})   // localhost:3000/#/user?userId=123
// 使用path
router.push({ path: 'user', params: { userId: '123' }})   // localhost:3000/#/user
router.push({ path: 'user', query: { userId: '123' }})   // localhost:3000/#/user?userId=123

上述代码我们可以看出使用params属性跳转路由之后,url上不显示添加的参数,使用query才会显示添加的参数,如果使用path那么params属性会被忽略,并且this.$route.params获取不到信息,query不受影响。同样的规则也适用于router-link组件的to属性。

router.replace()

跟router.push很像,唯一的不同就是,它不会向history添加新纪录,而是跟它的方法名一样---替换掉当前history记录。

// 声明式

// 编程式
router.replace(...)
router.go(n)

这个方法的参数是一个整数,意思是在history记录中向前或者后退多少步,类似window.history.go(n)。

操作history

你也许注意到
router.pushrouter.replacerouter.gowindow.history.pushStatewindow.history.replaceStatewindow.history.go好像, 实际上它们确实是效仿 window.history API 的。
还有值得提及的,Vue Router 的导航方法 (push、 replace、 go) 在各类路由模式 (history、 hash 和 abstract) 下表现一致。

你可能感兴趣的:(vue-router)