Vue路由详解

article/2025/10/3 1:02:02

目标

1.能够说出什么是路由
2.能够说出前端路由的实现原理
3.能够使用Vue-Router实现前端路由
4.能够实现嵌套路由,动态路由
5.能够实现命名路由以及编程式导航
6.理解并实现后台管理案例

1.路由的概念

路由的本质就是一种对应关系,比如说我们在url地址中输入我们要访问的url地址之后,浏览器要去请求这个url地址对应的资源。
那么url地址和真实的资源之间就有一种对应的关系,就是路由。

路由分为前端路由和后端路由
1).后端路由是由服务器端进行实现,并完成资源的分发
2).前端路由是依靠hash值(锚链接)的变化进行实现

后端路由性能相对前端路由来说较低,所以,我们接下来主要学习的是前端路由
前端路由的基本概念:根据不同的事件来显示不同的页面内容,即事件与事件处理函数之间的对应关系
前端路由主要做的事情就是监听事件并分发执行事件处理函数

2.前端路由的初体验

前端路由是基于hash值的变化进行实现的(比如点击页面中的菜单或者按钮改变URL的hash值,根据hash值的变化来控制组件的切换)
核心实现依靠一个事件,即监听hash值变化的事件

window.onhashchange = function(){//location.hash可以获取到最新的hash值location.hash
}

前端路由实现tab栏切换:

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-UA-Compatible" content="ie=edge" /><title>Document</title><!-- 导入 vue 文件 --><script src="./lib/vue_2.5.22.js"></script></head><body><!-- 被 vue 实例控制的 div 区域 --><div id="app"><!-- 切换组件的超链接 --><a href="#/zhuye">主页</a> <a href="#/keji">科技</a> <a href="#/caijing">财经</a><a href="#/yule">娱乐</a><!-- 根据 :is 属性指定的组件名称,把对应的组件渲染到 component 标签所在的位置 --><!-- 可以把 component 标签当做是【组件的占位符】 --><component :is="comName"></component></div><script>// #region 定义需要被切换的 4 个组件// 主页组件const zhuye = {template: '<h1>主页信息</h1>'}// 科技组件const keji = {template: '<h1>科技信息</h1>'}// 财经组件const caijing = {template: '<h1>财经信息</h1>'}// 娱乐组件const yule = {template: '<h1>娱乐信息</h1>'}// #endregion// #region vue 实例对象const vm = new Vue({el: '#app',data: {comName: 'zhuye'},// 注册私有组件components: {zhuye,keji,caijing,yule}})// #endregion// 监听 window 的 onhashchange 事件,根据获取到的最新的 hash 值,切换要显示的组件的名称window.onhashchange = function() {// 通过 location.hash 获取到最新的 hash 值console.log(location.hash);switch(location.hash.slice(1)){case '/zhuye':vm.comName = 'zhuye'breakcase '/keji':vm.comName = 'keji'breakcase '/caijing':vm.comName = 'caijing'breakcase '/yule':vm.comName = 'yule'break}}</script></body></html>

案例效果图:

在这里插入图片描述

点击每个超链接之后,会进行相应的内容切换,如下:

在这里插入图片描述

核心思路:
在页面中有一个vue实例对象,vue实例对象中有四个组件,分别是tab栏切换需要显示的组件内容
在页面中有四个超链接,如下:

<a href="#/zhuye">主页</a> 
<a href="#/keji">科技</a> 
<a href="#/caijing">财经</a>
<a href="#/yule">娱乐</a>

当我们点击这些超链接的时候,就会改变url地址中的hash值,当hash值被改变时,就会触发onhashchange事件
在触发onhashchange事件的时候,我们根据hash值来让不同的组件进行显示:

window.onhashchange = function() {// 通过 location.hash 获取到最新的 hash 值console.log(location.hash);switch(location.hash.slice(1)){case '/zhuye'://通过更改数据comName来指定显示的组件//因为 <component :is="comName"></component> ,组件已经绑定了comNamevm.comName = 'zhuye'breakcase '/keji':vm.comName = 'keji'breakcase '/caijing':vm.comName = 'caijing'breakcase '/yule':vm.comName = 'yule'break}
}

3.Vue Router简介

它是一个Vue.js官方提供的路由管理器。是一个功能更加强大的前端路由器,推荐使用。
Vue Router和Vue.js非常契合,可以一起方便的实现SPA(single page web application,单页应用程序)应用程序的开发。
Vue Router依赖于Vue,所以需要先引入Vue,再引入Vue Router

Vue Router的特性:
支持H5历史模式或者hash模式
支持嵌套路由
支持路由参数
支持编程式路由
支持命名路由
支持路由导航守卫
支持路由过渡动画特效
支持路由懒加载
支持路由滚动行为

4.Vue Router的使用步骤(★★★)

A.导入js文件

<script src="lib/vue_2.5.22.js"></script>
<script src="lib/vue-router_3.0.2.js"></script>

B.添加路由链接:是路由中提供的标签,默认会被渲染为a标签,to属性默认被渲染为href属性,
to属性的值会被渲染为#开头的hash地址

<router-link to="/user">User</router-link>
<router-link to="/login">Login</router-link>

C.添加路由填充位(路由占位符)

<router-view></router-view>

D.定义路由组件

var User = { template:"<div>This is User</div>" }
var Login = { template:"<div>This is Login</div>" }

E.配置路由规则并创建路由实例

var myRouter = new VueRouter({//routes是路由规则数组routes:[//每一个路由规则都是一个对象,对象中至少包含path和component两个属性//path表示  路由匹配的hash地址,component表示路由规则对应要展示的组件对象{path:"/user",component:User},{path:"/login",component:Login}]
})

F.将路由挂载到Vue实例中

new Vue({el:"#app",//通过router属性挂载路由对象router:myRouter
})

小结:
Vue Router的使用步骤还是比较清晰的,按照步骤一步一步就能完成路由操作
A.导入js文件
B.添加路由链接
C.添加路由占位符(最后路由展示的组件就会在占位符的位置显示)
D.定义路由组件
E.配置路由规则并创建路由实例
F.将路由挂载到Vue实例中

补充:
路由重定向:可以通过路由重定向为页面设置默认展示的组件
在路由规则中添加一条路由规则即可,如下:

var myRouter = new VueRouter({//routes是路由规则数组routes: [//path设置为/表示页面最初始的地址 / ,redirect表示要被重定向的新地址,设置为一个路由即可{ path:"/",redirect:"/user"},{ path: "/user", component: User },{ path: "/login", component: Login }]
})

5.嵌套路由,动态路由的实现方式

A.嵌套路由的概念(★★★)

当我们进行路由的时候显示的组件中还有新的子级路由链接以及内容。

嵌套路由最关键的代码在于理解子级路由的概念:
比如我们有一个/login的路由
那么/login下面还可以添加子级路由,如:
/login/account
/login/phone

参考代码如下:

var User = { template: "<div>This is User</div>" }
//Login组件中的模板代码里面包含了子级路由链接以及子级路由的占位符var Login = { template: `<div><h1>This is Login</h1><hr><router-link to="/login/account">账号密码登录</router-link><router-link to="/login/phone">扫码登录</router-link><!-- 子路由组件将会在router-view中显示 --><router-view></router-view></div>` }//定义两个子级路由组件var account = { template:"<div>账号:<input><br>密码:<input></div>"};var phone = { template:"<h1>扫我二维码</h1>"};var myRouter = new VueRouter({//routes是路由规则数组routes: [{ path:"/",redirect:"/user"},{ path: "/user", component: User },{ path: "/login", component: Login,//通过children属性为/login添加子路由规则children:[{ path: "/login/account", component: account },{ path: "/login/phone", component: phone },]}]})var vm = new Vue({el: '#app',data: {},methods: {},router:myRouter});

页面效果大致如下:

在这里插入图片描述

B.动态路由匹配(★★★)

var User = { template:"<div>用户:{{$route.params.id}}</div>"}var myRouter = new VueRouter({//routes是路由规则数组routes: [//通过/:参数名  的形式传递参数 { path: "/user/:id", component: User },]
})

补充:
如果使用$route.params.id来获取路径传参的数据不够灵活。
1.我们可以通过props来接收参数

var User = { props:["id"],template:"<div>用户:{{id}}</div>"}var myRouter = new VueRouter({//routes是路由规则数组routes: [//通过/:参数名  的形式传递参数 //如果props设置为true,route.params将会被设置为组件属性{ path: "/user/:id", component: User,props:true },]
})

2.还有一种情况,我们可以将props设置为对象,那么就直接将对象的数据传递给
组件进行使用

var User = { props:["username","pwd"],template:"<div>用户:{{username}}---{{pwd}}</div>"}var myRouter = new VueRouter({//routes是路由规则数组routes: [//通过/:参数名  的形式传递参数 //如果props设置为对象,则传递的是对象中的数据给组件{ path: "/user/:id", component: User,props:{username:"jack",pwd:123} },]
})

3.如果想要获取传递的参数值还想要获取传递的对象数据,那么props应该设置为
函数形式。

var User = { props:["username","pwd","id"],template:"<div>用户:{{id}} -> {{username}}---{{pwd}}</div>"}var myRouter = new VueRouter({//routes是路由规则数组routes: [//通过/:参数名  的形式传递参数 //如果props设置为函数,则通过函数的第一个参数获取路由对象//并可以通过路由对象的params属性获取传递的参数//{ path: "/user/:id", component: User,props:(route)=>{return {username:"jack",pwd:123,id:route.params.id}} },]
})

7.命名路由以及编程式导航

A.命名路由:给路由取别名

案例:

var myRouter = new VueRouter({//routes是路由规则数组routes: [//通过name属性为路由添加一个别名{ path: "/user/:id", component: User, name:"user"},]
})//添加了别名之后,可以使用别名进行跳转
<router-link to="/user">User</router-link>
<router-link :to="{ name:'user' , params: {id:123} }">User</router-link>//还可以编程式导航
myRouter.push( { name:'user' , params: {id:123} } )

B.编程式导航(★★★)

页面导航的两种方式:
A.声明式导航:通过点击链接的方式实现的导航
B.编程式导航:调用js的api方法实现导航

Vue-Router中常见的导航方式:

this.$router.push("hash地址");
this.$router.push("/login");
this.$router.push({ name:'user' , params: {id:123} });
this.$router.push({ path:"/login" });
this.$router.push({ path:"/login",query:{username:"jack"} });this.$router.go( n );//n为数字,参考history.go
this.$router.go( -1 );

8.实现后台管理案例(★★★)

案例效果:

在这里插入图片描述

点击左侧的"用户管理",“权限管理”,“商品管理”,“订单管理”,"系统设置"都会出现对应的组件并展示内容

其中"用户管理"组件展示的效果如上图所示,在用户管理区域中的详情链接也是可以点击的,点击之后将会显示用户详情信息。

案例思路:
1).先将素材文件夹中的11.基于vue-router的案例.html复制到我们自己的文件夹中。
看一下这个文件中的代码编写了一些什么内容,
这个页面已经把后台管理页面的基本布局实现了
2).在页面中引入vue,vue-router
3).创建Vue实例对象,准备开始编写代码实现功能
4).希望是通过组件的形式展示页面的主体内容,而不是写死页面结构,所以我们可以定义一个根组件:

//只需要把原本页面中的html代码设置为组件中的模板内容即可
const app = {template:`<div><!-- 头部区域 --><header class="header">传智后台管理系统</header><!-- 中间主体区域 --><div class="main"><!-- 左侧菜单栏 --><div class="content left"><ul><li>用户管理</li><li>权限管理</li><li>商品管理</li><li>订单管理</li><li>系统设置</li></ul></div><!-- 右侧内容区域 --><div class="content right"><div class="main-content">添加用户表单</div></div></div><!-- 尾部区域 --><footer class="footer">版权信息</footer></div>`}

5).当我们访问页面的时候,默认需要展示刚刚创建的app根组件,我们可以
创建一个路由对象来完成这个事情,然后将路由挂载到Vue实例对象中即可

const myRouter = new VueRouter({routes:[{path:"/",component:app}]
})const vm = new Vue({el:"#app",data:{},methods:{},router:myRouter
})

补充:到此为止,基本的js代码都处理完毕了,我们还需要设置一个路由占位符

<body><div id="app"><router-view></router-view></div>
</body>

6).此时我们打开页面应该就可以得到一个VueRouter路由出来的根组件了
我们需要在这个根组件中继续路由实现其他的功能子组件
先让我们更改根组件中的模板:更改左侧li为子级路由链接,并在右侧内容区域添加子级组件占位符

const app = {template:`<div>........<div class="main"><!-- 左侧菜单栏 --><div class="content left"><ul><!-- 注意:我们把所有li都修改为了路由链接 --><li><router-link to="/users">用户管理</router-link></li><li><router-link to="/accesses">权限管理</router-link></li><li><router-link to="/goods">商品管理</router-link></li><li><router-link to="/orders">订单管理</router-link></li><li><router-link to="/systems">系统设置</router-link></li></ul></div><!-- 右侧内容区域 --><div class="content right"><div class="main-content"><!-- 在 --><router-view></router-view> </div></div></div>.......</div>`}

然后,我们要为子级路由创建并设置需要显示的子级组件

//建议创建的组件首字母大写,和其他内容区分
const Users = {template:`<div><h3>用户管理</h3>
</div>`}
const Access = {template:`<div><h3>权限管理</h3>
</div>`}
const Goods = {template:`<div><h3>商品管理</h3>
</div>`}
const Orders = {template:`<div><h3>订单管理</h3>
</div>`}
const Systems = {template:`<div><h3>系统管理</h3>
</div>`}//添加子组件的路由规则
const myRouter = new VueRouter({routes:[{path:"/",component:app , children:[{ path:"/users",component:Users },{ path:"/accesses",component:Access },{ path:"/goods",component:Goods },{ path:"/orders",component:Orders },{ path:"/systems",component:Systems },]}]
})const vm = new Vue({el:"#app",data:{},methods:{},router:myRouter
})

7).展示用户信息列表:
A.为Users组件添加私有数据,并在模板中循环展示私有数据

    const Users = {data(){return {userList:[{id:1,name:"zs",age:18},{id:2,name:"ls",age:19},{id:3,name:"wang",age:20},{id:4,name:"jack",age:21},]}},template:`<div><h3>用户管理</h3><table><thead><tr><th>编号</th><th>姓名</th><th>年龄</th><th>操作</th></tr></thead><tbody><tr :key="item.id" v-for="item in userList"><td>{{item.id}}</td><td>{{item.name}}</td><td>{{item.age}}</td><td><a href="javascript:;">详情</a></td></tr></tbody></table></div>`}

8.当用户列表展示完毕之后,我们可以点击列表中的详情来显示用户详情信息,首先我们需要创建一个组件,用来展示详情信息

const UserInfo = {props:["id"],template:`<div><h5>用户详情</h5><p>查看 {{id}} 号用户信息</p><button @click="goBack">返回用户详情页</button></div> `,methods:{goBack(){//当用户点击按钮,后退一页this.$router.go(-1);}}}

然后我们需要设置这个组件的路由规则

const myRouter = new VueRouter({routes:[{path:"/",component:app , children:[{ path:"/users",component:Users },//添加一个/userinfo的路由规则{ path:"/userinfo/:id",component:UserInfo,props:true},{ path:"/accesses",component:Access },{ path:"/goods",component:Goods },{ path:"/orders",component:Orders },{ path:"/systems",component:Systems },]}]
})const vm = new Vue({el:"#app",data:{},methods:{},router:myRouter
})

再接着给用户列表中的详情a连接添加事件

const Users = {data(){return {userList:[{id:1,name:"zs",age:18},{id:2,name:"ls",age:19},{id:3,name:"wang",age:20},{id:4,name:"jack",age:21},]}},template:`<div><h3>用户管理</h3><table><thead><tr><th>编号</th><th>姓名</th><th>年龄</th><th>操作</th></tr></thead><tbody><tr :key="item.id" v-for="item in userList"><td>{{item.id}}</td><td>{{item.name}}</td><td>{{item.age}}</td><td><a href="javascript:;" @click="goDetail(item.id)">详情</a></td></tr></tbody></table></div>`,methods:{goDetail(id){this.$router.push("/userinfo/"+id);}}
}

http://chatgpt.dhexx.cn/article/8WmTxv4p.shtml

相关文章

路由协议是什么?路由协议在网络中有哪些作用

目录 前言 干货来啦~ 说点想说的 前言 "薄荷&#xff0c;我今天在做一个实验&#xff0c;感觉好复杂啊&#xff01;而且这里面好多路由协议&#xff0c;我都不知道我的实验对不对呢&#xff01;"小曼又可怜巴巴地找到我 “你做的是什么实验啊&#xff01;” “…

【路由】静态路由

静态路由 1、静态路由的概念1.1、概念1.2、注意事项1.3、弊端 2、静态路由的配置须知2.1、出接口为BMA类型2.2、出接口为P2P类型2.3、出接口为NBMA类型 3、默认路由3.1、概念3.2、实验场景3.3、适用场景3.4、注意事项 4、浮动静态路由4.1、静态路由负载均衡的实验场景4.2、静态…

什么是前端路由?

什么是路由&#xff1f; 路由这个概念最先是后端出现的。在以前用模板引擎开发页面时&#xff0c;经常会 看到这样&#xff1a; http://hometown.xxx.edu.cn/bbs/forum.php 有时还会有带.asp或.html的路径&#xff0c;这就是所谓的SSR(Server Side Render)&#xff0c; 通…

路由是什么

中秋节公司放假3天&#xff0c;第一天去公司加班&#xff0c;第二天宅了一天&#xff0c;今天第三天&#xff0c;也是中秋节&#xff0c;还是继续宅着… 言归正传&#xff0c;本文站在初学者的角度&#xff0c;尽量通俗的讲解什么是路由&#xff0c;它有什么作用。 如下网络拓…

什么是路由策略?路由策略和策略路由有什么区别? 如何配置路由策略?

对于IP网络工程师来说&#xff0c;路由策略的部署随处可见&#xff0c;无论在运营商IP网络还是在企业网中&#xff0c;路由策略的应用都是非常普遍的。同时&#xff0c;在网络规划中&#xff0c;路由策略的规划也是一个核心的内容。为了方便大家更好的掌握和应用路由策略&#…

什么是路由选择?

路由选择包括两类&#xff1a;①静态路由选择 ②动态路由选择 # 因特网所采用的路由选择协议的主要特点 自适应&#xff1a;动态路由选择&#xff0c;能较好地适应网络状态的变化。 分布式&#xff1a;因特网中的各路由器通过相互间的信息交互&#xff0c;共同完成路由信息的…

路由的基本概念

一、什么是路由 1、路由器的作用&#xff1a;网络中的路由器负责为数据包选择转发路径。 2、路由表&#xff1a;每个路由器中有一个路由表&#xff0c;路由表则是若干条路由信息的一个集合。 3、路由条目的各个字段进行解释&#xff1a; ①Destination/Mask :表示目标IP地…

什么是路由?

介绍 路由是指路由器从一个接口上收到数据包&#xff0c;根据数据包的目的地址进行定向并转发到另一个接口的过程。路由发生在OSI网络参考模型中的第三层即网络层。 路由引导分组转送&#xff0c;经过一些中间的节点后&#xff0c;到它们最后的目的地。作成硬件的话&#xff…

什么是路由

认识前端路由 路由其实是网络工程中的一个术语&#xff1a; 在架构一个网络时&#xff0c;非常重要的两个设备就是路由器和交换机。 当然&#xff0c;目前在我们生活中路由器也是越来越被大家所熟知&#xff0c;因为我们生活中都会用到路由器&#xff1a; 事实上&#xff0c;…

路由表介绍

路由表简介 本次采用的是华为数通产品查看路由表的命令是 display ip routing-table 本次采用的是华为数通产品 查看路由表的命令是 display ip routing-table 路由表由以下几项信息元素组成&#xff1a; 1.Destination/Mask 目的网络地址/掩码长度&#xff1b; 2. Proto 协议…

怎么看路由表

电脑上很多网络适配器 路由表决定了怎么跳 当前的路由&#xff1a; destination 目的网段 mask 子网掩码 interface 到达该目的地的本路由器的出口ip gateway 下一跳路由器入口的ip&#xff0c;路由器通过interface和gateway定义一调到下一个路由器的链路&#xff0c;通常情况下…

Linux 查看路由表

文章目录 路由表简介Linux系统查看路由表方法方法1&#xff1a;通过netstat命令方法2&#xff1a;通过route命令方法3&#xff1a;通过ip route命令 route添加/删除默认路由网关Linux多网卡多路由设置 原文地址&#xff1a;https://m.yisu.com/zixun/677706.html 这篇文章将为…

路由表的由来

路由表的实现方法有三种&#xff1a; 1 直连路由 2 静态路由 3 动态路由 直连路由 开启了路由器借口之后&#xff0c;路由表自动感知而来 当路由器吧两个接口的ip地址配置好并开启&#xff0c;就能从其路由表内看到这两个直连子网已经被记录。 静态路由 由管理员手工配置…

路由表的建立和形成

以下内容可翻阅第六版谢希仁版的《计算机网路》和《路由与交换技术》书查看具体协议信息 首先路由表有以下几项形成 •网络号 •下一跳地址 •接口 •Metric&#xff1a;跳数、延迟、费用 例如&#xff1a; 路由表项 †特定主机路由 „前缀长度为32比特的路由表项。 †…

Linux下的路由表详解

linux 路由表 的一些相关资料 linux 路由表维护 查看 Linux 内核路由表 使用下面的 route 命令可以查看 Linux 内核路由表。 # route Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.255.0 U …

【网络】路由器配置路由表

起序&#xff1a;路由器选择路径的时候&#xff0c;不是根据 MAC 地址 选择路径&#xff0c;而是根据 目标 IP 地址 选择&#xff0c;因为路由器是连接不同网段的&#xff0c;路由器是对不同网段之间进行转发。 一、概述 先说一下 路由&#xff0c;它和 路由器 的意思容易让人…

如何看路由表!

教你如何读懂路由表, 你能读懂路由表吗?不懂?进来看看吧! 当前的路由: destination 目的网段 mask 子网掩码 interface 到达该目的地的本路由器的出口ip gateway 下一跳路由器入口的ip,路由器通过interface和gateway定义一调到下一个路由器的链路,通常情况下,interface和…

路由表的原理和作用

路由器是一种典型的网络层设备。它在两个局域网之间按帧传输数据&#xff0c;在OSI&#xff0f;RM之中被称之为中介系统&#xff0c;完成网络层责在两个局域网的网络层间按帧传输数据&#xff0c;转发帧时需要改变帧中的地址。它在OSI&#xff0f;RM中的位置如图1所示。 一、原…

路由表的作用

何谓路由 确定设备如何在不同网络之间相互传输的过程&#xff0c;也即通过互联的网络把信息从源地址传输到目的地址的活动被称之为路由。通常用于执行路由活动的设备被称为路由器。通过使用路由表&#xff0c;路由器则规划网络包到各自目的地的线路。路由的功能不仅仅是诸如路…

路由表中的信息

在“查表判断转发目标”这一点上&#xff0c;路由器和交换机的大体思路是类似的&#xff0c;不过具体的工作过程有所不同。交换机是通过MAC头部中的接收方MAC地址来判断转发目标的&#xff0c;而路由器则是根据IP头部中的IP地址来判断的。由于使用的地址不同&#xff0c;记录转…