• vue-router 路由


    目录

    一、概念

    1、SPA应用:

    2、路由的理解:

    二、基本实现

    1、安装vue-router

    2、应用插件

    3、编写router配置项

    4、实现切换

    5、指定展示位置

    三、注意事项

    四、多级(嵌套)路由

    五、路由的query参数

    1、传递参数

    2、接收参数

    六、路由的params参数

    1、配置路由:

    2、传递参数

    七、命名路由

    步骤:

    八、路由的props配置

    九、路由的replace属性

    十、编程式路由导航

    1、push

    2、replace

    3、back、forward、go

    十一、两个路由独有的生命周期钩子

    十二、路由守卫

    1、全局前置路由守卫

    2、全局后置路由守卫

    3、独享路由守卫

    4、组件内路由守卫

    十三、history模式和hash模式

    1、history模式:

    2、hash模式:

    另外:


    一、概念

    vue中的一个插件库,专门用来实现SPA应用;

    1、SPA应用:

    ①、单页面Web应用(single page web application,SPA);

    ②、整个应用只有一个完整的页面;

    ③、点击页面的导航链接不会刷新页面,只会进行页面的局部刷新;

    ④、数据需要通过ajax请求获取;

    2、路由的理解:

    一个路由就是一组映射关系(key - value),key为路径,value可能是functioncomponents

    路由的分类:

    后端路由:

    ①、value为function,用于处理客户端提交的请求;

    ②、工作过程:服务器接收到一个请求时,根据请求路径找到匹配的函数来处理请求,返回响应数据

    前端路由:

    ①、理解value是components,用于展示页面内容

    ②、工作过程:当浏览器的路径改变时,对应的组件就会展示;

    二、基本实现

    1、安装vue-router

    命令:npm i vue-router(这个是适用于vue3版本,如果是想使用适用于vue2版本的话,就需要使用npm i vue-router@3命令行)

    2、应用插件

    Vue.use(VueRouter)

    3、编写router配置项

    新建router/index.js文件

    1. // 该文件专门用于创建整个应用的路由器
    2. import VueRouter from 'vue-router'
    3. // 引入组件(路由组件一般放在pages文件夹)
    4. import About from '../pages/About'
    5. import Home from '../pages/Home'
    6. // 创建并暴露一个路由器
    7. export default new VueRouter({
    8. routes:[
    9. {
    10. path:'/about',
    11. component:About
    12. },
    13. {
    14. path:'/home',
    15. component:Home
    16. }
    17. ]
    18. })

    4、实现切换

    1. <router-link class="list-group-item" active-class="active" to="about">Aboutrouter-link>
    2. <router-link class="list-group-item" active-class="active" to="home">Homerouter-link>

    5、指定展示位置

    1. <router-view>router-view>

    三、注意事项

    1、路由组件通常放在pages文件夹,而一般组件通常存放在conponents文件夹

    2、切换不同的路由组件时,隐藏的路由组件本质上默认是被销毁了,需要的时候再重新挂载

    3、每个组件之间共用一个router,可以通过组件的$router属性获取;

    4、每个组件都有自己的$route属性,里面存储着自己的路由信息

    四、多级(嵌套)路由

    1、配置路由规则:使用children配置项:

    router/index.js

    1. routes:[
    2. // 一级路由
    3. {
    4. path:'/about',
    5. component:About
    6. },
    7. {
    8. path:'/home',
    9. component:Home,
    10. // 二级路由
    11. children:[
    12. {
    13. path:'news',
    14. component:News
    15. },
    16. {
    17. path:'message',
    18. component:Message
    19. }
    20. ]
    21. }
    22. ]

    2、跳转:要写完整路径

    <router-link  to="/home/message">Messagerouter-link>

    五、路由的query参数

    1、传递参数

    字符串写法和对象写法

    1. <router-link :to="`/home/message/detail?id=${mes.id}&title=${mes.title}`">{{mes.title}}router-link>
    2. <router-link :to="{
    3. path:'/home/message/detail',
    4. query:{
    5. id:mes.id,
    6. title:mes.title
    7. }
    8. }">
    9. {{mes.title}}
    10. router-link>

    2、接收参数

    1. <ul>
    2. <li>消息编号:{{$route.query.id}}li>
    3. <li>消息标题:{{$route.query.title}}li>
    4. ul>

    六、路由的params参数

    1、配置路由:

    申明接收使用params参数

    router/index.js

    1. // 创建并暴露一个路由器
    2. export default new VueRouter({
    3. routes:[
    4. // 一级路由
    5. {
    6. // 命名路由
    7. name:'guanyu',
    8. path:'/about',
    9. component:About
    10. },
    11. {
    12. path:'/home',
    13. component:Home,
    14. // 二级路由
    15. children:[
    16. {
    17. path:'news',
    18. component:News
    19. },
    20. {
    21. path:'message',
    22. component:Message,
    23. children:[
    24. {
    25. // 使用占位符:id和:title申明接收params参数
    26. name:'xiangqing',
    27. path:'detail/:id/:title',
    28. component:Detail
    29. }
    30. ]
    31. }
    32. ]
    33. }
    34. ]
    35. })

    2、传递参数

    message.vue

    1. <li v-for="mes in messageList" :key="mes.id">
    2. <router-link :to="`/home/message/detail/${mes.id}/${mes.title}`">{{mes.title}}router-link>  
    3. <router-link :to="{
    4. // path:'/home/message/detail',
    5. // 命名路由通过名字name定位,不需要使用path
    6. name:'xiangqing',
    7. params:{
    8. id:mes.id,
    9. title:mes.title
    10. }
    11. }">
    12. {{mes.title}}
    13. router-link>
    14. li>

    注意:

    路由携带使用params传递参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置项

    Detail.vue

    1. <ul>
    2. <li>消息编号:{{$route.params.id}}li>
    3. <li>消息标题:{{$route.params.title}}li>
    4. ul>

    七、命名路由

    作用:可以简化路由的跳转中路径的编写,通过name属性直接定位到所要跳转的路由;

    步骤:

    1、给路由命名:

    1. routes:[
    2. // 一级路由
    3. {
    4. // 命名路由
    5. name:'guanyu',
    6. path:'/about',
    7. component:About
    8. // 二级路由
    9. children:[
    10. {
    11. path:'message',
    12. component:Message,
    13. children:[
    14. {
    15. // 三级路由
    16. // 命名路由,可以方便直接找到路径
    17. name:'xiangqing',
    18. path:'detail',
    19. component:Detail
    20. }
    21. ]
    22. }
    23. ]
    24. }
    25. ]

    2、简化跳转

    1. <router-link :to="{name:'guanyu'}">Aboutrouter-link>
    1. <router-link :to="{
    2. path:'/home/message/detail',
    3. query:{
    4. id:mes.id,
    5. title:mes.title
    6. }
    7. }">
    8. {{mes.title}}
    9. router-link>
    10. <router-link :to="{
    11. name:'xiangqing',
    12. query:{
    13. id:mes.id,
    14. title:mes.title
    15. }
    16. }">
    17. {{mes.title}}
    18. router-link>

    八、路由的props配置

    作用:能够让路由更加方便的接收到参数

    1. {
    2. // 命名路由,可以方便直接找到路径
    3. name:'xiangqing',
    4. path:'detail/:id/:title',
    5. component:Detail,
    6. // 路由中的props配置项的第一种写法:对象写法,该对象中的所有key、value都会以props的形式传给Detail组件
    7. props:{
    8. a:1,
    9. b:'hello'
    10. }
    11. // 路由中的props配置项的第二种写法:值为布尔值,若布尔值为真,就会把该组件用到的所有params参数,以props的形式传给Detail组件
    12. props:true
    13. // 第三种写法:值为函数,接收route参数
    14. props($route){
    15. return {id:$route.params.id,title:$route.params.title}
    16. }
    17. // 简写
    18. props({params}){
    19. return {id:params.id,title:params.title}
    20. }
    21. }

    九、路由的replace属性

    作用:控制路由跳转时,操作浏览器历史记录模式为替换模式;

    浏览器的历史记录有两种写入方式:分别为push和replace,push是追加模式,可回退;replace是替换模式,不可回退,路由跳转默认为push;

    1. <router-link :replace="true" to="about">Aboutrouter-link>
    2. <router-link replace to="about">Aboutrouter-link>

    十、编程式路由导航

    作用:不借助实现路由跳转,让路由跳转更加灵活;

    1、push

    在函数中使用this.$router.push能够实现路由跳转功能,并且能够进行回退操作;

    <button @click="pushShow(mes)">push查看button>
    1. methods:{
    2. pushShow(mes){
    3. this.$router.push({
    4. name:'xiangqing',
    5. params:{
    6. id:mes.id,
    7. title:mes.title
    8. }
    9. })
    10. }
    11. // ...
    12. }

    2、replace

    在函数中使用this.$router.replace能够实现路由跳转功能,不能进行回退操作;

    <button @click="replaceShow(mes)">replace查看button>
    1. methods:{
    2. replaceShow(mes){
    3. this.$router.replace({
    4. name:'xiangqing',
    5. params:{
    6. id:mes.id,
    7. title:mes.title
    8. }
    9. })
    10. }
    11. // ...
    12. }

    3、back、forward、go

    back:实现路由的回退操作,不接收参数;

    forward:实现路由的前进操作,不接受参数;

    go:实现路由的跳转操作,接收一个参数,正数表示前进负数表示回退

    1. <button @click="back">前进button>
    2. <button @click="forward">后退button>
    3. <button @click="text">测试一下gobutton>
    1. methods:{
    2. back(){
    3. // 实现路由的回退
    4. this.$router.back();
    5. },
    6. forward(){
    7. // 实现路由的前进
    8. this.$router.forward();
    9. },
    10. text(){
    11. // 参数为正数时,实现路由的前进
    12. this.$router.go(1);
    13. // 参数为负数时,实现路由的后退
    14. this.$router.go(-1);
    15. }
    16. }

    十一、两个路由独有的生命周期钩子

    activated()deactivated()用于捕获路由的激活状态,当页面展示的时候激活,当页面切走的时候失活

    <li :style="{opacity}">欢迎学习Vueli>
    1. export default {
    2. name:'News',
    3. data(){
    4. return{
    5. opacity:1
    6. }
    7. },
    8. // 两个路由独有的生命周期钩子
    9. // 激活
    10. activated(){
    11. console.log('News路由被激活了')
    12. this.timer = setInterval(()=>{
    13. this.opacity -= 0.01
    14. if(this.opacity <= 0) this.opacity = 1
    15. },16)
    16. },
    17. // 失活
    18. deactivated(){
    19. console.log('News路由失活了')
    20. clearInterval(this.timer)
    21. }
    22. }

    十二、路由守卫

    1、全局前置路由守卫

    作用:

    全局前置路由守卫————初始化的时候被调用、每次切换路由的时候被调用;

    先使用一个变量获取到路由器router,在暴露之前先调用beforeEach函数,通过判断将不符合条件的路由拦截,使其不能跳转;

    beforeEach函数接收三个参数:to、from、next,分别表示:去往的路由、来自哪个路由、确定前往

    三种获取拦截路由的方法:

    ①、path路径

    if(to.path === '/home/news' || to.path === '/home/message')

    ②、name名称

    if(to.name === 'news' || to.name === 'message')

    ③、meta属性添加配置项

    if(to.meta.isAuth)

     

    router/index.js

    1. // 创建并暴露一个路由器
    2. const router = new VueRouter({
    3. routes:[
    4. {
    5. path:'/home',
    6. component:Home
    7. children:[
    8. {
    9. name:'news',
    10. path:'news',
    11. component:News,
    12. meta:{isAuth:true}
    13. },
    14. {
    15. name:'message',
    16. path:'message',
    17. component:Message,
    18. meta:{isAuth:true}
    19. }
    20. ]
    21. }
    22. ]
    23. })
    24. // 全局前置路由守卫————初始化的时候被调用、每次切换路由的时候被调用
    25. // 接受三个参数:to、from、next,分别表示:去往的路由、来自哪个路由、确定前往
    26. router.beforeEach((to,from,next)=>{
    27. // 判断是否是需要拦截的路由
    28. //path形式
    29. //if(to.path === '/home/news' || to.path === '/home/message'){
    30. //name形式
    31. // if(to.name === 'news' || to.name === 'message'){
    32. //添加meta属性形式
    33. if(to.meta.isAuth){
    34. // 判断是否符合条件:学校名是否符合
    35. if(localStorage.getItem('school') === 'atguigu'){
    36. next();
    37. }else{
    38. alert('学校名不是atguigu,无权限访问!')
    39. }
    40. }else{
    41. // 使用next实现前往下一个路由
    42. next()
    43. }
    44. })
    45. export default router

    2、全局后置路由守卫

    作用:

    全局后置路由守卫————初始化的时候被调用、每次切换路由的时候被调用;

    afterEach函数接收两个参数:to、from,分别表示:去往的路由、来自哪个路由

    1. // 全局后置路由守卫————初始化的时候被调用、每次切换路由的时候被调用
    2. // 接受两个参数:to、from,分别表示:去往的路由、来自哪个路由
    3. router.afterEach((to,from)=>{
    4. // 在后置路由守卫中,就不需要写那么多判断,当执行到后置路由守卫,就表示路由一定切换
    5. document.title = to.meta.title || '尚硅谷系统'
    6. })

    3、独享路由守卫

    写在每一个路由内部,使用beforeEnter配置项,只有前置守卫,没有后置守卫;

    1. // 创建并暴露一个路由器
    2. const router = new VueRouter({
    3. routes:[
    4. {
    5. name:'news',
    6. path:'news',
    7. component:News,
    8. // meta属性是路由提供给程序员的一个容器,能够存放程序员需要添加的内容
    9. meta:{isAuth:true,title:'新闻'},
    10. beforeEnter:(to,from)=>{
    11. if(to.meta.isAuth){
    12. if(localStorage.getItem('school') === 'atguigu'){
    13. // 实现在路由跳转之前替换页面标题
    14. document.title = to.meta.title || '尚硅谷系统'
    15. next();
    16. }else{
    17. alert('学校名不是atguigu,无权限访问!')
    18. }
    19. }else{
    20. document.title = to.meta.title || '尚硅谷系统'
    21. // 使用next实现前往下一个路由
    22. next()
    23. }
    24. }
    25. },
    26. // ...
    27. ]
    28. })

    4、组件内路由守卫

    ①、通过路由规则,进入组件时调用beforeRouteEnter,接收三个参数:to、from、next

    1. beforeRouteEnter(to,from,next){
    2. console.log('About--beforeRouteEnter')
    3. if(to.meta.isAuth){
    4. if(localStorage.getItem('school') === 'atguigu'){
    5. next();
    6. }else{
    7. alert('学校名不是atguigu,无权限访问!')
    8. }
    9. }else{
    10. // 使用next实现前往下一个路由
    11. next()
    12. }
    13. }

    ②、通过路由规则,离开该组件时调用beforeRouteLeave,同样接收三个参数:to、from、next

    1. beforeRouteLeave(to,from,next){
    2. console.log('About--beforeRouteLeave')
    3. next();
    4. }

    十三、history模式和hash模式

    用法:在router/index.js文件中,创建路由的时候通过mode属性进行定义,默认为hash;

    1. const router = new VueRouter({
    2. mode:'hash',
    3. // ...
    4. })

    1、history模式:

    ①、地址中不存在#,干净美观;

    ②、兼容性与hash模式相比相对较差;

    ③、应用部署上线时,需要后端人员的支持,解决刷新页面服务端404问题;

    2、hash模式:

    ①、地址永远带着#,不美观;

    ②、若以后将地址通过第三方手机app分享时,app检验严格,则地址带有#会被标记为不合法;

    ③、兼容性好;

    另外:

    1、使用标签实现组件的缓存,使其不被销毁,使用includes属性表明所需要缓存的组件名(每一个组件的name属性的属性值就是组件名,没有设置默认为vue文件名),若不适用includes属性,则所有的子路由都会被缓存,不被销毁;

    1. <keep-alive include="News">
    2. <router-view>router-view>
    3. keep-alive>

     缓存多个写成数组形式:

    1. <keep-alive :include="['News','Message']">
    2. <router-view>router-view>
    3. keep-alive>

     

    注意:是在父路由的展示区子路由设置标签;

  • 相关阅读:
    【尚跑】马拉松冬训指南
    人才资源开发杂志人才资源开发杂志社人才资源开发编辑部2022年第15期目录
    什么情况下考虑分库分表
    数据结构与算法八股文背诵版
    【JavaWeb - 网页编程】七 HTTP 协议 与 Servlet 技术
    总结:Tomcat的IO模型
    【Java技术专题】「Java8技术盲区」让我们来看看新一代IO流的开发指引(流升级功能体系)
    `算法题解` `AcWing` 4611. 串联数字
    outsystems合集系列(二)
    学习笔记——网络管理与运维——SNMP(SNMP原理)
  • 原文地址:https://blog.csdn.net/weixin_46376652/article/details/125905978