【Vue】VueRouter路由

系列文章目录

第七章 VueRouter路由


文章目录

  • 系列文章目录
  • 第一节:VueRouter基础
    • 一、安装:
    • 二、基本使用:
      • 1. 创建路由代码:Single Page Application:SPA
      • 2. 使用路由
      • 3. 展示路由:
    • 二、嵌套路由
    • 三、路由传参
      • 1. 路由指定参数
      • 2. 查询字符串传参
    • 四、编程式导航
      • 1. router.push跳转:
      • 2. router.replace替换
  • 第二节:VueRouter进阶
    • 一、导航守卫
      • 1. 全局守卫:
      • 2. 组件内导航守卫:
      • 3. 路由导航守卫:
  • 二、路由元信息


第一节:VueRouter基础

在网页中,经常需要发生页面更新或者跳转。这时候我们就可以使用Vue-Router来帮我们实现。Vue-Router是用来做路由的,也就是定义url规则与具体的View映射的关系。可以在一个单页面中实现数据的更新。

一、安装:

通过命令:npm install vue-router@4.3.0 --save ,或者在创建项目的时候,选择添加Vue-Router的支持。

二、基本使用:

1. 创建路由代码:Single Page Application:SPA

在src/router/index.js中,填入以下代码:

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',name: 'home',component: HomeView},{path: '/about',name: 'about',component: () => import('../views/AboutView.vue')}]
})export default router

以上代码解释如下:

  1. 使用createRouter创建路由对象。
  2. 路由工作模式,有两种工作模式:
  • history模式:路由中不包含#,更加美观,但是在后期部署后,如果前端项目代码和后端项目代码部署在同一个域名下,则容易产生路由混淆(前端路由和后端路由混淆在一起了)。以上代码用的是history模式,代码为:
const router = createRouter({history:createWebHistory(), //history模式
})
  • hash模式:路由中包含#,不太美观,对SEO优化不够友好。好处是兼容性更好,即使前端代码和后端代码部署在同一个域名下,也不会产生路由混淆。使用hash模式的代码为:
const router = createRouter({history:createWebHashHistory(), //hash模式
})
  1. routes是一个数组,里面是对象数据,每个对象中的属性作用分别如下:
  • path:该路由对应的path。
  • component:组件对象,既可以先导入,也可以指定组件的时候使用import语句来导入。
  • name:路由名称,后期在做路由反转的时候可以使用。

2. 使用路由

然后在main.js文件中对router进行使用:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'const app = createApp(App)app.use(router)app.mount('#app')

以上相关代码解释如下:
从src/router/index.js中导入router对象。
执行app.use(router)代码,即可使用此路由了。

3. 展示路由:

在App.vue中的代码如下:

<script setup>
import { RouterLink, RouterView } from 'vue-router'
</script><template><header><div class="wrapper"><nav><RouterLink to="/">Home</RouterLink><RouterLink to="/about">About</RouterLink></nav></div></header><RouterView />
</template>

以上相关代码解释如下:
在模板中,使用RouterLink定义路由链接,此组件有点类似html中的a标签,在点击后会跳转到to属性指定的路由上去。to除了直接写path外,还可以通过name来定义,比如:

<RouterLink :to="{name: 'home'}">Home</RouterLink>

使用RouterView标识路由出口,在进入路由A后,路由A所对应的组件会显示在RouterView的地方。

二、嵌套路由

在某个页面中,如果还需要通过路由更新局部模块,那么可以通过嵌套路由来实现,只要配置children就可以了。

  1. src/router/index.js代码如下:
const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',name: 'home',component: HomeView},{path: '/news',component: () => import('../views/news/NewsView.vue'),name: 'news',children: [{path: 'detail', name: 'news-detail', component: import('../views/news/NewsDetailView.vue')}]},{path: '/about',name: 'about',component: () => import('../views/AboutView.vue')}]
})
  1. src/views/news/NewsView.vue代码如下:
<template>
<ul><li><RouterLink :to="{name: 'news-detail'}">新闻1</RouterLink></li><li>新闻2</li><li>新闻3</li>
</ul>
<RouterView></RouterView>
</template>
  1. src/views/news/NewsDetailView.vue代码如下:
<template>
<h1>AIGC将迎来爆发式增长!</h1>
</template>

三、路由传参

路由传参有两种方式,一种是在定义路由的时候指定参数,另一种是通过查询字符串的方式传参。

1. 路由指定参数

src/router/index.js代码如下:

const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [path: '/news',component: () => import('../views/news/NewsView.vue'),name: 'news',children: [{path: 'detail/:pk',name: 'news-detail',component: import('../views/news/NewsDetailView.vue')}]}]
})

在使用这个路由的时候,其代码如下:

<RouterLink :to="{name: 'news-detail', params: {pk: 1}}">新闻1</RouterLink>

以后在NewsDetailView.vue的onMounted生命周期函数中可以通过以下方式获取到参数:

<script setup name="NewsDetailView">import { onMounted } from 'vue';import { useRoute } from 'vue-router';const route = useRoute();onMounted(() => {const pk = route.params.pk;console.log(pk);})
</script>

2. 查询字符串传参

使用查询字符串传参,不需要预先在路由定义的时候指定参数,使用的时候直接传递即可,示例代码如下:/news/detail?pk=1&page=2

<RouterLink :to="{name: 'news', query: {page: 1}}">News</RouterLink>

以后在NewsView.vue组件中的onMounted生命周期函数中通过以下代码即可获取到:

四、编程式导航

之前我们学习了使用可以在用户点击的情况下进行页面更新。但有时候我们想要在js中手动的修改页面的跳转,这时候就需要使用编程式导航了。

1. router.push跳转:

想要导航到不同的URL,则使用router.push方法。这个方法会向history栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的URL。
当你点击时,这个方法会在内部调用,所以说,点击等同于调用router.push(…)。
示例代码如下:

<script setup>import {useRouter} from "vue-router";const router = useRouter();// 字符串路径router.push('/users/eduardo')// 带有路径的对象router.push({ path: '/users/eduardo' })// 命名的路由,并加上参数,让路由建立 urlrouter.push({ name: 'user', params: { username: 'eduardo' } })// 带查询参数,结果是 /register?plan=privaterouter.push({ path: '/register', query: { plan: 'private' } })// 带 hash,结果是 /about#teamrouter.push({ path: '/about', hash: '#team' })
</script>

注意:如果提供了 path,params 会被忽略,上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path :

const username = 'eduardo'
// 我们可以手动建立 url,但我们必须自己处理编码
router.push(`/user/${username}`) // -> /user/eduardo
// 同样
router.push({ path: `/user/${username}` }) // -> /user/eduardo
// 如果可能的话,使用 `name` 和 `params` 从自动 URL 编码中获益
router.push({ name: 'user', params: { username } }) // -> /user/eduardo
// `params` 不能与 `path` 一起使用
router.push({ path: '/user', params: { username } }) // -> /user

2. router.replace替换

它的作用类似于 router.push,唯一不同的是,它在导航时不会向 history 添加新记录,正如它的名字所暗示的那样——它取代了当前的条目。
也可以直接在传递给 router.push 的 to 参数中增加一个属性 replace: true :

router.push({ path: '/home', replace: true })
// 相当于
router.replace({ path: '/home' })

第二节:VueRouter进阶

一、导航守卫

导航守卫分为:全局守卫、组件导航守卫以及路由导航守卫。下面分别来进行讲解。

1. 全局守卫:

全局守卫有beforeEach 和afterEach ,即在跳转前和跳转后的导航守卫。
首先看下beforeEach,示例代码如下:

router.beforeEach((to, from) => {if (// 检查用户是否已登录!isAuthenticated &&// ❗️ 避免无限重定向to.name !== 'Login') {// 将用户重定向到登录页面return { name: 'Login' }}
})

如果beforeEach的回调函数中返回的是true或者什么都没返回,则跳转到默认的路由,否则跳转到返回的路由。
afterEach导航路由为已经改变完成后的守卫。示例代码如下:

router.afterEach(function(to,from){console.log('to:',to);console.log('from:',from);
})

2. 组件内导航守卫:

组件内导航守卫只能使用以下两个方法:
onBeforeRouteLeave:在离开当前路由前调用。如果返回false,将会取消路由离开。比如:

router.afterEach(function(to,from){console.log('to:',to);console.log('from:',from);
})

onBeforeRouteUpdate:在路由发生更新时调用,比如从/user/1更新到/user/2,就会执行该守卫方法。一般这个方法用的比较少。

3. 路由导航守卫:

在定义路由的时候,可以指定beforeEnter导航守卫,示例代码如下:

const routes = [{path: '/users/:id',component: UserDetails,beforeEnter: (to, from) => {// reject the navigationreturn false},},
]

二、路由元信息

有时,你可能希望将任意信息附加到路由上,如过渡名称、谁可以访问路由等。这些事情可以通过接收属性对象的meta属性来实现,并且它可以在路由地址和导航守卫上都被访问到。定义路由的时候你可以这样配置 meta 字段:

const routes = [{path: '/posts',component: PostsLayout,children: [{path: 'new',component: PostsNew,// 只有经过身份验证的用户才能创建帖子meta: { requiresAuth: true },},{path: ':id',component: PostsDetail// 任何人都可以阅读文章meta: { requiresAuth: false },}]}
]

那么以后可以通过路由.meta 访问到元数据。示例代码如下:

router.beforeEach((to, from) => {// 而不是去检查每条路由记录// to.matched.some(record => record.meta.requiresAuth)if (to.meta.requiresAuth && !auth.isLoggedIn()) {// 此路由需要授权,请检查是否已登录// 如果没有,则重定向到登录页面return {path: '/login',// 保存我们所在的位置,以便以后再来query: { redirect: to.fullPath },}}
})

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

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

相关文章

无人机企业合法运营必备运营合格证详解

无人机企业运营合格证&#xff0c;是由国家相关航空管理部门&#xff08;如中国民用航空局或其授权机构&#xff09;颁发的&#xff0c;用于确认无人机企业具备合法、安全、高效运营无人机能力的资质证书。该证书是无人机企业开展商业运营活动的必要条件&#xff0c;标志着企业…

60V-90V降压5V2A恒压WT6039

60V-90V降压5V2A恒压WT6039 WT6039是设计用于满足宽电压输入需求的一款高效DC-DC降压转换器芯片&#xff0c;它被优化以在12V到90V的宽电压范围内操作。该器件整合了多种功能&#xff0c;包括使能开关控制、精准的参考电源提供、误差放大器、以及为安全性能考虑的过热保护、限…

CSS的三种基本选择器

使用CSS控制网页格式有行内法&#xff0c;内嵌式&#xff0c;链接式&#xff0c;导入式等方法 这里将采用内嵌式的方法书写 内嵌法就是通过<style>标记将样式定义在HTML的文件头部中 1.标记选择器 标记选择器特点&#xff1a;定义了标记选择器之后&#xff0c;网页中…

【三步搭建 本地 编程助手 codegeex】

这里写目录标题 第一步 ollama安装常见报错 第二步 下载启动模型下载启动模型常见问题 第三步配置codegeex安装插件本地配置 其他 如果可以联网&#xff0c;vscode装个codegeex插件即可&#xff0c;本次搭建的本地编程助手&#xff0c;解决因安全问题完全无网络的情况下的编程助…

如何使用ssm实现图书馆书库管理系统+vue

TOC ssm611图书馆书库管理系统vue 第1章 绪论 1.1 选题动因 到现在为止&#xff0c;互联网已经进入了千家万户&#xff0c;最普通的平民百姓也有属于自己的智能设备&#xff0c;计算机各种技术的储备也是相当的丰富&#xff0c;并且实现也是没有难度&#xff0c;各行各业&a…

fastadmin官方常见问题必看

常见问题 如果你在使用FastAdmin开发框架的过程中遇到问题,请到问答社区提问: https://ask.fastadmin.net 在FastAdmin中如何开启调试模式&#xff1f; 开启调试模式的方法有两种&#xff1a; 打开application/config.php&#xff0c;找到app_debug,将它的值置为true即可如…

babylonjs shader之菲尼尔效果

babylonjs有内置的菲涅尔效果&#xff0c;修改相应参数即可&#xff0c;但是为了学习shader&#xff0c;这里用shader实现了一个简单版的菲尼尔效果。 创建球体 const sphere MeshBuilder.CreateSphere(sphere, { segments: 128, diameter: 2 }); 创建shader材质 const sha…

CleanClip 2.2.1 激活版免费下载

CleanClip 2.2.1 激活版免费下载 免费版可以保存无限制的项目数量&#xff0c;每天可以免费享受 25 次会员权限。轻度用户够用。 CleanClip是一款运行在Mac平台上的革命性剪贴板增强工具,它彻底改变了我们使用剪贴板的方式。 这款软件适用于所有macOS应用程序,只需复制内容,按…

【JAVA开源】基于Vue和SpringBoot的企业客户管理系统

本文项目编号 T 036 &#xff0c;文末自助获取源码 \color{red}{T036&#xff0c;文末自助获取源码} T036&#xff0c;文末自助获取源码 目录 一、系统介绍1.1 管理员角色1.2 普通员工角色1.3 系统特点 二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内…

【C++11】统一列表初始化,声明,新增容器,lambda表达式

目录 一、C11简介 二、列表初始化 1.引入 2.使用 2.1 内置类型与容器 2.2 自定义类型 3.原理 三、声明 四、新增STL容器 1.array(静态数组) 2.forward_list(单链表) 五、lambda表达式 1.lambda表达式的构成与规则 2.应用 3.lambda的底层原理 一、C11简介 C11更像…

自定义leaflet弹窗

修改leaflet弹窗默认样式 1.自定义弹窗元素 //添加标记点并绑定自定义弹窗&#xff0c;弹窗元素可以封装为一个函数等灵活处理就行L.marker([lat, longti], {icon: geoIcon, // 设置icon,icon为自定义的图标}).addTo(this.map).bindPopup(<div>新定义的弹窗</div>…

全同台加密综述

文章目录 一、FHE的定义与性质1、核心算法2、性质 二、构造思想三、全同态加密研究进展1、支持部分同态的 Pre-FHE 方案2、基于理想格的 第1代 FHE方案3、基于LWE的 第2代 FHE方案3、基于近似特征向量的 第3代 FHE方案4、支持浮点数运算的 第4代 FHE方案5、其他 FHE方案5.1、基…

python爬虫初体验(一)

文章目录 1. 什么是爬虫&#xff1f;2. 为什么选择 Python&#xff1f;3. 爬虫小案例3.1 安装python3.2 安装依赖3.3 requests请求设置3.4 完整代码 4. 总结 1. 什么是爬虫&#xff1f; 爬虫&#xff08;Web Scraping&#xff09;是一种从网站自动提取数据的技术。简单来说&am…

金融业场景化实战:如何高效度量研发效能并驱动业务增长

在软件研发趋于规模化的今天&#xff0c;企业纷纷意识到效能度量的重要性。宏观经济层面的压力、企业内部研发资源有限、监管要求不断提高&#xff0c;这些都成为了企业发展过程中的挑战。特别是在金融行业&#xff0c;业务方对研发团队提出了更高的效能要求&#xff0c;希望在…

【机器学习】--- 序列建模与变分自编码器(VAE)

在机器学习领域&#xff0c;序列建模与变分自编码器&#xff08;Variational Autoencoder, VAE&#xff09; 是两个至关重要的技术&#xff0c;它们在处理时间依赖性数据与复杂数据生成任务中都发挥着关键作用。序列建模通常用于自然语言处理、语音识别等需要保持顺序关系的任务…

道路流量监测摄像机

道路流量监测摄像机 是一种结合了监控摄像技术和交通管理的先进设备&#xff0c;旨在通过实时监测和分析道路上车辆的行驶情况&#xff0c;收集交通流量数据并进行统计分析。这种摄像机在城市交通管理、道路规划、交通安全等领域有着广泛的应用前景。 在城市交通管理中&#xf…

JAVA外卖霸王餐新纪元自主发布CPS优惠小程序平台

打造外卖霸王餐新纪元&#xff0c;自主发布CPS优惠小程序平台&#x1f389;&#x1f374; &#x1f680; 开篇&#xff1a;外卖界的革新风暴 &#x1f680; 厌倦了千篇一律的外卖优惠&#xff1f;想要在外卖的世界里也能享受“霸王餐”的待遇&#xff1f;今天&#xff0c;就带…

如何安装和注册 GitLab Runner

如何安装和注册 GitLab Runner GitLab Runner 是一个用于运行 GitLab CI/CD (Continuous Integration/Continuous Deployment) 作业。它是一个与 GitLab 配合使用的应用程序&#xff0c;可以在本地或云中运行。Runner 可以执行不同类型的作业&#xff0c;例如编译代码、运行测…

HTML中直接创建一个“onoff”图形开关包括css+script

1. HTML中直接创建一个“onoff”图形开关 下面是一个完整的HTML文档示例 在HTML中直接创建一个“onoff”图形开关&#xff08;通常指的是一个类似于物理开关的UI组件&#xff0c;可以切换开或关的状态&#xff09;&#xff0c;并不直接支持&#xff0c;因为HTML主要用于内容的…

Java设计原则

面向对象经典设计原则主要包括单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则、接口隔离原则&#xff0c;文本主要从JAVA面向对象程序设计语言类的基本特性&#xff08;封装、继承、多态&#xff09;、JDK的API设计三个方面描述这些原则的基本原理。 单一职责原则 …