Vue-Router路由系统

news2024/11/26 18:30:40

Vue-Router路由系统

  • 一、Vue路由简介和基础使用
    • 1.1 路由是什么
    • 1.2 为何使用路由
    • 1.3 Vue中如何实现路由
    • 1.4 组件分类
    • 1.5 vue-router路由系统使用
  • 二、声明式导航
    • 2.1 什么是声明式导航
    • 2.2 声明式导航跳转传参
  • 三、重定向和模式设置
    • 3.1 重定向
    • 3.2 找不到路径提示404页面
    • 3.3 路由模式设置
  • 四、编程式导航
    • 4.1 编程式导航-基础使用
    • 4.2 编程式导航 -跳转传参
  • 五、嵌套和守卫
    • 5.1 路由嵌套
    • 5.2 声明式导航 – 类名区别
    • 5.3 全局前置守卫

一、Vue路由简介和基础使用

1.1 路由是什么

映射关系

  • node.js中的路由 接口和服务器的映射关系
  • Vue中的路由 路径和组件的映射关系

在这里插入图片描述

1.2 为何使用路由

单页面应用(SPA):所有功能都在一个html页面上实现

前端路由的作用:实现业务场景的切换

  • 优点
    • 整体不刷新页面,用户体验更好
    • 数据传递容易, 开发效率高
  • 缺点
    • 开发成本高(需要学习专门知识)
    • 首次加载会比较慢一点。不利于seo

1.3 Vue中如何实现路由

借助 vue-router(本质上是一个第三方包)

  • 官网 https://router.vuejs.org/zh/

在这里插入图片描述

1.4 组件分类

.vue文件分2类, 一个是页面组件, 一个是复用组件

在这里插入图片描述
在这里插入图片描述

1.5 vue-router路由系统使用

步骤 (一切都要以url上hash值为准)

  • 1.下载vue-router模块到当前工程
yarn add vue-router@3.5.3    (下载旧版本匹配vue2)
  • 2.在main.js中引入VueRouter函数
import VueRouter from 'vue-router
  • 3.添加到Vue.use()身上 – 注册全局RouterLink和RouterView组件
Vue.use(VueRouter)
  • 4.创建路由规则数组 – 路径和组件名对应关系
const routes = [
  {
    path: "/", // 默认hash值路径
    redirect: "/find" // 重定向到/find
    // 浏览器url中#后的路径被改变成/find-重新匹配规则
  },
  {
    path: "/find",
    name: "Find",
    component: Find,
  },
  {
    path: "/my",
    name: "My",
    component: My
  },
  {
    path: "/part",
    name: "Part",
    component: Part
  },
  {
    path: "/part/:username", // 有:的路径代表要接收具体的值
    component: Part
  },
  // 404在最后(规则是从前往后逐个比较path)
  {
    path: "*",
    component: NotFound
  }
]
  • 5.用规则生成路由对象
const router = new VueRouter({
  routes,// routes是固定key(传入规则数组)
  // mode: "history" // 默认不写是"hash"
})
  • 6.把路由对象注入到new Vue实例中
// 6. 路由对象注入到vue实例中, this可以访问$route和$router
new Vue({
  router,
  render: h => h(App),
}).$mount('#app')
  • 7.用router-view作为挂载点, 切换不同的路由页面
<div class="footer_wrap">
      <a href="#/find">发现音乐</a>
      <a href="#/my">我的音乐</a>
      <a href="#/part">朋友</a>
    </div>
<div class="top">
    <!-- 7. 设置挂载点-当url的hash值路径切换, 显示规则里对应的组件到这 -->
    <router-view></router-view>
  </div>

main.js中完整代码

import Vue from 'vue'
import App from './App.vue'
import Find from '@/views/Find' // @是src的绝对地址
import My from '@/views/My'
import Part from '@/views/Part'
import NotFound from '@/views/NotFound'
// 目标: vue-router基础使用
// 1. 下载vue-router  (yarn add vue-router)
// 2. 引入
import VueRouter from 'vue-router'
// 3. 注册全局组件
Vue.use(VueRouter)
// 4. 规则数组
const routes = [
  {
    path: "/", // 默认hash值路径
    redirect: "/find" // 重定向到/find
    // 浏览器url中#后的路径被改变成/find-重新匹配规则
  },
  {
    path: "/find",
    name: "Find",
    component: Find,
  },
  {
    path: "/my",
    name: "My",
    component: My
  },
  {
    path: "/part",
    name: "Part",
    component: Part
  },
  {
    path: "/part/:username", // 有:的路径代表要接收具体的值
    component: Part
  },
  // 404在最后(规则是从前往后逐个比较path)
  {
    path: "*",
    component: NotFound
  }
]
// 5. 生成路由对象
const router = new VueRouter({
  routes,// routes是固定key(传入规则数组)
  // mode: "history" // 默认不写是"hash"
})

Vue.config.productionTip = false

// 6. 路由对象注入到vue实例中, this可以访问$route和$router
new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

规则如何生效

  • 切换url上hash值, 开始匹配规则, 对应组件展示到 router-view位置

二、声明式导航

2.1 什么是声明式导航

可以最简单的实现导航选中高亮效果

可用组件router-link来替代a标签

在这里插入图片描述

<template>
  <div>
    <div class="footer_wrap">
      <router-link to="/find">发现音乐</router-link>
      <router-link to="/my">我的音乐</router-link>
      <router-link to="/part">朋友</router-link>
    </div>
    <div class="top">
      <router-view></router-view>
    </div>
  </div>
</template>

<script>
// 目标: 声明式导航 - 基础使用
// 本质: vue-router提供的全局组件 "router-link"替代a标签
// 1. router-link 替代a标签
// 2. to属性      替代href属性
// 好处: router-link自带高亮的类名(激活时类名)
// 3. 对激活的类名做出样式的编写
export default {};
</script>

<style scoped>

2.2 声明式导航跳转传参

在跳转路由时, 可以给路由对应的组件内传值

在这里插入图片描述

方法一 ( $route.query)

  • 1.在router-link上的to属性传值 /path?参数名=值
 <router-link to="/part?name=小传">朋友-小传</router-link>
  • 2.对应页面组件接收传递过来的值 $route.query.参数名
 <p>人名: {{ $route.query.name }}  </p>

方法二 ($route.params)

  • 1./path/值 – 需要路由对象(main.js)提前配置 path: “/path/参数名”
//main.js文件
 {
    path: "/part/:username", // 有:的路径代表要接收具体的值
    component: Part
  },
<router-link to="/part/小智">朋友-小智</router-link>
  • 2.对应页面组件接收传递过来的值 $route.params.参数名
 <p>人名{{ $route.params.username }}</p>

三、重定向和模式设置

3.1 重定向

网页第一次打开没有默认页面

匹配path后, 强制跳转path路径

  • 网页打开url默认hash值是/路径
  • redirect是设置要重定向到哪个路由路径
{
    path: '/',//匹配默认hash值路径
    redirect: '/find',//重定向到find  浏览器url中#后的路径被改变成/find-重新匹配规则
  },

3.2 找不到路径提示404页面

路由最后, path匹配*(任意路径) – 前面不匹配就命中最后这个

//引入组件
import NotFound from '@/views/NotFound'

// 404必须在最后(规则是从前到后逐个比较)
//规则数组
const routes =[
	....
  {
    path: '*',
    component: NotFound
  }
 ]

3.3 路由模式设置

修改路由在地址栏的模式

  • hash路由例如: http://localhost:8080/#/home
  • history路由例如: http://localhost:8080/home (以后上线需要服务器端支持, 否则找的是文件夹)
const router = new VueRouter({
  //routes时固定的key(传入规则数组)
  routes: routes,
  // mode: 'history',//默认不写是hash值
})

四、编程式导航

4.1 编程式导航-基础使用

用JS代码来进行跳转

  • 语法: path或者name任选一个

在这里插入图片描述

html代码

 <div class="footer_wrap">
      <span @click="btn('/find', 'Find')">发现音乐</span>
      <span @click="btn('/my', 'My')">我的音乐</span>
      <span @click="btn('/part', 'Part')">朋友-Gik</span>
    </div>
    <div class="top">
      <!-- 7.设置挂载点-当url的hash值路径切换,显示规则里对应的组件到这 -->
      <router-view></router-view>
    </div>

方式一 path跳转

//目标:编程式导航 js方式跳转路由
//语法
//this.$router.push({path:'路由路径'})
//this.$router.push({name:'路由名'})
//场景  方便修改:name路由名(name路由名在页面看不到)
//path看得到
	btn(targetPath, targetName) {
      //方式1 path跳转
      this.$router.push({
         path: targetPath
       }, () => { }, () => { })
    }

方式二 name跳转

btn(targetPath, targetName) {
  //方式二 name跳转 (url地址的hash值还是切换path路劲的值)
  this.$router.push({
    name: targetName
  })
}

4.2 编程式导航 -跳转传参

JS跳转路由, 传参

  • query传, $route.query接
  • params传, $route.params接

在这里插入图片描述

 <template>
    <div>
      <div class="footer_wrap">
        <span @click="onebtn()">朋友-Gik</span>
        <span @click="twobtn()">朋友-99</span>
      </div>
      <div class="top">
        <router-view></router-view>
      </div>
    </div>
  </template>

  <script>
  //目标 编程式导航的 跳转路由传参
  //方式一:
  // params=>$router.params.参数名
  //方式二
  //params=>$router.query.参数名
  //重要 使用path会自动忽略params
  //推荐name+query方式传参
  //注意:如果当前url上的hash值和参数 与 你要跳转的hash值和?参数一致   
  //爆出冗余导航的问题,不会跳转路由
  export default {
    methods: {
      onebtn() {
        this.$router.push({
          name: 'Part',
          params: {
            username: 'params传值'
          }
        }, () => { }, () => { })
      },
      twobtn() {
        this.$router.push({
          name: 'Part',
          query: {
            name: 'query传值'
          }
        })
      }
    }
  };
  </script>

五、嵌套和守卫

5.1 路由嵌套

在现有的一级路由下, 再嵌套二级路由

在这里插入图片描述
在这里插入图片描述

<div>
    <div class="nav_main">
        <router-link to="/find/recommend">推荐</router-link>
        <router-link to="/find/ranking">排行榜</router-link>
        <router-link to="/find/songlist">歌单</router-link>
    </div>

    <div style="1px solid red;">
        <router-view></router-view>
    </div>
</div>
import Vue from 'vue'
import App from './App.vue'
import Find from '@/views/Find' //@时src的绝对地址
import My from '@/views/My'
import Part from '@/views/Part'
import NotFound from '@/views/NotFound'
import Ranking from '@/views/Second/Ranking'
import Recommend from '@/views/Second/Recommend'
import SongList from '@/views/Second/SongList'

//目标 vue-router基础使用
//1.下载vue-router (yarn add vue-router)
//2.引入
import VueRouter from 'vue-router'
//3.注册全局组件
Vue.use(VueRouter)
//4.规则数组 
const routes = [
  {
    path: '/',//匹配默认hash值路径
    redirect: '/find',//重定向到find  浏览器url中#后的路径被改变成/find-重新匹配规则
  },
  {
    path: '/find',
    name: 'Find',
    component: Find,
    children: [
      {
        path: 'ranking',
        component: Ranking,
      },
      {
        path: 'recommend',
        component: Recommend,
      },
      {
        path: 'songlist',
        component: SongList
      }
    ]
  },
  {
    path: '/my',
    name: 'My',
    component: My
  },
  {
    path: '/part',
    name: 'Part',
    component: Part
  },
  {
    path: '/part/:username/:id', //有:的路径代表要接收具体的值
    component: Part
  },
  // 404必须在最后(规则是从前到后逐个比较)

  {
    path: '*',
    component: NotFound
  }
]
//5.生成路由对象
const router = new VueRouter({
  //routes时固定的key(传入规则数组)
  routes: routes,
  // mode: 'history',//默认不写是hash值
})
Vue.config.productionTip = false
//6.路由对象注入到vue实例中 this可以访问$route 和 $router
new Vue({
  router: router,
  render: h => h(App),
}).$mount('#app')

5.2 声明式导航 – 类名区别

在这里插入图片描述

区别

  • 1.url上的hash值(#/home/recommend) 包含导航的href值(#/home)--当前a就有'router-link-active'(模糊)
  • 2.url上的hash值(#/home/recommend) 等于导航的href值(#/home/recommend)--当前a就有'router-link-exact-active'(精确)

5.3 全局前置守卫

路由跳转之前, 会触发一个函数(未登录不跳转)

  • 语法: router.beforeEach((to, from, next) =>{})
    • 一定next(),才会跳转下一页

main.js 代码

//目标:路由守卫
//场景:当你要对路由权限判断时
//语法:router.beforeEach((to,from,next)=>{
// 路由跳转之前先执行这里   决定是否跳转
// })
//参数1  要跳转到的路由对象信息(目标)
//参数2 从哪里跳转的路由对象信息(来源)
//参数3 函数体-next()才会让路由正常跳转切换
//next(false)原地停留
//next('强制修改到另一个路由路径上')
//注意:如果不调用next(),页面停留在原地

//例子:判断是否登录
const isLogin = true;
router.beforeEach((to, from, next) => {
  console.log(to);
  console.log(from);
  console.log(next);
  if (to.path === '/my' && isLogin === false) {
    alert('请登录')
    next(false) //阻止跳转
  } else {
    next()
  }
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/393368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单线激光雷达(SICK)驱动安装及时空标定

一、引言 1、AGV需要同时具备定位、避障与导航的功能&#xff0c;其中避障对于雷达本身的分辨率、精度要求并不是很高&#xff0c;只需要能够根据预设定的雷达扫描范围准确避开障碍物即可&#xff0c;故本文以TIM240&#xff08;SICK激光类雷达&#xff09;为例介绍实现多雷达…

Canal实战 canal的坑 CanalParseException: column size is not match for table 错误

时序表结构方案设计 异常现象截图 canal的坑&#xff1a;CanalParseException: column size is not match for table (表结构缓存异常阻塞问题) 背景 早期的canal版本(<1.0.24)&#xff0c;在处理表结构的DDL变更时采用了一种简单的策略&#xff0c;在内存里维护了一个当…

Django实践-04静态资源和Ajax请求

文章目录Django实践-04静态资源和Ajax请求Django实践-04静态资源配置创建静态资源目录修改settings.py文件Django实践-04用Ajax实现投票功能修改项目的urls.py文件修改polls/views.py文件修改显示老师信息的模板页&#xff0c;引入jQuery库来实现事件处理、Ajax请求和DOM操作。…

AUTOSAR知识点Com(三):CanIf发送

1、概述 CanIf的发送请求函数CanIf_Transmit()是上层模块传输L-PDU的通用接口。上层通信层模块需要通过CanIf的服务启动传输&#xff0c;无法直接访问CanDrv。如果CanDrv能够将L-PDU数据写入CAN硬件传输对象中&#xff0c;则发起的传输请求成功完成。上层模块使用API服务CanIf_…

https介绍

目录 一.简介 1.1定义 1.2补充知识 1.2.1 对称加密与非对称加密 1.2.2. 数据摘要 && 数据指纹 二.HTTPS 的⼯作过程探究 2.1只使⽤对称加密 2.2只使用非对称加密 2.3非对称加密与对称加密 2.4中间人攻击 三.证书 3.1CA认证 3.2数据签名 3.3 ⾮对称加密 …

电池保护板 - 问题归纳

电池保护板 - 问题归纳简介充电锂电池磷酸铁锂电池放电总结最近更新日期&#xff1a;2023-03-07简介 电池充放电过程中&#xff0c;如果电压、电流或温度等参数不稳定或超出电池的安全范围&#xff0c;就会对电池造成损害&#xff0c;甚至可能引发安全事故。为了保护电池的安全…

融云入选中国信通院《高质量数字化转型产品及服务全景图》

企业数字化转型正在进入“深水区”。 3 月 3 日&#xff0c;“中国信息通信研究院&#xff08;以下简称中国信通院&#xff09;高质量数字化转型创新发展大会暨中国信通院‘铸基计划’年度峰会”在京召开&#xff0c;深度展示了中国信通院在数字化转型领域的工作成果&#xff…

计算机专业毕业设计基于Spring Boot 学生在线考试系统

目录 一、学生端 1.1 登录 1.2 注册 1.3 学生首页 1.4 学生查看任务中心的试卷&#xff08;已答卷/未答卷&#xff09; 1.5 学生查看固定试卷以及开始做题 1.6 学生查看时段试卷以及开始做题 1.7 学生查看试卷中心 1.8 学生查看考试记录以及查看试卷 1.9 学生查看…

HTTP与HTTPS协议的嵌套访问

概述 HTTP和HTTPS是两种不同的协议。HTTP使用80端口&#xff0c;而HTTPS使用443端口。HTTP是明文传输&#xff0c;而HTTPS为了保障数据传输的安全性&#xff0c;通过SSL证书实现加密传输。 分析 问题1&#xff1a;HTTP和HTTPS可以互相访问吗&#xff1f; 可以互相访问&#…

端口复用(bind error: Address already in use 问题)

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 端口复用专栏&#xff1a;《Linux从小白到大神》《网络编程》 在前面讲解TCP状态转换中提到过一个2MSL…

非栈上的格式化字符串利用例题讲解

题目自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1te_oc3GuWTlDDS5q-NhtKQ?pwdcjz9 提取码&#xff1a;cjz9 开始&#xff1a; 一个非常明显的格式化字符串漏洞&#xff0c;但是值得注意的是&#xff0c;此时的buf变量不在栈上&#xff0c;因此我们之前把pr…

SpringBoot 项目中集成 Prometheus 和 Grafana

项目上线后&#xff0c;除了能保障正常运行以外&#xff0c;也需要服务运行的各个指标进行监控&#xff0c;例如 服务器CPU、内存使用占比&#xff0c;Full GC 执行时间等&#xff0c;针对一些指标出现异常&#xff0c;可以加入一些报警机制能及时反馈给开发运维。这样&#xf…

如何打造一个高品质的酒店品牌形象?VR全景营销是关键!

数字化改革早已不是新鲜“字眼”&#xff0c;酒店行业作为竞争激烈的红海市场&#xff0c;运用“数字化”升级改造成为宣传推广的重点方向之一。VR全景酒店&#xff0c;运用沉浸式全景展示&#xff0c;使其在竞争激烈的酒店行业中进行差异化竞争&#xff0c;使消费者在线上全面…

SpringCloud:统一网关Gateway

目录 1、网关介绍 2、搭建网关服务 3、路由断言工厂 4、路由过滤器 5、全局过滤器GlobalFilter 6、过滤器执行顺序 7、跨域问题处理 1、网关介绍 网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连&#xff0c;是复杂的网络互 连设备&#xff0…

Spark SQL快速入门

在spark上运用SQL处理结构化数据 1、SparkSQL快速入门 1.1 什么是SparkSQL SparkSQL 是Spark的一个模块&#xff0c;用于处理海量结构化数据 限定&#xff1a;结构化数据 1.2 为什么学习SparkSQL SparkSQL是非常成熟的&#xff0c;海量结构化数据处理框架 学习SparkSQL主要…

动态代理—Java

代理可以理解为请一个中间人帮忙处理一些事情。代理支持任意接口类型的实现类对象做代理&#xff0c;也可以直接为接本身做代理。可以为被代理对象的所有方法做代理。可以在不改变方法源码的情况下&#xff0c;实现对方法功能的增强。简化了编程工作、提高了软件系统的可扩展性…

QT入门Display Widgets之QLine、QLcdNumber、QTextBrowser

目录 一、QLine界面相关 1、布局介绍 2、界面基本属性 二、QLCDNumber的介绍 1、界面布局 2、定时器代码测试 三、QTextBrowser 此文为作者原创&#xff0c;创作不易&#xff0c;转载请标明出处&#xff01; 一、QLine界面相关 1、布局介绍 先看下界面中创建个Q…

递归(java)

1.递归应用场景 看个实际应用场景&#xff0c;迷宫问题(回溯)&#xff0c; 递归(Recursion) 2.递归的概念 简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 3.递归调用机制 我列举两个小案例,来帮助大家…

Stream——数字类型的字符串排序

文章目录前言什么是数字类型的字符串一个简单的坑demo拯救坑代码对象集合中的数字类型排序(有坑)对象集合中的数字类型排序 解决扩展将数字类型字符串数组转换为Integer集合总结前言 想到给数据进行排序&#xff0c;一开始头脑中想到的就是sorted()&#xff0c;本篇文章重点说…

SSL安全证书有什么优缺点?

在将SSL实施到您的站点之前&#xff0c;了解SSL的优点和缺点非常重要。下面就给大家分析下安装SSL证书有什么优缺点&#xff1a;优点&#xff1a;1. 加密信息确保您在线发送的数据只被指定的接收者读取&#xff0c;而不被其他人读取。SSL对原始数据进行了一些更改&#xff0c;因…