Vue-路由

1.vue-router

vue-router是vue的一个插件库,是用来实现single page application的

既然是一个插件库,那么就要用Vue.use()来实现,其原理就是使用AJAX发送请求来实现

2.路由

一个路由是一组映射关系(key-value)

key为路径,value可能是function(在后端中)或component(在前端中)

vue-router通过检测我们的请求路径,如果发现其与我们写的route规则对上了,那么会进行变化,展示

《2.vue-router的使用》

首先下载vue-router ,由于在vue-cli2中只能用vue-router3版本,则下载命令:npm i vue-router@3

在main.js中去配置

 

 然后在文件中配置:

 《日后的一点小改变》

注意上述的图片,一般路由组件要放在一个新的文件pages中,而一般组件才放在components中:

 

 

 再到main.js中使用:

 《3.改变路由路径的方法》

然后那我要通过什么方式去改变路径而不向服务器发请求呢?

 

 通过<router-link></router-link>这个新标签,其中to=""这个是一定要写的,其表示点击这个标签后路径改变为什么

这里补充一下:在渲染后<router-link></router-link>这个新标签,其是还是为<a></a>标签

通过上述方法在路由中配置好了,即使不在App组件中引入Home组件和About组件都可以,也可以使用

当在切换展示组件时,其实是将不展示的组件销毁,再生展示的组件,而且路由组件上会比一般组件多两个东西

 多了$route与$router,其中$route是我这个当前组件所配置的路由规则,而$router是总的路由器(即真正的管理者)

 《4.多级嵌套路由》

首先在路由配置上:

 在已经配置了路由规则的父组件上在配置子路由,则要用到children这个配置项,其写成数组的形式,

里面的path:与一级路由不同,其不要写“/”了,这是因为在解析时,自动会加上;

 注意这个子路由的to的配置,要先写上父的路由路径,在跟上子的路由路径

这是因为在拿router文件夹下的index.js进行匹配时,先看/about,匹配上了,再到about的下面去找

 《5.向路由组件传参数》

首先解决一个问题:路由组件收到了参数,但是在哪里得到呢?

是在这个路由组件的$route的query中,

如何传入参数?

《方式1:query样式的传入》

以写发送query请求的方式来写

《方式1:对象样式的传入》

 《2.用params来传递参数》

 

 

 

 

《6.路由命名》

 

注意这个简化跳转只能在to写成对象的形式下才能用:

 《路由中的props配置项》

其作用是简化在路由组件中写路由数据用的,即我们一般在写路由数据时总要写:this.$route.query(params)....,但是这前面的太多余了

 

 

 首先在router文件夹下的index.js中,将要简化的路由组件中写上props

这个是props的函数写法,其参数是$route,

这个意为将,id与name传给这个detail路由组件,那么在这个组件中要接受:

 

 

 也通过props来接受,然后就可以直接用:

 

 

 

 《router-link中的replace》

 《自定义的跳转方式》

单纯使用<<router-link>><</router-link>>有一定的局限性,因为其最终解析出来是<a></a>,但是有时我想让其是<<button>><</button>>该怎么办?

这时我们要借助路由组件上的$router来实现

 

 

 在$router的原型对象上,有

 

 

 这两个方法

于是,我想由Message组件点击跳转到Detail组件上,在router/index.js配置好后:

 

 

 this.$router.push(replace)({})中的配置与to="'的函数写法配置一样

《$router中的其他方法》

$router.forward(),前进

$router.back(),后退

 

 

相当于这个按钮的功能

 

 《缓存路由组件》

 

 有一种情况,比如我想在输入框中写了东西,切换后想要在输入框中的东西保存起来,这么办?

这时要运用到一个新的标签<<keep-active>><</keep-active>>

用法如下:

 

 

 十分注意这个是要给谁套,比如我的input是在new路由组件中加的,我是先按About切换到message与new的展示区,再按new到了new_1/2/3的展示区,那么是在About组件中的来加

 

 

 

 

 

 但是这有缺点,就是我这个表示不仅是new缓存了,message路由组件也要缓存,

如果我只想要new路由组件缓存呢?

 注意include中写的是组件名,

当我要写多个名字呢?

写成 :include=“[ 'name1' , 'name2'  ,'name3',  ...]”

《路由组件独有的生命周期钩子 activated()与deactivated()》

其用处是:比如我有message 和 new这两个路由组件

 

 

 当我切到message路由组件时,message路由组件中的activated(){}生命周期钩子就被激活,

当我切出去的时候,deactivated(){}生命周期钩子就被激活

这两个生命周期钩子是写在自身组件上

《路由守卫》

一般情况下,我的路由组件是可以随便切换的,但是,我现在想在满足某一条件下才让切换

那么这时我就要与我的router/index.js来谈一谈

 

 

 

 

 在暴露之前,调用router身上的一个方法beforeEach,其有三个参数to,from,next

to与from是对象,记录着我是从哪个组件中来,到哪个组件中去

调用next()可以让我们往下一个组件跳转

这里有一个meta的配置,这个是让我们程序员自己传入东西,并且使用的

比如我觉得每次写这个很麻烦

 我可以在message与new组件中,写上

 校验时直接写:

 《独享路由守卫》

独享路由守卫是单独属于某个组件的守卫

《在index.js中写的独享路由守卫》

 

 只是beforeEnter(to,from)不同而已,其他的写法与beforeEach(){}写法相同

《在.vue中写的独享路由守卫》

 其他的写法也与beforeEach(){}写法相同

《history模式与hash模式》

 

 

 首先,其是在router/index.js下的文件中配置,如图

hash模式:

 

 

 

 

 如图:即使是在上面奇奇怪怪的路径下,发送给服务器的还是,#前面的内容,

即localhostL5000/students/这些内容;

在history模式:

 

 

 就是没有这个#

开启这个模式下:比如我在上面的复杂路径下刷新页面,那肯定会请求服务器,但服务器

有时没有这个路径,就会爆404,但是在hash的情况下,因为#即其后面的不会传给服务器,一般不会发生这个情况

 

 

 《补:一些知识》

《重定向redirect》

 

 即为当跳转到'/',时,立刻再跳转到另一个地方

《前后跳转》

$router.go(-1),即是向后一个地址跳转

《VUE3中路由的变化》

地址:https://www.jb51.net/article/215369.htm

posted @ 2022-06-19 09:53  次林梦叶  阅读(223)  评论(0编辑  收藏  举报