vue基础知识笔记之路由

132 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

随着越来越能看开一些事情,做个俗人的想法越来越强烈。

“没关系的,大家都会做错选择,会莫名其妙掉眼泪,走在路上会突然奔溃,但这并不影响我们去看看晚霞,再次爱上这个世界。”

就像现在参加的掘金活动,做技术的积累,不知道会给自己带来什么,那就不再想了,时间会给你答案。今天继续,讲讲路由的基础知识。

Vue Router

以下路由规划、配置在:router/index.js文件中

动态路由匹配

我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件。例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。那么,我们可以在 vue-router 的路由路径中使用“动态路径参数”(dynamic segment) 来达到这个效果,router/index.js:

    { path: '/user/:id', component: User }

通配符

{
    // 会匹配所有路径
    path: '*',
    component: () => import('../views/404.vue')
}

命名路由

通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候。你可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称。

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

要链接到一个命名路由,可以给 router-link 的 to 属性传一个对象:

<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>

调用 router.push() 时:

router.push({ name: 'user', params: { userId: 123 }})

路由守卫

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

router.beforeEach((to, from, next) => {

// ...

// to: Route: 即将要进入的目标 路由对象

// from: Route: 当前导航正要离开的路由

// next: Function: 一定要调用该方法来 resolve 这个钩子。

})

路由独享的守卫----可以路由配置上直接定义 beforeEnter 守卫:

{

    path: '/',

    name: '',

    // ...

    beforeEnter(to, from, next) {

        if (to.meta.auth) {

            if (···) {

                next()

            } else {

                next(···)

            }

        } else {

            next()
        }
    }
}

组件内守卫

可以在路由组件内直接定义以下路由导航守卫:

  • beforeRouteEnter

  • beforeRouteUpdate

  • beforeRouteLeave

路由组件缓存

利用keepalive做组件缓存,保留组件状态,提高执行效率

<keep-alive include="about"> //缓存about组件

    <router-view></router-view>

</keep-alive>

使用include或exclude时要给组件设置name;两个特别的生命周期:activated、deactivated

路由懒加载

路由组件的懒加载能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。

() => import("../views/Login.vue")

() => import(/* webpackChunkName: "group-about" */ "../views/Login.vue")//把组件按组分块