SpringBootVue(十二)前端路由VueRouter
1.VueRouter基本概念
Vue-Router是 Vue.js官方的路由插件,让用 Vue.js 构建单页应用变得轻而易举。功能包括: 嵌套路由映射动态路由选择模块化、基于组件的路由配置路由参数、查询、通配符展示由 Vue.js 的过渡系统提供的过渡效果细致的导航控制自动激活 CSS 类的链接HTML5 history 模式或 hash 模式可定制的滚动行为URL 的正确编码
Vue比较适合单页面的项目,所有的网页的内容都是通过一个Html页面进行切换。在这个Html页面中通过不同的路由来控制不同组件的显示,这个控制就需要Vue-Router来完成。
Vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射(对应联系)起来,访问不同的路径就显示不同的组件。
典型单页面运用
所有内容都在一个Html页面显示,每个标题都是一个组件,点击后在不同组件中进行内容切换,显示不同内容。
Vue-Router目前有两个版本。3.X版本 和 4.X 版本Vue-Router3.X 版本只能结合Vue2使用;Vue-Router4.X 版本只能结合Vue3使用;
Vue-Router的安装
Vue-Router3.X 版本 : npm install vue-router@3
Vue-Router4.X 版本 : npm install vue-router@4
官方文档: https://router.vuejs.org/zh/
如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能:import Vue from "vue"import VueRouter from "vue-router" Vue.use(VueRouter)
2.实例演示:创建一个新的项目(本例使用Vue2),具体安装过程见前面笔记(九)
将刚刚创建的项目 vuerouter-demo 拖入 Visual Studio Code 中。目前项目中还没有 Vue-Router 需要进行安装。
注意:本例由于使用的是 Vue2,所以要安装vue-router3
在Visual Studio Code 中终端中输入如下命令:npm install vue-router@3
安装完成后在 package.json 中及可以看到 vue-router3
创建路由组件:
下面模拟网易音乐的界面,在项目components文件夹中自定义Discover.vue、Friends.vue、My.vue三个组件,并用Vue-Router来控制它们像是与切换。
Discover.vue: 发现音乐
Friends.vue 关注
My.vue 我的音乐
三个组件都需要链接对应关系,这就需要用Vue-Router来描述。 声明路由链接和站位标签
可以使用标签来声明路由链接,并使用标签来声明路由站位符。
我们在根组件 App.vue 中进行路由的跳转,代码如下: 发现音乐 关注 我的音乐
这时App组件上就有三个按钮,有兴趣可以用CSS进行样式美化。这个时候可以点击但是还无法跳转。因为定义的链接和三个组件的对应关系还没有设置。应为对应关系比较复杂,可以放到单独的 js 文件中写。创建路由模块
在项目 src 中创建一个 router 文件夹,在里面新建一个名为 index.js 路由模块,在里面定义对应关系,代码如下://导入Vue和VueRouter import VueRouter from "vue-router"; import Vue from "vue"; //导入组件 import Discover from "../components/Discover.vue" import Friends from "../components/Friends.vue" import My from "../components/My.vue" //将VueRouter设置为vue的插件 Vue.use(VueRouter) const router = new VueRouter({ //指定hash属性与组件的对应关系 routes:[ {path:"/discover",component:Discover}, {path:"/friends",component:Friends}, {path:"/my",component:My}, ] })
path对应链接;comment对应组件。
此时,组件要显示到哪里去?这就需要站位标签。需要组件在哪里显示就放到哪里。我们以放到根组件 App.vue 举例,代码如下:
一旦用户点击了"发现音乐",浏览器就会跳转的 discover 。根据前面路由的定义discover 对应的是 Discover 组件。这时Discover 组件的内容就会被渲染到这个位置,从而完成界面的跳转切换。
下面需要在 index.js 中将路由导出,代码如下:export default router
最后在main.js 中导入并设置,代码如下:import Vue from "vue" import App from "./App.vue" import router from "./router/index" Vue.config.productionTip = false new Vue({ render: h => h(App), router:router }).$mount("#app")
运行 npm run serve 启动项目。
我们发现没有显示下面的视图,点击"发现音乐"等,链接才会切换,这就可以显示出来了。
第一次加载是到首页,如果这个时候加载组件就没有内容显示,这样也不合适。实际项目中会指定一个默认加载的组件。如网易云音乐中,进入首页默认是进入"发现音乐"组件。
3.vue-router进阶路由重定向
用户在访问地址A的时候,强制用户跳转到地址B,从而显示特定组件的页面。
通过路由规则的 redirect 属性,指定一个新的路由地址,可以很方便地设置路由的重定向。
例如将首页重定义为显示"发现音乐"组件{path:"/",redirect:"/discover"},
嵌套路由
可以在组件下再嵌套组件,比如在"发现音乐"下再嵌套"推荐"、"歌单"等子路由。
在Discover.vue组件中,声明 toplist 和 playlist 的子路由链接以及子路由占位符,代码如下: 发现音乐
推荐 歌单
这个时候就需要新建 Toplist 和 Playlist 两个组件。
然后在 index.js 中引入Toplist 和 Playlist 两个组件,然后通过 children 属性嵌套声明子路由的方式来设置对应关系。这时index.js 完整代码如下://导入Vue和VueRouter import VueRouter from "vue-router"; import Vue from "vue"; //导入组件 import Discover from "../components/Discover.vue" import Friends from "../components/Friends.vue" import My from "../components/My.vue" import Toplist from "../components/Toplist.vue" import Playlist from "../components/Playlist.vue" //将VueRouter设置为vue的插件 Vue.use(VueRouter) const router = new VueRouter({ //指定hash属性与组件的对应关系 routes:[ //当用户访问 / 时,调转到 /discover {path:"/",redirect:"/discover"}, {path:"/discover", component:Discover, //通过 children 属性,可以嵌套声明子路由 children:[ {path:"toplist",component:Toplist}, {path:"playlist",component:Playlist}, ] }, {path:"/friends",component:Friends}, {path:"/my",component:My}, ] }) //导出默认路由 export default router
动态路由
很多路由链接,如下:商品1 商品2 商品3const router = new VueRouter({ //指定hash属性与组件的对应关系 routes:[ {path:"prodect/1",component:Prodect}, {path:"prodect/2",component:Prodect}, {path:"prodect/3",component:Prodect}, ] }, {path:"/friends",component:Friends}, {path:"/my",component:My}, ] })
上述方式复用性非常差。
思考:如有一个商品列表,当用户点商品的时候就跳转到该商品的详情,每一个商品都会有商品详情,不可能给每一个商品写一个商品详情的组件。这时就希望跳转到详情组件的时候重用组件里面的东西。
动态路由:就是把Hash地址中可变的部分定义为参数项,从而提高路由规则的复用性。在 vue-router 中使用英文的冒号 ( : )来定义路由参数项,如下:{path : "/prodect/:id,component:Prodect"}
下面进行实例演示:
1.有商品就需要先建一个商品组件:Prodect.vue
2.假设商品组件是基于 My.vue 组件的子路由,修改 My.vue 组件,如下: 我的音乐
商品1 商品2 商品3
3.在 index.js 中设置对应关系,先导入 Prodect.vue 组件import Prodect from "../components/Prodect.vue"
4.使用 children 属性定义跳转,代码如下:{path:"/my", component:My, children:[ {path:":id",component:Prodect}, ] },
5.启动项目,在浏览器中就可以显示效果:点击"我的音乐",然后在显示的商品1/2/3 中任点 一个,都可以显示"商品"这个内容出来。
现在有一个问题,在跳转到 Prodect.vue 组件时,如何知道需要显示商品几的详情呢?
解决方法:
方法1:通过动态路由匹配的方式渲染出来的组件中,可以使用 $route.params 对象访问到动态匹配的参数项,比如在商品详情组件的内部,根据 id 值,请求不同的商品数据。修改代码如下:
这时,点击不同的商品就显示出是商品几的详情
方法2:为了简化路由参数的获取形式,vue-router 允许在路由规则中开启 props 传参,index.js 中修改示例代码如下:{path:":id",component:Prodect,props:true},
Prodect.vue 组件修改如下:首先定义一个参数 id ;然后就不需要 $route.params,可以直接用于 id 来传递参数了,浏览器显示效果同上。 商品{{ id }}
编程式导航(在此仅作了解,后面的综合运用中再详细演示)
声明式导航:
编程式导航:router.push(...)
除了使用创建 a 标签来定义导航链接,还可以借助 router 的实例方法,通过编写代码来实现。
想要导航到不同的 URL ,可以使用 router.push 方法。这个方法会向 history 栈添加一个新的记录。所以,当用户点击浏览器"后退"按钮时,则回到之前的 URL 。
当点击 时,这个方法会在内部调用。所以,点击等同于调用router.push(...) 。 推荐
导航守卫
导航守卫可以控制路由的访问权限
比如还没有登录就想跳转到订单页面,这时可以用路由守卫进行统一控制。
全局导航守卫会拦截每个路由规则,从而对每个路由进行访问权限控制。可以使用 router.beforeEach 注册一个全局前置守卫:router.beforeEach(( to,from,next )=>{ if ( to.path === "/main" && !isAuthenticated){ next( "/login" ) } else{ next() } })
to:即将进入目标
from:当前导航正要离开的路由
在守卫方法中,如果声明了 next 形参,则必须调佣 next()函数,否则不允许用户访问任何一个路由
直接放行:next()
强制停留在当前页面:next(false)
强制跳转到登录页面:next( "/login" )
荷兰到底有多开放?很多国家觉得脸红的事情,在这却是很常见随着国际全球化趋势加强,各国之间的联系越来越密切,出国旅行也成了常见的娱乐方式。(此处已添加小程序,请到今日头条客户端查看)而西方有这样一个国家,很多中国游客去了之后就不想回国,觉
莆田南国蓬莱湄洲岛湄洲岛位于海峡西岸中部的湄洲湾口,与宝岛台湾一水相连,是海上和平女神妈祖的故乡,也是其羽化升天的地方,是妈祖文化的发源地,每年都有成千上万的信众前来朝拜。全岛陆域面积14。35平方
电商直播卖货会是压倒实体店铺关门潮的最后一根稻草吗?这几年随着互联网的快速发展,直播带货的发展势头强劲。相反实体店铺生意惨淡,歇业倒闭潮袭来,虽然有疫情原因,但和网店也有着密不可分的关系!小到日用百货,大到电视大家电汽车,都在各大直
半小时送酒到家,美团成线下酒商新战场?106届糖酒会上,一众酒企的展位中出现了美团闪购的身影,美团闪购在世纪城主会场的展区内搭建了一个大展位,上面写着酒水新零售最后一公里解决方案,不过上前交流的人并不多。因为疫情的影响
诺基亚新N73渲染图效仿苹果被咬一口,冲击高端与iPhone14争锋诺基亚手机在功能机时代的设计,可谓是天马行空,有很多时候设计出来的手机外观,可以称得上是反人类的设计。比如有圆形的手机有柳叶形状的机身等等,在当初可谓是风靡全国。但是诺基亚最终还是
新能源车涨价降价声中,你是否听到BBA的呜咽?BBA为何卖不动电车了?日前,某国产新能源车品牌宣布对旗下部分车型涨价20006000元不等,引发市场关注。此举,与近期特斯拉在中国市场对两款车型降价超过一万元形成鲜明对比。但是,
光速为何无法超越?因为大自然做了这两件事我们每天都生活在四维时空中,但如果要问你时间和空间到底是什么,你是不是会一脸懵逼?甚至会认为这种问题很无聊?但科学家们并不会认为,他们总是对我们每天习以为常的事物感兴趣。比如说,在
马云支持年轻人去做快递小哥当今社会,诞生了很多新兴的职业,比如,送快递,送外卖,跑滴滴,跑腿等等,这些工作门槛低,时间自由,赚的都是辛苦钱!很多大学生毕业找不到工作,也去做这种工作!看看马云怎么说,马云我特
4G全量共享一张网开启试点电信联通要探索合并了吗?在5G共建共享之后,电信和联通这对CP似乎已经尝到了合作的甜头。于是也有了尝试共同打造一张4G网的想法。此前,业内就传出过电信与联通的一份4G一张网规划编制指引内容。而近日,电信和
工信部前10月软件业务收入同比增10数据来源工信部制图蔡华伟记者从工信部获悉前10月,我国软件和信息技术服务业运行态势平稳向好,软件业务收入84214亿元,同比增长10,增速较前三季度提高0。2个百分点。软件业务收入
曾经四大流量李易峰,鹿晗,吴亦凡,杨洋只剩下杨洋还在硬撑曾经凭借着超高人气的四大流量李易峰,鹿晗,吴亦凡,杨洋,到现在为止也就只剩下杨洋一个人了,在2018年以前四大流量真是风光无限李易峰,当初凭借着古剑奇谭这部古装剧逐渐地被人们所熟悉
人民日报每日金句摘抄1一颗种子放到不同的土壤,会产生不一样的结果。2夫战,勇气也。信心就是勇气,有信心才会有力量。3只有勤奋努力,才有面向未来的信心与底气。4人生天地间,长路有险夷。幸福是奋斗出来的,
运营18年之久,魔兽世界停服!上亿玩家会流向何处?青春有很多句号,魔兽世界的停服,是其中一个。2022年11月23日,暴雪游戏产品国服的充值服务及用户注册入口关闭,导致二手平台上魔兽点卡价格被玩家竞争至翻倍,但另一面,由于对未来游
传承创新成长激活一池春水武威特色医药产业链综述武威有深厚的中医药历史文化底蕴和丰富多彩的中药材资源禀赋,特色医药产业发展特色优势明显。近年来,围绕强龙头补链条聚集群,武威进一步壮大特色医药生产企业集群,培育高值化特色医药大品种
怎么让文字转化成语音?什么软件能文字转语音?怎么让文字转化成语音?什么app可以把文字转换成语音?最近许多小伙伴想寻找这类型的答案。那么,这个帖子就给大家推荐5款声音特别真实的配音软件app吧!使用方法很简单的,简简单单的2
让政策找企业民企蹲点调查当前,民营经济发展状况受到各界关注。大众日报派出多路记者,推出民营经济调查蹲点报道。第一期调查让政策找企业,记者到民营经济高质量发展先进县(市区)济南章丘区和诸城市蹲点,采访十数家
穿Gucci的女人,竟然这么美在刚刚开始的2023秋冬米兰时装周上,GUCCI迎来了告别前首席设计师AlessandroMichele后的首场大秀2023秋冬系列男装。GucciFallWinter2023本季
浙江宁波开展爱聚月季心暖双拥新春志愿服务活动1月16日下午,浙江省宁波市退役军人服务中心牵手鄞州区东柳街道月季社区,开展爱聚月季心暖双拥新春志愿服务活动,为退役军人及其家属和社区居民送上特别礼物足不出户免费理发,还赠送大米和
新春走基层博湖冰雪游让冬季旅游热起来兔年第二天来滑雪,酣畅淋漓,希望这一年都扬眉兔气,大展宏兔。大年初二,在新疆博湖县大河口景区,气温降至零下二十多摄氏度,空气清新,天空湛蓝,库尔勒市民吕拥军一家三口在滑雪中迎接新的
快手的日子不太好过互联网的浪潮里涌出了许多企业,在时代里翻江倒海,在时代回到正常的轨道时,生存与毁灭的问题就该思考了。快手是短视频时代的两大巨头之一,同时也是中国视频领域在资本市场市值最高的企业。2
兔年卷王机型来了?骁龙8满血版,性价比价格带来旗舰体验随着春节假期的结束,大家陆陆续续也开始复工了,今天是周一,昨天也是周一,前天还是周一,打工人表示连续上了两天班才到星期一实在难顶,还要上四天班才放假呢。不过,相比不想上班的心,一加
CBA历史前五外援马尚弗格均未上榜,如何排名颇具争议CBA联赛允许外援加入,主要是从增强球队竞争力激励本土球员奋勇拼搏提高联赛观赏性扩大商业影响力四个方面进行考虑后,所有球队共同做出的决定。对于大部分球队来说,一个好的外援能顶半边天