vue-router

1.定义路由表

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

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. 在 入口文件引入,并挂载

js 复制代码
    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 展示路由

js 复制代码
    <template>
        <div>App 展示</div>
        <router-view></router-view>
    </template>

2.页面中使用路由

1.页面中进行路由跳转

1. 普通跳转

js 复制代码
    <template>
        <div>首页页面</div>

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

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

2. 替换当前页面

js 复制代码
    <template>
        <div>首页页面</div>

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

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

3. 路由传参

1.params 传参

js 复制代码
    <template>
        <div>首页页面</div>

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

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

接收参数

js 复制代码
    <template>
        <div>登录页面</div>
    </template>

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

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

2.query 传参

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

js 复制代码
    <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.嵌套路由

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

js 复制代码
    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() 函数来实现懒加载。懒加载的语法如下:

javascript 复制代码
component: () => import('./components/ExampleComponent.vue')

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

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

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

5.路由守卫

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

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

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

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

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

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

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

相关推荐
定栓4 分钟前
Webpack迁到Vite第一节:模块系统迁移:require → import
运维·前端·webpack
小熊在忙fpga14 分钟前
N32G430芯片的flash表示
前端·javascript·html
Data analyse45619 分钟前
App埋点版本兼容的字段迁移校验
大数据·运维·服务器·前端·数据库·数据分析
NC 王炸25 分钟前
AI 做的便签,换个浏览器就没了?加一个导出按钮,把数据带走
javascript·ai编程·数据备份·localstorage·txt导出
todoitbo25 分钟前
本来只想给内网开个口子,Natapp 却多给了一道防护
前端·javascript·vue.js·内网穿透·网络防护·natapp
会灭火的程序员31 分钟前
SuperMap AgentX Server智能体接入WEB应用技术文档
前端·supermap·agentx·agentx server
CRMEB36 分钟前
商品 SKU 设计,从简单规格到多规格踩过什么
java·前端·数据库·开源
Chloe.Zz37 分钟前
一篇入门Agent
开发语言·前端·javascript
java1234_小锋1 小时前
【技术专题】HTML5 网页技术 - HTML5 表格标签
前端·html·html5
silvamux_1 小时前
4款新模型商务邮件翻译横评:0.98到0.46
android·java·javascript