路由概念

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

  key为路径 value可能是function 或者component

路由分类

  后端路由

     value是function 用于处理客户端提交的请求

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

  前端路由

     value是component 用于展示页面内容

     工作内容: 当浏览器的路径改变时 对应的组件就会显示

下面来演示一个基本路由的使用:

首先安装路由

注意目前安装路由的默认安装命令安装的路由是4版本的,只可在vue3以上可以使用,而vue2版本需要安装路由的3版本或以下才可以使用这里安装路由的3版本

 安装完后新建文件夹router,新建文件index.js

新建Home和About组件

书写路由文件

 实现切换

 

 注意上面动图在切换路由点击时,地址栏前的刷新按钮并没有刷新,后面的地址栏也只有about和home之间的变化,并且地址栏中还有/#/这说明vue的路由已经生效

router注意点

   路由组件通常存放在pages文件夹中 一般组件通常存放在components文件夹

   通过切换 '隐藏'的路由组件 默认是被销毁掉的 需要的时候再去挂载

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

   整个应用只有一个router 可以通过组件的$router属性获取到

新建一个Banner组件,用于存刚才的标题,再新建pages文件夹,将刚才配置的路由组件Home和About组件放入pages中

Banner是一般组件,所以在App.vue中需要像以前一样引用才可以使用

 

 

嵌套路由(多级路由)

  多级路由进行嵌套使用,在路由配置中使用children配置当前路由组件的子级路由

新建News和Message作为Home的子级路由

 

 

 路由的query传参

   新建detail组件

 

 

 命名路由

   可以给路由起一个名字,可以起到简化路由跳转路径的作用

 

params方式传参

 

路由的props配置 

   

 

 注意前面props的第二种写法只支持params,不支持query,第一种写法传递数据基本只能传递固定数据,不灵活,第一种写法一般不推荐

第三种写法:

 query写法

 

 

 编程式路由导航(不用<router-link>)

作用: 不借助<router-link>实现路由跳转 让路由跳转更灵活

this.$router.push({}) 内传的对象与<router-link>中的to相同

this.$router.replace({}) 替换当前页记录跳转

this.$router.forward()前进

this.$router.back() 后退

this.$router.go(x) 指定步数跳转,当x为正数时,前进x步,当x为负数时,后退x步

 

 

 

 页面上出现这个错误是因为使用 this.$router.push或this.$router.replace跳转页面时,对应的query参数和当前地址栏上的参数一样导致

解决方案: 可以在this.$router.push或this.$router.replace后面进行异常的捕捉

 

缓存路由组件

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

我们先看不缓存路由组件是什么效果

可以看到在输入框里输入数据后,再切换到message组件,然后再切换回来后刚才input输入的数据清空了

下面使用缓存组件来来解决这一问题

 使用keep-alive标签包裹要展示的组件,include指明要缓存的组件名字.如果不指明,默认将所有组件都开启缓存,如果想指明多个组件开启缓存而不是全部组件,可以直接绑定数组写法,

:include='['组件名1','组件名2'......]'

路由组件的生命周期钩子

  路由组件所独有的两个钩子 用于捕捉路由组件的激活状态

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

  2 deactivated 路由组件失活时触发

路由守卫

 作用: 对路由进行权限控制

分类: 全局守卫 独享守卫 组件内守卫

    全局守卫 meta 路由源信息

        全局前置守卫: 初始化时 每次路由切换前执行

         router.beforeEach((to,from,next)=>{函数体})

        全局后置守卫 初始化时执行 每次路由切换后执行

        router.after((to,from,next)=>{函数体})

    独享守卫

           某个组件所独享的组件路由,独享守卫没有前置后置守卫之说

           beforeEnter(to,from,next)

    组件内守卫

           进入守卫:通过路由规则 进入该组件时被调用

            beforeRouterEnter(to,from,next)

           离开守卫 通过路由规则 离开该组件时被调用

           beforeRouterLeave(to,from,next)

   

路由器的两种工作模式

  对于一个url来说 # 及其后面的内容就是hash值

  hash值 不会包含在http请求中 即 hash值不会被带给服务器

  hash模式

     地址中永远带着#号 ,不美观

     若以后将地址通过第三方手机app分享 若app校验严格 则地址会被标记为不合法

     兼容性较好

history模式

    地址干净 美观

   兼容性和hash模式相比略差

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

   搭建前端建议服务器

    新建文件夹,打开终端命令,输入npm init

然后随便起一个名字后一路回车,结束后输入命令 npm express

然后新建一个server.js文件

const express = require('express')
const history = require('connect-history-api-fallback')

const app = express()
app.use(history())
app.use(express.static(__dirname+'/static'))

app.get('/person',(req,res)=>{
    res.send({
        name:'迪迦',
        attr:'超古代的光之巨人'
    })
})

app.listen(8001,(err)=>{
    if(!err) console.log('服务器启动成功')
})

   

 书写完必要数据后,在终端输入启动命令: npm server

在浏览器输入监听的端口号和路由路径

然后新建static文件夹,准备放入前端编译好的静态文件 

编译vue文件,将之前写好的demo进行编译,打开终端输入npm run build命令

 编译完之后,项目文件路径会多出一个文件夹dist

将dist里的文件复制到刚才新建的static文件夹下

直接在浏览器地址栏输入localhost:8001

 这个时候我们之前写的demo就已经部署在我们的前端服务器上了

路由器默认工作模式为hash 此时我们将路由器的工作模式调整为history

 ,然后再编译,将重新编译后的静态文件重新放入static文件夹下,再重新前端服务

 这个时候发现如果路由器是history模式的话,在浏览器地址栏上如果有路由资源的话,此时点击浏览器刷新按钮会出现404路径错误,而在hash模式下是没有这种情况的

此处推荐使用一个node的插件来解决这个问题

输入安装命令npm i connect-history-api-fallback

安装完后引用并使用 

重新服务器

 可以看到此时再刷新网页,就不会出现404问题了

Logo

前往低代码交流专区

更多推荐