【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.mzph.cn/web/53178.shtml

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

相关文章

【自动驾驶】控制算法(九)深度解析车辆纵向控制 | 从算法基础到 Carsim 仿真实践

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

计算机网络33——文件系统

1、chmod 2、chown 需要有root权限 3、link 链接 4、unlink 创建临时文件&#xff0c;用于非正常退出 5、vi vi可以打开文件夹 ../是向外一个文件夹 6、ls ls 可以加很多路径&#xff0c;路径可以是文件夹&#xff0c;也可以是文件 ---------------------------------…

python植物大战僵尸项目源码【免费】

植物大战僵尸是一款经典的塔防游戏&#xff0c;玩家通过种植各种植物来抵御僵尸的进攻。 源码下载地址&#xff1a; 植物大战僵尸项目源码 提取码: 8muq

Broadcast:Android中实现组件及进程间通信

目录 一&#xff0c;Broadcast和BroadcastReceiver 1&#xff0c;简介 2&#xff0c;广播使用 二&#xff0c;静态注册和动态注册 三&#xff0c;无序广播和有序广播 1&#xff0c;有序广播的使用 2&#xff0c;有序广播的截断 3&#xff0c;有序广播的信息传递 四&am…

基于Python flask的淘宝商品数据分析可视化系统,包括大屏和主题分析,还有回归预测

背景介绍 随着电子商务的迅猛发展&#xff0c;平台上积累了大量的用户行为和商品交易数据。这些数据蕴含着极大的商业价值&#xff0c;可以为市场趋势预测、商品优化以及用户行为分析提供重要的参考。淘宝作为全球最大的在线购物平台之一&#xff0c;拥有海量的商品和用户数据…

文件操作

1.文件的打开和关闭 文件在读写之前应该先打开文件&#xff0c;在使用结束之后应该关闭文件。 在编写程序的时候&#xff0c;在打开文件的同时&#xff0c;都会返回一个FILE*的指针变量指向该文件&#xff0c;也相当于建立了指针和文件的关系。ANSI C规定使用fopen函数来打开文…

DockerLinux安装DockerDocker基础

Linux软件安装 yum命令安装 通过yum命令安装软件,是直接把软件安装到Linux系统中 安装和卸载都比较麻烦,因为软件和系统是强关联的 Docker docker是一种容器技术,可以解决软件和系统强关联关系,使得软件的安装和卸载更方便,它可以将我们的应用以及依赖进行打包,制作出一个镜…

5万字讲解大模型语言高效推理研究(清华综述)

1.1背景介绍 近年来&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;受到学术界和工业界的广泛关注&#xff0c;得益于其在各种语言生成任务上的出色表现&#xff0c;大语言模型推动了各种人工智能应用&#xff08;例如ChatGPT、Copilot等&#xf…

使用Mockito进行单元测试

1、单元测试介绍 Mockito和Junit是用于单元测试的常用框架。单元测试即&#xff1a;从最小的可测试单元&#xff08;如函数、方法或类&#xff09;开始&#xff0c;确保每个单元都能按预期工作。单元测试是白盒测试的核心部分&#xff0c;它有助于发现单元内部的错误。 单元测试…

iOS 巨魔神器,Geranium 天竺葵:6大功能,个个都解决痛点

嘿&#xff0c;这是黑猫。如果你装了巨魔&#xff0c;却只知道安装第三方APP&#xff0c;那就是暴殄天物。巨魔的价值不仅是应用侧载&#xff0c;还有强大的玩机工具生态——这也是我花费大量时间&#xff0c;去制作巨魔精选IPA合集的原因。 通过巨魔商店安装的APP&#xff0c…

Qt:智能指针QScopedPointer 的使用(以及如何写一个QScopedPointer )

前言 本文讲述QScopedPointer 的使用&#xff0c;以及自己如何写一个QScopedPointer . 正文 QScopedPointer 的常用方法 以下是 QScopedPointer 的一些常用方法及其详细说明&#xff1a; 构造函数&#xff1a; QScopedPointer<T> ptr(new T);用于创建一个 QScopedPoi…

LeetCode_sql_day28(1767.寻找没有被执行的任务对)

描述&#xff1a;1767.寻找没有被执行的任务对 表&#xff1a;Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

我的创作纪念日-20240919

何尝不是一种纪念。 话说&#xff0c;毕业之后和大学同学去深圳&#xff0c;后面回家考编制&#xff0c;现在在家里的中国邮政的代理金融网点上班。

【开放词汇检测】基于MMDetection的MM-Grounding-DINO实战

文章目录 摘要安装基础环境新建虚拟环境安装pytorch安装openmim、mmengine、mmcv安装 MMDetection验证安装配置OV-DINO环境 MMDetection的MM-Grounding-DINO详细介绍测试结果Zero-Shot COCO 结果与模型Zero-Shot LVIS ResultsZero-Shot ODinW&#xff08;野生环境下的目标检测&…

element-plus的菜单组件el-menu

菜单是几乎是每个管理系统的软件系统中不可或缺的&#xff0c;element-plus提供的菜单组件可以快速完成大部分的菜单的需求开发&#xff0c; 该组件内置和vue-router的集成&#xff0c;使用起来很方便。 主要组件如下 el-menu 顶级菜单组件 主要属性 mode:决定菜单的展示模式…

记录一下gitlab社区版的安装教程

目录 1.更新系统软件包 2.安装必要的依赖 3.添加GitLab源 3.1对于GitLab Enterprise Edition&#xff08;EE&#xff09;&#xff1a; 3.2对于GitLab Community Edition&#xff08;CE&#xff09;&#xff1a; 4.安装GitLab 4.1安装GitLab Enterprise Edition&#xff08;…

快人一步迅为LPDDR5版本瑞芯微RK3588核心板升级了

性能强--iTOP-3588开发板采用瑞芯微RK3588处理器&#xff0c;是全新一代ALoT高端应用芯片&#xff0c;采用8nm LP制程&#xff0c;搭载八核64位CPU&#xff0c;四核Cortex-A76和四核Cortex-A55架构&#xff0c;主频高达2.4GHZ&#xff0c;8GB内存&#xff0c;32GB EMMC。四核心…

PHP全程可视化防伪溯源一体化管理系统小程序源码

全程可视化&#xff0c;防伪溯源新篇章 —— 揭秘一体化管理系统的力量 &#x1f50d; 开篇&#xff1a;透视未来&#xff0c;从源头到终端的安心之旅 在这个信息透明化时代&#xff0c;每一件商品都承载着消费者的信任与期待。而“全程可视化防伪溯源一体化管理系统”&#x…

CleanClip for Mac 剪切板 粘贴工具 历史记录 安装(保姆级教程,新手小白轻松上手)

CleanClip&#xff1a;革新macOS剪贴板管理体验 目录 功能概览 多格式历史记录保存智能搜索功能快速复制操作拖拽功能 安装指南 前期准备安装步骤 配置与使用 功能概览 多格式历史记录保存 CleanClip支持保存文本、图片、文件等多种格式的复制历史记录&#xff0c;为用户提…

GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions

GIS OGC之WMTS地图服务&#xff0c;通过Capabilities XML描述文档&#xff0c;获取matrixIds&#xff0c;origin&#xff0c;计算resolutions 需求&#xff1a;如何根据WMTS服务的Capabilities描述文档得到&#xff0c;openlayers调用wmts服务时的matrixIds&#xff0c;origin…