首页 > 其他分享 >vue-路由详解

vue-路由详解

时间:2024-03-31 22:02:04浏览次数:20  
标签:vue title component 守卫 详解 组件 router 路由

路由 vue-router

1.对路由的理解: vue的一个插件库,专门用来实现SPA应用
2.对SPA应用的理解:

     1.单页web应用
     2.整个应用只有一个完整的页面(index.html)
     3.点击页面中的导航链接不会刷新页面,只做页面的局部更新
     4.数据需要通过ajax请求获取

3.什么是路由?

1.一个路由就是一组映射关系**(key-value)**
2.  **key为路径,value可能是function或component**
![在这里插入图片描述](/i/ll/?i=direct/f35fe5e9ee9b4f48940da24c7e73ef21.png#pic_center)

4.路由的分类

**1.后端路由**
   1.理解:value是function,用于处理客户端提交的请求
   2.工作过程:服务器接收到一个请求时,根据请求路径找到匹配的函数来处理请求,返回响应数据
 **2.前端路由:**
   1.理解:value是component,用于展示页面内容
   2.工作过程:当浏览器的路径改变时,对应的组件就会显示

路由的基本使用

1.安装vue-router

npm i vue-router@3

2.引入vueRouter,应用插件Vue.use(VueRouter)

// 引入vueRouter
import VueRouter from 'vue-router'
// 应用vue-router
Vue.use(VueRouter)

3.创建router–>index.js编写router配置项

 <!-- 1.引入VueRouter  -->
 import VueRouter from 'vue-router'
 <!-- 2.引入要使用的组件About -->
 import About from '../component/About'
 <!-- 3.创建并暴露router实例对象,去管理一组一组的路由规则 -->
 export default new VueRouter({
  routes:[          //路由规则(routes)是一个数组
    {
   path:'/about',   //路径
   component:About  //当跳转到上述路径时要在页面显示的组件
    }
  ]
 })

4.实现切换(active-class 可配置高亮样式)
在组件中使用 <router-link to="路径">About组件<router-link/>调用路由规则,实现指定路由的切换,然后将路由规则中路径对应的组件通过<router-view></router-view>呈现到页面上

 <!-- 使用router-link指定路由的切换-->
 <router-link active-class="active" to="/about">About组件</router-link>
 //router-view指定组件展示在什么位置
  <router-view></router-view>
  

5.几个注意点

  1.**路由组件**通常存放在**pages**文件夹下,**一般组件**存放在**components**文件夹下
  2.**通过切换,隐藏了的路由组件,默认是被销毁的,需要的时候再去挂载**
  3.**每个组件都有自己的$route属性,里面存储着自己的路由信息**
  4.**整个应用只有一个Router,可以通过组件的$router属性获取到**

多级路由(嵌套路由)

配置路由规则,使用children配置项,在父亲组件中配置children(本质是一个数组)

routes:[
    {
      path:'/about',
      component:About,
       children:[                //通过children配置子级路由
        {
          path:'news',         //此处一定不要写/,多级路由只需写名字即可
          component:News
        },
        {
            path:'message',
            component:Message
           },
      ]
    },
  ]

2.跳转(要带上父级路由,写完整路径)

<router-link  to="/About/news">News</router-link>

路由的query参数

1.传递参数(两种写法)
假如在message组件中有一组数据messageList
这时要将messageList里的id和title两个属性的值传递给message的子组件detail
使用query传参有两种写法

 <li v-for="message in messageList" :key =" message.id">
        <!-- **第一种写法:**跳转路由并携带query参数,to的字符串写法 -->
        <!-- <router-link to="`/home/message/detail?id=${message.id}&title=${message.title}`">{{ message.title }}</router-link>&nbsp;&nbsp;
      </li> -->
      <!--**第二种写法:** 跳转路由并携带query参数,to的对象写法 -->
      <router-link :to="{
        path:'/home/message/detail',
        query:{
          id:message.id,
          title:message.title
        }
      }">
      </router-link>&nbsp;&nbsp;
      </li>

2.接收参数
接收参数就在子组件之中调用route接收

$route.query.id
$route.query.title

命名路由

1.作用:可以简化路由的跳转
2.如何使用?
给index.js中的路由加一个name:'名字'属性

routes:[
    {
    **name:'about',**          //通过name属性给每个组件配置一个名字
      path:'/about',
      component:About,
       children:[              //通过children配置子级路由
        {
        **name:'news',**       // 通过name属性给每个组件配置一个名字
          path:'news',         //此处一定不要写/,多级路由只需写名字即可
          component:News
        },
        {
            path:'message',
            component:Message,
            children:[
            name:'detail',
            path:'detail',
            component:'Detail'
            ],
           },
      ]
    },
  ]

2.简化跳转,要将to写成对象写法
简化前:

  <router-link to="路径"> </router-link>

简化后,将to写成对象式

<router-link :to={
  name:'名字',//这里也可以写为原来的 path:'/home/message/detail',但是路径太长推荐使用name
  query:{
    id:"message.id',
    title:'message.title'
  }
 }>
 </router-link>

路由的params参数

1.配置路由,声明接收params参数

   {
    path:'message',
    component:Message,
    children:[
      {
        name:'detail',
        **path:'detail/:id/:title',** //**使用占位符声明接收params参数**
       component:Detail
      }
    ]
   },

2.传递参数
同样也有两种写法

 <li v-for="message in messageList" :key =" message.id">
        <!-- 第一种方法:**跳转路由并携带params参数,to的字符串写法** -->
        <!-- <router-link to="`/home/message/${message.id}/${message.title}`">{{ message.title }}</router-link>&nbsp;&nbsp;
      </li> -->
      <!-- 第二种方法:**跳转路由并携带params参数,to的对象写法** -->
      <!-- **用to的对象写法,不能写配置项path,只能写name** -->
      <router-link :to="{
        name:'detail',
        query:{
          id:message.id,
          title:message.title
        }
      }">
      </router-link>&nbsp;&nbsp;
      </li>

3.接收参数

与query接收参数同理

    $route.params.id
    $route.params.title

路由的props配置

作用:让路由组件更方便的收到参数
谁接收数据就在谁的路由规则中写配置项props

{
        path:'message',
        component:Message,
        children:[
          {
            name:'detail',
            path:'detail/:id/:title',
           component:Detail,
          //  detail接收数据
        // props值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件,query与params都适用
        //props的参数是$route,通过$route可以拿到query或者params里的值
        props($route){  
          return {
            id:$route.params.id, 或者 id:$route.jquery.id, 
            title:$route.params.title 或者   title:$route.jquery.title
            }
        }
          }
        ]
       },

组件中用props配置项接收,在模板中使用数值

  <script>
       export default {
          name:'Detail',
          props:['id','title'],}
     </script>

<router-link>的replace属性

1.作用:控制路由跳转时操作浏览器记录的模式
2.浏览器的历史记录有两种写入方式:分别为push和replace,push是追加历史记录,replace是替换当前记录,路由跳转时默认为push
3.如何开启replace模式,<router-link  replace....>.....</router-link>

编程式路由导航

当标签不是a标签而是其他的标签,如button标签时,我们就不能使用<router-link>实现路由跳转了,这时就用到了编程式导航
1.作用:不借助`实现路由跳转,让路由跳转更灵活
2.具体编码

 <!-- $router的两个API,push与replace -->
 //push是追加历史记录,点击返回按钮可以返回上一次的记录
  this.router.push({
  //配置项,params也可以换成query
    name:'',
    params:{ 
   
    }
  })
  //replace是替换上一条记录,不能通过返回按钮返回上一次记录
  this.router.replace({
    name:'',
    params:{
    }
  })

其他的API

  this.$router.back()  //后退
  this.$router.forward()  //前进
  this.$router.go(传入要前进几个或者后进几个的数字)

缓存路由组件

1.作用:让展示的路由组件保持挂载,不被销毁
2.具体编码

  <keep-alive include="要缓存的组件名">
   <router-view></router-view>
   </keep-alive>

两个新的生命周期钩子

1.作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态
2.具体名字:

    **1.actived 路由组件被激活时触发
      2.deactived 路由组件失活时触发**

路由守卫

1.作用:对路由进行权限控制
2.分类:全局守卫,独享守卫,组件内守卫
3.全局守卫
全局路由守卫写路由规则外面
给router–>index.js需要进行路由守卫的添加 meta:{isAuth:false}用来控制是否要对前来的路由进行检查
给router–>index.js所有配置路由规则的路由添加 meta:{title:'网页标题名'},使用全局后置路由配置网页标题
修改main.js

 // 全局前置路由守卫---初始化的时候被调用,每次路由切换之前被调用
    router.beforeEach((to, from, next) => {
      if(to.meta.isAuth){        //控制是否需要鉴权
        if(localStorage.getItem('school')==='北京大学' ){
          next();  //放行
        }
      else
       alert('学校名不对')
      }
     else{
      next() //放行
     }
    });
    // 全局后置路由守卫---初始化的时候被调用,每次路由切换之后被调用
    // 设置网页标题 
    router.afterEach((to,from)=>{
      document.title = to.meta.title ||'好运'
    })
    <!-- 最后暴露 -->
    export default router

独享路由守卫

独享路由守卫写路由规则里面

   {
      name:'news',
      path:'news',
      component:News,
      meta:{isAuth:true,title:'新闻'},
      // 独享路由守卫
      beforeEnter:(to,from,next)=>{
      if(to.meta.isAuth){
        if(localStorage.getItem('school') === '清华大学'){
          next()
        }
      else{
        alert('学校名错误')
      }
      }
      else{
        next()
      }
      }
    },

组件内守卫

组件内守卫包含进入守卫和离开守卫
进入守卫的to与离开守卫的from相同

  • 1.进入守卫:通过路由规则,进入该组件时被调用*
beforeRouteEnter(to,from,next){
  if(to.meta.isAuth){
            if(localStorage.getItem('school') === '北京大学'){
              next()
            }
          else{
            alert('学校名错误')
          }
          }
          else{
            next()
          }
},
  • 离开守卫: 通过路由规则,离开该组件时被调用*
beforeRouteLeave(to,from,next){
  next()
}

路由器的两种工作模式

1.hash模式:
1.对于一个url来说,什么是hash值?涉及#后面的内容就是hash值
2.hash值不会包含在http请求中,即hash不会带给服务器
3.hash模式: 地址中永远带着#号,不美观 若以后将地址通过第三方收集app分享,若app校验严格,则地址会被标记为不合法 兼容性好

2.history模式

   1.地址干净,美观
   2.兼容性与hash相比略差
   3. 应用部署上线需要后端人员支持,解决刷新页面服务端404的问题

总结

1.Vue路由是Vue.js官方提供的一种前端路由管理方式,它可以实现单页应用(SPA)的页面跳转和组件切换,提供了一种优雅的方式来管理应用的URL。

2.路由的基本概念:路由是指根据不同的URL路径,展示不同的内容或组件。在Vue中,可以通过Vue Router来实现路由功能。

3.安装和配置Vue Router:首先需要通过npm安装Vue Router,然后在Vue项目中引入并使用Vue Router。配置包括定义路由规则、设置默认路由、配置路由参数等。

4.路由的基本使用:在Vue Router中,可以使用<router-link>组件来生成链接,使用<router-view>组件来展示对应的组件内容。通过配置路由规则,可以实现不同路径对应不同的组件。

5.动态路由:动态路由是指根据不同的参数生成不同的路由。在Vue Router中,可以通过在路由路径中使用冒号(:)来定义动态参数,并在组件中通过$route.params来获取参数值。

6.嵌套路由:嵌套路由是指在一个组件中嵌套另一个组件,并且这两个组件都有自己的路由。在Vue Router中,可以通过配置子路由来实现嵌套路由。

7.路由导航守卫:路由导航守卫可以在路由切换前后执行一些逻辑。Vue Router提供了多种导航守卫,包括全局前置守卫、全局后置守卫、路由独享守卫等。

标签:vue,title,component,守卫,详解,组件,router,路由
From: https://blog.csdn.net/m0_64081601/article/details/137119550

相关文章

  • 数字化运营策略大揭秘:畅销书《数字化运营》详解
    简介数字化转型已经成为大势所趋,各行各业正朝着数字化方向转型,利用数字化转型方法论和前沿科学技术实现降本、提质、增效,从而提升竞争力。数字化转型是一项长期工作,包含的要素非常丰富,如数字化转型顶层设计、组织架构设计、领军人的数字化思想转型、前沿科技的应用、业务......
  • Vite + Vue3 项目的创建 ,启动 ,停止
    第一步:使用命令行创建工程在磁盘的合适位置上,创建一个空目录用于存储多个前端项目用vscode打开该目录在vocode中打开命令行运行如下命令npmcreatevite@latest第一次使用vite时会提示下载vite,输入y回车即可,下次使用vite就不会出现了注意:选择vue+JavaScript选项即可......
  • ICMP协议详解
    一、引言在互联网的复杂网络体系中,数据包的顺利传输是通信的基础。互联网控制消息协议(ICMP)作为一种关键的网络层协议,对于确保数据包的正确传输和网络的稳定性起着至关重要的作用。ICMP是IP协议的一个重要补充,它定义在RFC792中。ICMP使得网络设备能够报告错误信息和进行网......
  • Django路由
    Router介绍在实际开发过程中,一个Django项目会包含很多的app,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个app里,创建各自的urls.py路由模块,然后从根路由出发,将app所属的url请求,全部转发到相应的us.py模块中。而这个从主路由转发到各个应用路由的过......
  • 【QA】MySQL多表查询详解
    文章目录前言关系型数据库中数据表之间的关系数据准备数据内容表间关系基础查询|全部查询多表查询分类1|连接查询内连接外连接|左外连接外连接|右外连接自连接|自连接自连接|联合查询分类2|子查询返回结果分类|标量子查询返回结果分类|列子查询返回......
  • 数据下钻--vue+springboot+echarts
    今天下午整了下数据下钻直接上成果: 然后左边可以选范围:左边调范围,然后对应的会显示那些省份满足条件。 然后就是鼠标悬停在某个省份,就显示相应数量: 然后可以点击对应省份进行下钻到市然后可以继续下钻到县:  同样的呢,市和县都可以向省一样那样显示范围和调试: ......
  • C语言----预处理(详解)
         好了书接上回。我在讲编译与链接的时候写过宏和条件建议。我说会在下一篇博客中讲解,那么来了。今天我们来详细的讲讲预处理。宏与条件编译也在其中,那么我们现在就来好好会会这个预处理吧。预定义符号    关于预定义符号,我暂时只知道几个。并且我知道的......
  • 基于ssm+vue.js的酒店预约及管理系统附带文章和源代码设计说明文档ppt
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我成功案例代码参考数据库参考源码获取前言......
  • 基于ssm+vue.js的校园招聘系统附带文章和源代码设计说明文档ppt
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我成功案例代码参考数据库参考源码获取前言......
  • 基于ssm+vue.js的宠物医院管理系统附带文章和源代码设计说明文档ppt
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我成功案例代码参考数据库参考源码获取前言......