Vue Router - 路由的使用、两种切换方式、两种传参方式、嵌套方式

news2025/7/19 2:38:36

目录

一、Vue Router

1.1、下载

1.2、基本使用

a)引入 vue-router.js(注意:要在 Vue.js 之后引入).

 b)创建好路由规则

c)注册到 Vue 实例中

d)展示路由组件

1.3、切换路由的两种方式

1.3.1、以标签的方式切换

1.3.2、以 js 方式切换

1.3.3、在 VueRouter 中多次切换同一个路由存在问题

a)解决方法一:每次切换路由前手动判断

1.4、两种传参方式

1.4.1、通过 querystring 传参

1.4.2、通过 restful 传参

1.5、嵌套路由的使用


一、Vue Router


1.1、下载

通过 Vue Router 可以将现有的 Vue 开发更灵活,使得一个页面中展示多个不同的组件.

下载地址如下:

https://unpkg.com/vue-router/dist/vue-router.js

1.2、基本使用

a)引入 vue-router.js(注意:要在 Vue.js 之后引入).

    <script src="../js/vue.js"></script>
    <!-- router 必须在 vue.js 之后引入 -->
    <script src="../js/vue-router.js"></script>

 b)创建好路由规则

        //1.创建路由对象
        const router = new VueRouter({
            //配置路由规则:
            //path: 代表路由路径('#/' 这个哈希路由后面要添加的路由)
            //component: 代表路由路径对应的组件
            //redirect: 代表路由重定向
            //path: "*" 表示匹配所有路由
            routes: [
                // { path: '/', component: login }, //配置默认路由(一打开页面就有登录功能),但是!规范不建议一个组件对应多个路由
                { path: '/', redirect: '/login' }, //因此可以通过 redirect 进行重定向
                { path: '/login', component: login },
                { path: '/reg', component: register },
                { path: '*', component: notFound } //在老的版本,这个规则必须放在最后一行,但是后续官方做了优化,放哪都可以,但是建议还是放在结尾
            ]
        });

这里定义的组件如下:

        const login = {
            template: `<div><h2>登录功能</h2></div>`,
        }

        const register = {
            template: `<div><h2>注册功能</h2></div>`,
        }

        const notFound = {
            template: `<div><h2>404 not found 页面飞到外太空了~</h2></div>`,
        }

 

c)注册到 Vue 实例中

        const app = new Vue({
            el: "#app",
            data: {
                msg: "Vue路由章节"
            },
            router //2.注册路由
        });

d)展示路由组件

router-view 标签用来渲染组件

    <div id="app">

        <!-- 3.展示路由组件 -->
        <router-view></router-view>

    </div>

1.3、切换路由的两种方式

1.3.1、以标签的方式切换

        <!-- 1.链接 -->
        <a href="#/login">登录</a>
        <a href="#/reg">登录</a>
        <hr>
        <!-- 2.标签  必须要有 to 属性, to="路由路径" -->
        <router-link to="/login">登录</router-link>
        <router-link to="/reg">注册</router-link>
        <hr>
        <!-- 3.标签 -->
        <router-link :to="{path: '/login'}">登录</router-link>
        <router-link :to="{path: '/reg'}">注册</router-link>
        <hr>
        <!-- 4.标签  根据路由对象 name 属性来切换路由 -->
        <!-- 推荐:路由随时可能会变,而命名不会变,因此可以起到解耦合的作用 -->
        <router-link :to="{name: 'Login'}">登录</router-link>
        <router-link :to="{name: 'Register'}">注册</router-link>

以下是路由规则和组件

        const login = {
            template: `<div><h1>登录功能</h1></div>`
        }

        const register = {
            template: `<div><h1>注册功能</h1></div>`
        }

        //创建路由对象
        const router = new VueRouter({
            routes: [
                //name 表示这个路由对象的唯一身份标识
                { path: '/login', component: login, name: "Login" },
                { path: '/reg', component: register, name: "Register" },
            ]
        });

1.3.2、以 js 方式切换

a)例如通过点击事件,触发路由切换

        <button @click="loginSuccess()">一键注册成功</button>
        <!-- 展示组件 -->
        <router-view></router-view>

b)注册组件和创建路由规则

        const login = {
            template: `<div><h1>登录</h1></div>`
        }
        const reg = {
            template: `<div><h1>注册</h1></div>`
        }
        const router = new VueRouter({
            routes: [
                { path: "/", redirect: "/reg" },
                { path: "/login", component: login, name: "Login" },
                { path: "/reg", component: reg, name: "Reg" },
            ]
        });

c)js 切换路由

        const app = new Vue({
            el: "#app",
            data: {
                msg: "js 切换路由"
            },
            methods: {
                loginSuccess() {
                    // this.$router.push("/login");//不推荐
                    // this.$router.push({ path: '/login' });//不推荐
                    this.$router.push({ name: "Login" });//推荐使用名称切换
                }
            },
            router
        });

1.3.3、在 VueRouter 中多次切换同一个路由存在问题

在 VueRouter 中多次切换相同路由出现错误,如下:

有两种解决办法,如下:

首先我们要知道:

  • this.$route 代表当前路由对象 route.
  • this.$router 代表路由管理器对象 VueRouter.
a)解决方法一:每次切换路由前手动判断
        const app = new Vue({
            el: "#app",
            data: {
                msg: "js 切换路由"
            },
            methods: {
                loginSuccess() {
                    //在 VueRouter 中多次切换相同路由出现错误解决办法:
                    //1.每次切换前手动判断一下(不推荐,太麻烦)
                     if (this.$route.name != "Login") {
                         this.$router.push({ name: "Login" });
                     }

                }
            },
            router
        });

b)解决方法二:官方配置

在创建路由规则对象之后加入如下配置

        //2.官方配置:解决 VueRouter 中同一路由多次切换报错问题
        const original = VueRouter.prototype.push;
        VueRouter.prototype.push = function push(location) {
            return original.call(this, location).catch(err => err)
        };

之后你就可以直接写切换路由的方法了.

                loginSuccess() {
                    this.$router.push({ name: "Login" });
                }

1.4、两种传参方式

1.4.1、通过 querystring 传参

例如 /login?name=cyk&password=1111

a)如下四种路由传参方式(推荐最后一种)

        <!-- query -->
        <a href="#/login?name=cyk&password=123">登录</a>
        <router-link to="/login?name=cyk&password=123">登录</router-link>
        <router-link :to="{path: '/login', query:{name:'cyk', password:1111}}">登录</router-link>
        <router-link :to="{name: 'Login', query:{name:'cyk',password:1111}}">登录</router-link>

b)在组件中获取参数,如下:

        const login = {
            template: `<div><h1>登录功能</h1></div>`,
            created() { //生命周期:已执行完 组件内部事件 和 生命周期函数注册,自身的 data、methods、computed 属性注入和校验
                //通过 querystring 获取参数 
                console.log(this.$route); //获取当前路由对象
                console.log(this.$route.query.name);
                console.log(this.$route.query.password);
            }
        }

c)路由对象如下:

        //创建路由对象
        const router = new VueRouter({
            routes: [
                //querystring 传参
                { path: '/login', component: login, name: "Login" }
            ]
        });

1.4.2、通过 restful 传参

例如 /login/cyk/1111

a)如下三种传参方式(推荐最后一种)

        <!-- restful -->
        <a href="#/register/6/lyj">注册</a>
        <router-link :to="{path: '/register/11/lyj'}">注册</router-link>
        <router-link :to="{name: 'Register', params:{id:11, name:'lyj'}}">注册</router-link>

b)在组件中获取参数,如下:

        const register = {
            template: `<div><h1>注册功能</h1></div>`,
            created() {
                //通过 restful 获取参数
                console.log(this.$route); //获取当前路由对象
                console.log(this.$route.params.id);
                console.log(this.$route.params.name);
            }
        }

c)路由对象如下:

        //创建路由对象
        const router = new VueRouter({
            routes: [
                //querystring 传参
                { path: '/login', component: login, name: "Login" },
                //restful 传参
                { path: '/register/:id/:name', component: register, name: "Register" },
            ]
        });

1.5、嵌套路由的使用

在创建 VueRouter 中,path 还有一个 children 参数,用来定义嵌套子组件路由.

例如需求:

1.现在有一个用户列表

2.当点击 “添加用户信息” 时,显示以下对话框

3.点击提交后,回归用户列表路由

实现如下:

a)如下定义组件

    <template id="users">
        <div>
            <h3>用户列表</h3>
            <router-link :to="{name:'adduser'}">添加用户信息</router-link>
            <table border="1">
                <tr>
                    <td>id</td>
                    <td>name</td>
                </tr>
                <tr>
                    <td>{{ users.id }}</td>
                    <td>{{ users.name }}</td>
                </tr>
            </table>
            <!-- 显示嵌套子组件 -->
            <router-view></router-view>
        </div>
    </template>

    <template id="add-user">
        <div>
            <div>
                <span>id: </span>
                <input type="text">
            </div>
            <div>
                <span>name: </span>
                <input type="text">
            </div>
            <button @click="submit()">提交</button>
        </div>
    </template>

    <script>

        //用户列表
        const users = {
            template: '#users',
            data() {
                return {
                    users: [] //这里不能写死,需要请求后端得到参数
                }
            },
            created() {
                //在组件构建完成后,请求后端得到 users 的所有数据,覆盖空数组
                this.users = { id: 1, name: 'cyk' }
            }
        }

        //添加用户
        const adduser = {
            template: '#add-user',
            methods: {
                submit() {
                    //向后端发送请求
                    //提交完成后切换路由
                    this.$router.push({ name: 'users' });
                }
            }
        }
    </script>

b)创建路由对象

        //创建路由对象
        const router = new VueRouter({
            routes: [
                {
                    path: '/users', component: users, name: 'users',
                    children: [  //嵌套子组件路由
                        //注意:嵌套路由中,子路由不能使用 / 开头
                        { path: 'adduser', name: 'adduser', component: adduser } //可以通过 /users/useradd 访问到此
                    ]
                },
            ]
        });

c)注册到 Vue 实例中

        const app = new Vue({
            el: "#app",
            component: {
                users,
                adduser
            },
            router
        });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1102783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java 进阶篇】JavaScript BOM(浏览器对象模型)详解

BOM&#xff0c;即浏览器对象模型&#xff08;Browser Object Model&#xff09;&#xff0c;是JavaScript与浏览器之间的接口&#xff0c;它允许JavaScript与浏览器进行交互&#xff0c;实现访问和控制浏览器窗口、文档和其他浏览器功能的功能。本文将详细介绍BOM的各个方面&a…

做web自动化测试遇到Chrome浏览器老是自动更新,怎么办 ? 这里提供两个解决办法 。

web自动化安装驱动安装 进行web自动化时 &#xff0c;需要提前安装浏览器的驱动 &#xff0c;尤其是chrome浏览器 。它的更新速度很快 &#xff0c;是不是更新了新版本 。这就导致我们的驱动也要跟着变化。 1.停止自动更新 那么 &#xff0c;如何关闭chrome浏览器的自动更新…

对称(镜像)二叉树

之前写的比较两棵树是否相等&#xff0c;是左子树和左子树比&#xff0c;右子树和右子树比——利用这个思想镜像二叉树就是从第二层的两个节点作为两棵树的根&#xff0c;然后比较&#xff0c;这里的比较是左子树和右子树比&#xff0c;右子树和左子树比 ——也就是利用比较两个…

CS鱼饵制作

文章目录 宏病毒&#xff08;宏钓鱼&#xff09;快捷方式钓鱼shellQMaker bug伪装pdf文件上线 宏病毒&#xff08;宏钓鱼&#xff09; 启动teamsever服务器&#xff0c;具体过程请参考我之前的文章&#xff1a; 在主机中启动CS客户端&#xff0c;111是真实机的用户&#xff1a…

电压参考芯片 LM285D-1.2 备忘

LM285D-1.2 是一款参考电压芯片&#xff0c;本次备忘使用的数据手册是安美森家的。 LM285D 中的 D 指的是 SOIC-8 封装&#xff0c;是贴片的; 而 LM285Z 中的 Z 指的是 TO-92 封装&#xff0c;是直插的。购买时需要注意&#xff0c;防止买错封装。 注&#xff1a;以下参数中&…

Vue之Vue的介绍安装开发实例生命周期钩子

博主心得&#xff1a; keyup必须与change一起使用v-on.click可以直接写成clickclick“setVal”里的setVal换成数字之后有惊喜VS Code是真的狗&#xff0c;一些报错根本不会直接显示总结&#xff1a;VS code太狗了 1.vue介绍 1.1 什么是vue vue是一个构建用户界面UI的渐进式jav…

LLM-RAG-WEB 大模型+文件+可视化界面

注意&#xff1a;这里只是简单实现了功能和界面&#xff0c;文件对话也暂时只支持一个文件&#xff0c;如果跳到模型对话再切换回文件对话会文件会删除重置会话&#xff0c;但模型对话切换回来时保留之前会话的。 1、代码&#xff08;使用步骤说明在链接里&#xff09; 参考下…

transformer_01

一、传统RNN存在的问题 1.序列前序太长&#xff0c;每个xi要记住前面的特征&#xff0c;而且一直在学&#xff0c;没有忘记&#xff0c;可能特征不能学的太好 2.串行&#xff0c;层越多越慢&#xff0c;难以堆叠很多层&#xff1b; 3.只能看到过去&#xff0c;不能看到未来 搞…

二维码智慧门牌管理系统:高效标准化处理地址数据

文章目录 前言一、标准化数据的重要性二、标准检查与自动化处理三、人工修复与高效性四、数据应用与效益 前言 随着科技的快速发展&#xff0c;数据管理在现代社会中扮演着越来越重要的角色。为了提升数据质量&#xff0c;标准化检查成为必不可少的环节。今天&#xff0c;我们…

Cobalt Strike

文章目录 Cobalt Strike1. Cobalt Strike 简介2. Cobalt Strike 和 MSF 的区别3. Cobalt Strike server4. Cobalt Strike client4.1 安装插件4.2 运行木马4.3 参数详情 5. Cobalt Strike 鱼饵制作5.1 宏5.2 Power shell5.3 快捷方式5.4 ShellQMaker 免杀5.5 伪装pdf文件 Cobalt…

基于龙格-库塔优化的BP神经网络(分类应用) - 附代码

基于龙格-库塔优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于龙格-库塔优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.龙格-库塔优化BP神经网络3.1 BP神经网络参数设置3.2 龙格-库塔算法应用 4.测试…

【JVM系列】- 类加载子系统与加载过程

类加载子系统与加载过程 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正…

【Linux】文件IO基础知识——上篇

目录 前文 一&#xff0c; 系统级——文件操作接口 a. open b. close c. write d. read 二&#xff0c;接口理解 那文件描述符——fd是什么呢&#xff1f; 三&#xff0c;文件描述符分配规则 原理 四&#xff0c;重定向——dup2 简易shell——重定向 五&#xff0c…

laravel中锁以及事务的简单使用

一、首先来说一下什么是共享锁&#xff1f;什么是排他锁&#xff1f; 共享&#xff1a;我可以读 写 加锁 , 别人可以 读 加锁。 排他&#xff1a;只有我 才 可以 读 写 加锁 , 也就是说&#xff0c;必须要等我提交事务&#xff0c;其他的才可以操作。 二、简单例子实现加锁 锁…

基于C8051F380的流水灯设计

一、C8051F380简介&#xff1a; C8051F380-GQ 是Silicon Labs的一款高度集成的汽车和工业微控制器 MCU。C8051F380的CPU内核为8051&#xff0c;内核规格: 8 位 , 速度: 48 MIPS &#xff1b; CPU最大主频&#xff1a;192MHz &#xff1b;工作电压范围&#xff1a;2.7V~5.25V &a…

用shell批量修改文件名

场景一 给这些文件都加上.png后缀 #!/bin/bash for i in *; do mv "$i" "$i.png"; done 场景二 给某些文件按某种规则重命名,如按照1,2,3,4…命名,保留原格式 注: Shell中实现整数自增的几种方法示例,此处用于声明是数字类型的declare -i必须添加,否则…

MyBatisPlue-03

一 映射匹配兼容机制 1.映射数据库的字段名 问题描述&#xff1a; 当数据库表字段和实体类的属性名称出现不匹配时&#xff1a; 解决&#xff1a; 知识点&#xff1a; 2.忽略实体类的部分字段 问题描述&#xff1a; 当要表示如 显示用户是否在线等消息&#xff0c;&#xf…

物联网AI MicroPython传感器学习 之 ADXL345 3轴加速度传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 ADXL345是一款完整的3轴加速度测量系统&#xff0c;可选择的测量范围有士2g&#xff0c;士4g&#xff0c;士8g或士16g。它既能测量运动或冲击导致的动态加速度&#xff0c;也能测量静止加速度&…

C++对象模型(13)-- 构造函数语义学:析构函数

1、默认析构函数生成规则 跟构造函数一样&#xff0c;编译器不一定会为类生成默认析构函数。生成默认析构函数的规则有下面2条&#xff1a; &#xff08;1&#xff09;包含一个类类型的成员变量&#xff0c;且成员变量所属的类有默认析构函数。 &#xff08;2&#xff09;其…