问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Vue-Router路由各种跳转、传参、小知识

发布网友 发布时间:2024-09-15 09:47

我来回答

1个回答

热心网友 时间:2024-11-15 11:05

前言

学完Vuex方面的操作就该来学学Vue中的路由操作了....xdm冲

一、安装

vue-cli安装

vueaddrouter

做完这一步基础环境都搭好了。

项目中会多一个

文件夹,内容如下:

最后暴露出来,在mian.js中引用进去就可以了。暂时先不细讲。

二、基本路由使用

基本路由使用,其实你安装完就已经有例子啦。

在App组件中有下面这两行代码,其实就路由跳转的意思。

<router-linkto="/">Home</router-link>|<router-linkto="/about">About</router-link>|

我们以前是用a标签,这里只是帮我们封装了。这里配置好的/及/about都是router文件夹下配置好的路由规则,每个路径和哪个组件相对应。

效果如下:

点击就能跳转.

这是最基础的,看看就完事了,因为咱们使用这种方式挺少的,基本上在路由跳转的过程中都是要做很多事情的.

但是大家发现了没有,只有内容变了,为啥呢?

因为app组件中<router-view/>这个代码,意思就是切换路由时,将组件内容放到这里展示。

这最基本的,大家随便玩玩都会的,咱们不多说。

问个小问题,这个路由跳转的过程中,原来的哪个组件是被隐藏了,还是销毁了呢???

三、嵌套路由(套娃)

效果图:

就是在home和about下分别来个路由,也非常容易。

我们先加两个组件

我们再router中进行配置一下。

constroutes=[{path:'/',name:'Home',component:Home,children:[{path:'/message',name:'message',component:()=>import(/*webpackChunkName:"about"*/'../components/Message.vue'),}]},{path:'/about',name:'About',component:()=>import(/*webpackChunkName:"about"*/'../views/About.vue'),children:[{path:'/news',name:'news',component:()=>import(/*webpackChunkName:"about"*/'../components/News.vue'),},]}]

其实也就牵扯到children这一个属性,就是和上级路由形成父子关系啦。套娃两层是这么套,那么套再多就是在里面接着写就完事了。

一次套娃一次爽,一直套娃一直爽

四、路由传参

效果

我们再加一个两个子路由,在里面实现路由传参。另外把原来的组件改一下。

4.1、搭建基础环境

MessageItem组件

<template><div><p>消息编号:???<//p><p>消息标题:???<//p></div></template>

NewsItem组件

<template><div><p>新闻编号:???</p><p>新闻标题:???</p></div></template><script>

这里的???是稍后用来接收路由传参的哈。

News组件

<template><div><ul><liv-for="newIteminnews":key="newItem.id"><router-linkto="/item">{{newItem.id}}:{{newItem.title}}</router-link></li></ul><router-view></router-view></div></template><script>exportdefault{data(){return{news:[{id:1,title:"001新闻"},{id:2,title:"002新闻"},{id:3,title:"003新闻"}]}}}</script>

Message组件

<template><div><ul><liv-for="messageinmessages":key="message.id"><router-linkto="/item">{{message.id}}:{{message.title}}</router-link></li></ul><router-view></router-view></div></template><script>exportdefault{data(){return{messages:[{id:1,title:"001信息"},{id:2,title:"002信息"},{id:3,title:"003信息"}]}}}</script>4.2、query参数第一种:to的字符串写法

URL传参,组件用$route.query取值

Message组件

<liv-for="messageinmessages":key="message.id"><router-link:to="`/item?id=${message.id}&title=${message.title}`">{{message.id}}:{{message.title}}</router-link></li>

注意这里的to前面是加了引号的,并且中间的内容也是用`符号修饰的

MessageItem组件

<div><p>消息编号:{{$route.query.id}}</p><p>消息标题:{{$route.query.title}}</p></div>第二种:to的对象方法<liv-for="messageinmessages":key="message.id"><!--to的字符串写法--><!--<router-link:to="`/item?id=${message.id}&title=${message.title}`">{{message.id}}:{{message.title}}</router-link>--><!--to的对象写法--><router-link:to="{path:'/item',query:{id:message.id,title:message.title}}">{{message.id}}:{{message.title}}</router-link></li>

另外一边接收的方式还是同上。

4.3、params参数第一种:to的字符串写法

跳转链接还是差不多的,但是必须在路由规则中进行配置

<router-linkto="/">Home</router-link>|<router-linkto="/about">About</router-link>|0<router-linkto="/">Home</router-link>|<router-linkto="/about">About</router-link>|1

接收的也稍稍有变化:

<router-linkto="/">Home</router-link>|<router-linkto="/about">About</router-link>|2第二种:to的对象写法<router-linkto="/">Home</router-link>|<router-linkto="/about">About</router-link>|3

注意:这里必须用name,即配置好的路由名称,不能够使用路由路径。

4.4、路由的props配置(偷懒的好工具)

我们思考一个问题哈。

你有没有觉得{{$route.params.id}}或者{{$route.params.title}}这样子去取一个路由传过来的值,十分重复呢???

取每个值,都还要写一遍$route.params或者是$this.query这个前缀,有没有觉得十分重复,那么有没有更简单的呢?

(一个两个还是简单的,万一有天传的多了,这个props肯定是能偷懒的哈?)

1)props配置方式一:<router-linkto="/">Home</router-link>|<router-linkto="/about">About</router-link>|4

传递params参数的父组件啥都不用改,

我们改一下接收的子组件

<template><div><!--<p>消息编号:{{$route.query.id}}</p><p>消息标题:{{$route.query.title}}</p>--><!--<router-linkto="/">Home</router-link>|<router-linkto="/about">About</router-link>|2--><!--通过props接收--><p>消息编号:{{id}}</p><p>消息标题:{{title}}</p></div></template><script>exportdefault{props:['id','title']}</script>2)props配置方式二:

思考一下,上面的那个方法只能解决传递params参数时进行缩写,那么如果是传递query参数方式该怎么办呢?

props配置其实可以改成一个函数的哈

注意:记得在练习的时候,

<router-linkto="/">Home</router-link>|<router-linkto="/about">About</router-link>|6

想接收什么,我们就是在这边写啥就完事了,到了子组件,就是直接用了。

解构写法

<router-linkto="/">Home</router-link>|<router-linkto="/about">About</router-link>|7

更偷懒的就是连续解构:

<router-linkto="/">Home</router-link>|<router-linkto="/about">About</router-link>|8

果然是偷懒使人进步啊。

五、编程式路由5.1、编程式实现路由跳转

之前我们都是借助<router-linkto="/news">新闻</router-link>这个来实现路由的跳转,但实际开发中都是通过点击按钮或者是触发什么事件,然后才进行跳转的,所以使用router-link并不是特别合适。才有了编程式路由。

<router-linkto="/">Home</router-link>|<router-linkto="/about">About</router-link>|9

利用方法进行跳转

constroutes=[{path:'/',name:'Home',component:Home,children:[{path:'/message',name:'message',component:()=>import(/*webpackChunkName:"about"*/'../components/Message.vue'),}]},{path:'/about',name:'About',component:()=>import(/*webpackChunkName:"about"*/'../views/About.vue'),children:[{path:'/news',name:'news',component:()=>import(/*webpackChunkName:"about"*/'../components/News.vue'),},]}]0

如果是params也是和之前一样的;

constroutes=[{path:'/',name:'Home',component:Home,children:[{path:'/message',name:'message',component:()=>import(/*webpackChunkName:"about"*/'../components/Message.vue'),}]},{path:'/about',name:'About',component:()=>import(/*webpackChunkName:"about"*/'../views/About.vue'),children:[{path:'/news',name:'news',component:()=>import(/*webpackChunkName:"about"*/'../components/News.vue'),},]}]1

相关的信息也要改哈,路由中配置的props啥的。

5.2、编程式控制前进后退

对于浏览器中的前进后退按钮,我们大家肯定是不陌生哈。

其实这个也是可以用编程式的方式来实现的。

constroutes=[{path:'/',name:'Home',component:Home,children:[{path:'/message',name:'message',component:()=>import(/*webpackChunkName:"about"*/'../components/Message.vue'),}]},{path:'/about',name:'About',component:()=>import(/*webpackChunkName:"about"*/'../views/About.vue'),children:[{path:'/news',name:'news',component:()=>import(/*webpackChunkName:"about"*/'../components/News.vue'),},]}]2

其实都是通过$router上的api来实现的,但是如果是无痕状态下,还是无法实现的,因为这些实现还是需要依靠浏览器的历史记录的。

效果图:

六、缓存路由组件

作用:让不展示的路由组件保持挂载,不被销毁。

我们在MessageItem组件中写上一个beforeDestroy销毁之前的钩子函数

constroutes=[{path:'/',name:'Home',component:Home,children:[{path:'/message',name:'message',component:()=>import(/*webpackChunkName:"about"*/'../components/Message.vue'),}]},{path:'/about',name:'About',component:()=>import(/*webpackChunkName:"about"*/'../views/About.vue'),children:[{path:'/news',name:'news',component:()=>import(/*webpackChunkName:"about"*/'../components/News.vue'),},]}]3

当我们从MessageItem组件切换到其他页面时,就会打印出这个。

但是如果我们在使用他的父组件身上改成下面这样的。

constroutes=[{path:'/',name:'Home',component:Home,children:[{path:'/message',name:'message',component:()=>import(/*webpackChunkName:"about"*/'../components/Message.vue'),}]},{path:'/about',name:'About',component:()=>import(/*webpackChunkName:"about"*/'../views/About.vue'),children:[{path:'/news',name:'news',component:()=>import(/*webpackChunkName:"about"*/'../components/News.vue'),},]}]4

注意:include中写的是组件名。组件名。组件名。

如果不写include,是默认全部都缓存,不销毁。

这样写就会保证MessageItem在切换的过程中不会被销毁。

如果切换的异常频繁的话,我觉得加上这个还是可以的。

七、两个新的生命周期钩子函数

在第六小节,我们可以把组件进行缓存,但是同时也会造车组件的beforeDestroy生命周期钩子函数失效。

那么有些清除操作将会没法执行(如切换路由,让定时器暂停),所以就有了两个路由的独有的生命周期钩子函数。

activated路由组件被激活时触发。

deactivated路由组件失活时触发。

constroutes=[{path:'/',name:'Home',component:Home,children:[{path:'/message',name:'message',component:()=>import(/*webpackChunkName:"about"*/'../components/Message.vue'),}]},{path:'/about',name:'About',component:()=&
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? vue中如何隐藏导航栏或菜单栏才能使项目更好维护 vue 点击浏览器返回前进按钮,页面不刷新问题 vue路由重定向有什么用 4595302 7位数的条形码怎么做啊?用什么编码? 7位数的产品批号2020271怎么看? 中交隧道工程局有限公司郑州分公司怎么样? 水浒传二十回至三十回 如何查看电脑上的照片文件? 电脑怎么找以前保存的照片 如何在电脑上找到并查看保存的网络图片? 姓王的小名有哪些 黑道小说《少帅》小说txt全集免费下载 为宝宝选择幼儿园的几个标准原则是什么? 详解蓝牙技术「定义、协议、特点及应用」 耳机显示h2w是什么意思? 中医如何预防脑动脉炎复发 动脉炎是什么病 脑动脉炎的诊断和治疗 脑血管炎怎么治疗 脑血管发炎能治好吗 vue3angular13 盐酸小檗碱(黄连素)的应用黄连素治疗心血管病 儿童正常脑电波图 医保生效前三个月报销 进行性延髓麻痹诊断检查 哪里有雪之女王观看? 沉住气成大器:领导低调做人高调做事的9项修炼目录 沉住气做人:沉下心做事目录 2023福建丹樱农场樱花什么时候开-旅游专题 ps衣服素材怎么下载ps衣服素材怎么下载到电脑 ps笔触怎么安装ps笔触怎么安装到电脑上 黑暗迪迦是不是迪迦最弱形态? 黑暗迪迦没出数据,迪疯就认为无敌。_百度... 异世界的迪迦梦txt全集下载 电磁波在真空中是怎么传播的?谁能画一个图描述下电磁波传播时的电场和... 撒贝宁老婆个人资料撒贝宁和李白分手了吗 撒贝宁一家四口同框[撒贝宁的老婆李白资料] 如何约束高层管理者,以避免出现内部人控制 公司治理理论控制管理者的机制 如何管理和约束下属? 做为一个基层管理者如何约束自己