likes
comments
collection
share

vue-router

作者站长头像
站长
· 阅读数 31

1.定义路由表

1.在 src 下创建 router 目录,并在目录里创建 index.js 文件

    import { createRouter, createWebHashHistory } from "vue-router"
    const routes = [
        {
            // 路由地址
            path: "/",
            // 对应路由显示组件
            component: () => import("@/views/index.vue"),
        },
        {
            // 路由地址
            path: "/login",
            // 对应路由显示组件
            component: () => import("@/views/login.vue"),
        },
        {
            // 路由地址
            path: "/cart",
            // 对应路由显示组件
            component: () => import("@/views/cart.vue"),
        },
    ]
    // 使用 createRouter 创建路由实例
    const router = createRouter({
        // 确定路由模式,当前使用hash模式
        history: createWebHashHistory(),
        // 定义路由表
        routes
    });

    // 导出
    export default router;

2. 在 入口文件引入,并挂载

    import { createApp } from "vue";
    import App from "./App.vue";

    // 1. 导入路由实例
    import router from './router'

    const myApp = createApp(App);

    // 2. 挂载路由实例
    myApp.use(router)

    myApp.mount("#app");

3.在组件上使用 router-view 展示路由

    <template>
        <div>App 展示</div>
        <router-view></router-view>
    </template>

2.页面中使用路由

1.页面中进行路由跳转

1. 普通跳转

    <template>
        <div>首页页面</div>

        <button @click="goPage">点击跳转</button>
    </template>

    <script>
        export default {
            methods: {
                goPage() {
                    this.$router.push('/login')
                }
            }
        }
    </script>

2. 替换当前页面

    <template>
        <div>首页页面</div>

        <button @click="goPage">点击跳转</button>
    </template>

    <script>
        export default {
            methods: {
                goPage() {
                    // 从页面 a 到 页面 b 页面 不会在历史记录中新增数据
                    this.$router.replace('/login')
                }
            }
        }
    </script>

3. 路由传参

1.params 传参

    <template>
        <div>首页页面</div>

        <button @click="goPage">点击跳转</button>
    </template>

    <script>
        export default {
            methods: {
                goPage() {
                    this.$router.push('/login/10086/张三')
                }
            }
        }
    </script>

vue-router 接收参数

    <template>
        <div>登录页面</div>
    </template>

    <script>
    export default {
        mounted() {
            /* 
                $router 是路由提供给我们的 方法集合
                        内部包含多个跳转的方法
                $route   是路由提供给我们的 数据集合
                        内部包含一些路由的信息,比如说传递过来的参数        
            */

            console.log(this.$route.params)
        }
    }
    </script>

2.query 传参

参数使用 ? 进行拼接,参数之间用 & 隔开,不需要在路由表中定义

    <template>
        <div>首页页面</div>

        <button @click="goPage">点击跳转</button>
    </template>

    <script>
        export default {
            methods: {
                goPage() {
                    this.$router.push({
                        name:'login',
                        query:{
                            id: 10086,
                            name: '张三'
                        }
                    })
                }
            }
        }
    </script>
    
    
    // 接收参数
    this.$router.query 就是传递的参数

3.嵌套路由

点击顶栏导航按钮。页面跳转。导航栏保持不变。页面改变

    import { createRouter, createWebHashHistory } from "vue-router"
    const routes = [
        {
            path: "/",
            name: '/',
            component: () => import("@/views/index.vue"),
        },
        {
            path: "/login",
            name: 'login',
            component: () => import("@/views/login.vue"),
        },
        {
            path: "/cart",
            name: 'cart',
            component: () => import("@/views/cart.vue"),
        },
        {
            path: "/banner",
            name: 'banner',
            component: () => import("@/views/banner/index.vue"),
            children:[
                {
                    path: "addImg",
                    name: 'addImg',
                    component: () => import("@/views/banner/components/addImg.vue"),
                },
                {
                    path: "imgList",
                    name: 'imgList',
                    component: () => import("@/views/banner/components/imgList.vue"),
                }
            ]
        },
    ]
    const router = createRouter({
        history: createWebHashHistory(),
        routes
    });


    export default router;
    
    
    // 在 banner 展示对应的 子路由
    <template>
        <div>轮播图展示页</div>
        <router-link to="/banner/imgList">跳转到轮播图列表</router-link>
        <router-link to="/banner/addImg">跳转到轮播图添加</router-link>
        
        <router-view></router-view>
    </template>

4. vue-router 的懒加载

Vue-router 的懒加载是指在路由被访问时才加载相应的组件,而不是在应用初始化时就加载所有的组件。这样可以提高应用的性能,减少初始加载时间。

在 Vue-router 中,可以使用 import() 函数来实现懒加载。懒加载的语法如下:

component: () => import('./components/ExampleComponent.vue')

当路由被访问时,import() 函数会动态地加载相应的组件。这样可以将组件的代码分割成多个小块,只有在需要时才加载,而不是一次性加载所有的组件。

懒加载还可以通过 Webpack 的代码分割功能来实现。在 Webpack 的配置文件中,可以使用 import 函数的 webpackChunkName 注释来给生成的代码块命名,方便调试和管理。

总的来说,懒加载可以提高应用的性能,减少初始加载时间,提升用户体验。同时,懒加载也可以更好地管理和组织组件的代码,使项目结构更清晰。

5.路由守卫

beforeEach 是 Vue-router 中的一个导航守卫,用于在路由切换之前进行一些操作或者拦截导航。

在 Vue-router 中,可以通过 router.beforeEach 方法注册 beforeEach 导航守卫。它接收一个回调函数作为参数,这个回调函数会在每次路由切换之前被调用。

beforeEach 的回调函数接收三个参数:tofrom 和 next。其中,to 表示即将进入的路由对象,from 表示即将离开的路由对象,next 是一个函数,用于控制路由的行为。

在 beforeEach 回调函数中,可以进行一些操作,比如检查用户是否已登录、权限验证、页面访问记录等。根据这些操作的结果,可以选择调用 next 函数来继续路由的导航,或者中断导航。

如果在 beforeEach 中调用 next 函数并传入参数,可以控制路由的行为。常见的参数有:

  • next():继续路由导航,进入下一个钩子或者路由组件。
  • next(false):中断路由导航,停留在当前路由。
  • next('/path'):中断当前导航,重定向到指定的路径。

通过使用 beforeEach 导航守卫,可以在路由切换之前进行一些操作,实现权限控制、页面访问记录等功能,提升应用的用户体验和安全性。