Day3: 前端路由(基础篇)

news2024/12/25 12:18:57

「目标」: 持续输出!每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。

「主要面向群体:」前端开发工程师(初、中、高级)、应届、转行、培训等同学

Day3-今日话题

想必大家经常会在面试中或者工作生活中听到「前端路由」相关的问题或者话题,那么今天我将从以下几个方面聊聊前端路由:

1. 前端路由是什么?

前端路由是指在单页应用(SPA)中,通过在前端管理和控制页面之间的切换和导航的机制。它允许用户在不离开当前页面的情况下浏览不同的内容,提供了更流畅、响应更快的用户体验。前端路由通过监听 URL 的变化,根据不同的路径渲染不同的视图组件,实现页面的无刷新切换。

2. 前端路由模式有哪些?

「Hash 模式」: 在 URL 中使用 # 后面的哈希部分来表示页面路径,例如

http://example.com/#/home

哈希部分的变化不会导致浏览器向服务器发送请求,适用于没有服务器支持的场景。

「History 模式」: 使用浏览器的 History API 来改变 URL 路径,不再需要使用 #,例如

http://example.com/home

这种模式需要服务器支持,但相较于 Hash 模式,URL 更友好

3. 路由守卫是什么?

路由守卫是一些钩子函数,用于在页面导航发生时执行特定的操作,例如验证用户权限、重定向、取消导航等。它们确保用户在访问页面时具有正确的权限和行为。

在 React 中,你可以使用 React-Router 提供的 Route 组件的 「render」「component」「children」 属性来实现路由守卫。通过在这些属性中编写逻辑,可以在渲染前进行验证或重定向操作。

<Route path="/profile" render={() => {
  if (userIsAuthenticated) {
    return <Profile />;
  } else {
    return <Redirect to="/login" />;
  }
}} />

<Route path="/dashboard" children={({ match }) => {
  return match ? <Dashboard /> : <Redirect to="/login" />;
}} />

在 Vue 中,你可以使用 Vue Router 提供的全局导航守卫和路由独享守卫来实现路由守卫。

vue全局导航守卫:

  1. 「beforeEach」: 在每次导航发生之前调用。这个守卫可以用来执行一些全局的权限验证、重定向或其他预处理操作。
  2. 「beforeResolve」: 在每次导航确认之前调用。和 beforeEach 类似,但在 beforeEach 之前调用。在所有异步路由组件被解析之后触发。
  3. 「afterEach」: 在每次导航完成之后调用。可以用来执行一些清理操作、发送统计信息等。没有 next() 方法,不会影响导航本身
  4. 「onError」: 在导航过程中出现错误时调用。可以用来处理导航错误。
router.beforeEach((to, from, next) => {
  // 在每次导航之前执行
  console.log('Before each navigation');
  next();
});

router.beforeResolve((to, from, next) => {
  // 在每次导航确认之前执行,和 beforeEach 类似
  console.log('Before resolve navigation');
  next();
});

router.afterEach((to, from) => {
  // 在每次导航完成之后执行
  console.log('After each navigation');
});

router.onError((err) => {
  // 导航错误时执行
  console.error('Navigation error:', err);
});

vue路由独享守卫:

  1. 「beforeEnter」: 在路由进入前调用,只会对当前路由起作用。可以在此进行验证、重定向等操作。

  2. 「beforeRouteUpdate」: 在当前路由复用时(例如,同一个组件在不同路由间切换)调用,例如在参数变化时。此时,组件实例会被复用,因此你可以通过访问 this 来获取组件实例。

  3. 「beforeRouteLeave」: 在路由离开前调用,只会对当前路由起作用。用于确认是否允许离开当前路由,例如执行确认提示操作。

  4. 「beforeRouteEnter」: 在路由进入前调用,只会对当前路由起作用。但与其他守卫不同,这个守卫不会拥有组件的实例,所以不能通过 this 访问组件。可以通过回调函数 next(vm => {}) 获取组件实例。

const routes = [
{
    path'/home',
    component: Home,
    beforeEnter(to, from, next) =>   {
      if (isUserAuthenticated()) {
        next(); // 允许导航
      } else {
        next('/login'); // 重定向到登录页面
       }
    }
},
{
    path'/user/:id',
    component: UserProfile,
    beforeRouteUpdate(to, from, next) => {
      // 在用户切换不同用户时,根据新的参数更新数据
      if (to.params.id !== from.params.id) {
        this.fetchUserData(to.params.id);
      }
      next();
    }
 },
    {
    path'/edit/:id',
    component: EditPost,
    beforeRouteLeave(to, from, next) => {
      if (this.isDirty) {
        if (confirm('You have unsaved changes. Do you really want to leave?')) {
          next();
        } else {
          next(false); // 取消导航
        }
      } else {
        next();
      }
    }
  },
];
{
    path'/profile/:id',
    component: UserProfile,
    beforeRouteEnter(to, from, next) => {
      // 获取组件实例,并在数据准备好后调用 next()
      fetchData(to.params.id, user => {
        next(vm => {
          vm.user = user;
        });
      });
    }
  },
4. 路由表是什么?

路由表由一个个路由配置对象组成,在一个复杂的应用中,路由表可以更加详细,包括嵌套路由、动态路由参数、路由重定向等。例如:


const routes = [
  { path'/'component: Home },
  {
    path'/products',
    component: Products,
    children: [
      { path'shoes'component: Shoes },
      { path'clothes'component: Clothes }
    ]
  },
  { path'/product/:id'component: ProductDetail },
  { path'/contact'component: Contact },
  { path'/404'component: NotFound },
  { path'/:catchAll(.*)'redirect'/404' }
];

5. 路由参数和查询参数

当构建前端单页应用时,路由参数和查询参数是两种常见的传递数据的机制。它们允许你在不同页面之间传递信息,但在传递方式、用途和实现上有一些区别。

「路由参数:」

  • 「定义方式:」 路由参数是直接嵌入在 URL 路径中,通常使用动态的路径片段进行定义。在路径中使用冒号 : 来指示一个参数。例如: /user/:id
  • 「用途:」 路由参数适用于标识性的信息,如用户 ID、商品 ID 等。在不同路径下,参数值会不同,但路径结构保持一致。
  • 「在 Vue 项目中使用:」 在 Vue 项目中,你可以通过 this.$route.params 来访问路由参数的值。
  • 「在 React 项目中使用:」 在 React 项目中,你可以使用 useParams() 钩子来获取路由参数的值。

在 Vue 中的路由参数使用:

<template>
  <div>
    <router-link :to="'/user/' + userId">User Profile</router-link>
    <router-view></router-view>
  </div>

</template>

<script>
export default {
  data() {
    return {
      userId: 123
    };
  }
};
</
script>

在 React 中的路由参数使用:

import { useParams } from 'react-router-dom';

function UserProfile({
  const { id } = useParams();
  return <div>User Profile: {id}</div>;
}

「查询参数:」

  • 「定义方式:」 查询参数是通过 URL 的查询字符串传递的,以 ? 开头,多个参数使用 & 分隔。例如: /search?q=keyword&page=1
  • 「用途:」 查询参数适用于传递附加信息,如搜索关键字、分页页码等。不同页面间可以使用相同的路径,通过不同的查询参数来实现不同的功能。
  • 「在 Vue 项目中使用:」 在 Vue 项目中,你可以通过 this.$route.query 来访问查询参数的值。
  • 「在 React 项目中使用:」 在 React 项目中,你可以使用 useLocation() 钩子和 query-string 库来获取和解析查询参数的值。

在 Vue 中的查询参数使用:

<template>
  <div>
    <router-link :to="{ path: '/search', query: { q: 'keyword' }}">Search</router-link>
    <router-view></router-view>
  </div>

</template>

<script>
export default {
  /
/ ...
};
</
script>

在 React 中的查询参数使用:

import { useLocation } from 'react-router-dom';
import queryString from 'query-string';

function SearchResults({
  const location = useLocation();
  const queryParams = queryString.parse(location.search);
  const keyword = queryParams.q;
  
  return <div>Search Results for: {keyword}</div>;
}

总之,路由参数和查询参数都是用于在不同页面之间传递数据的方式。路由参数更适用于标识唯一资源,查询参数则适用于传递附加信息或选项。

下一篇文章将分享「路由预加载、懒加载」,欢迎点赞、关注、转发~ alt

本文由 mdnice 多平台发布

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

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

相关文章

麒麟系统在FT2000+下预留连续物理内存空间

1、背景介绍 项目需要在系统下预留一段连续物理地址空间供FPGA启动DMA直接写入&#xff0c;这样提高读写带宽。目前有两种方式可以实现该需求。 注意&#xff1a;前提是操作系统将内存空间访问权限全部放开&#xff0c;否则无法预留空间。 2、实现方法 方式一&#xff1a; …

vue中form和table标签过长

form标签过长 效果&#xff1a; 代码&#xff1a; <el-form-item v-for"(item,index) in ticketEditTable1" :label"item.fieldNameCn" :propitem.fieldName :key"item.fieldNameCn" overflow"":rules"form[item.fieldName…

测试先行:探索测试驱动开发的深层价值

引言 在软件开发的世界中,如何确保代码的质量和可维护性始终是一个核心议题。测试驱动开发(TDD)为此提供了一个答案。与传统的开发方法相比,TDD鼓励开发者从用户的角度出发,先定义期望的结果,再进行实际的开发。这种方法不仅可以确保代码满足预期的需求,还可以在整个开…

数组和指针练习(1)

题目&#xff1a; int main() { int a[5] { 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5}; int * ptr (int * )(&a 1); printf("%d&#xff0c;%d"&#xff0c;*(a 1)&#xff0c;*(ptr - 1)); return 0; } 思路分析&#xff1a;…

BFT最前线|字节跳动AI对话产品“豆包”上线!联想集团推出AI大模型训练服务器!雷尼绍推出工业自动化产品系列

原创 | 文 BFT机器人 AI视界 TECHNOLOGY NEWS 看点1 天才少年稚晖君首秀&#xff0c;官宣智元人形机器人&#xff01; 2023年8月18日上午&#xff0c;从华为离职的“天才少年”彭志辉&#xff0c;也是B站硬核科技UP主稚晖君&#xff0c;公布了他所在的智元团队创业半年的成果…

【严重】Smartbi windowUnloading 限制绕过导致远程代码执行 (MPS-e2z8-wdi6)

zhi.oscs1024.com​​​​​ 漏洞类型授权机制不恰当发现时间2023-08-22漏洞等级严重MPS编号MPS-e2z8-wdi6CVE编号-漏洞影响广度广 漏洞危害 OSCS 描述 Smartbi 是思迈特软件旗下的一款商业智能应用&#xff0c;提供了数据集成、分析、可视化等功能&#xff0c;帮助用户理解和…

湘潭大学 湘大 XTU OJ 1116 水仙花数 题解(非常详细)

链接 1116 题面 Description 如果一个n位数的每个数位的n次方和就是本身&#xff0c;那么我们称这种数为“水仙花数”。比如371,337313273431 371。现给你一个数&#xff0c;请求这个数是否是水仙花数。 输入 有多组样例。每个样例占一行&#xff0c;为一个整数a&#xff0…

72 # http 缓存策略

前面实现了一个 http-server&#xff0c;并且实现了 gzip 的压缩&#xff0c;下面通过前面几节学习的缓存知识来添加一下缓存。 大致就是先强制缓存 10s&#xff0c;然后采用协商&#xff08;对比&#xff09;缓存&#xff0c;大致图如下 在之前的 http-server 的代码基础上添…

2023年8月22日OpenAI推出了革命性更新:ChatGPT-3.5 Turbo微调和API更新,为您的业务量身打造AI模型

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

C++day3(设计一个Per类,类中包含私有成员:姓名、年龄...)

1.设计一个Per类&#xff0c;类中包含私有成员&#xff1a;姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员&#xff1a;成绩、Per类对象 p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostream&g…

【图论】拓扑排序

一.定义 拓扑排序是一种对有向无环图&#xff08;DAG&#xff09;进行排序的算法&#xff0c;使得图中的每个顶点在排序中都位于其依赖的顶点之后。它通常用于表示一些任务之间的依赖关系&#xff0c;例如在一个项目中&#xff0c;某些任务必须在其他任务之前完成。 拓扑排序的…

解决:错误: 找不到或无法加载主类 XXX

解决&#xff1a;错误: 找不到或无法加载主类 XXX 一问题描述&#xff1a;1.在MacBook电脑上面&#xff0c;想用java原生命令执行一个class文件2.进入到class文件目录下面&#xff0c;使用“java 类名”命令&#xff0c;总是报错如下图所示。因为在windows环境的cmd环境这样都可…

游戏出海需知:Admob游戏广告变现策略

越来越多的出海游戏公司更加重视应用内的广告变现&#xff0c;而 AdMob因为其提供的丰富的广告资源&#xff0c;稳定平台支持&#xff0c;被广泛接入采用。 Admob推出的广告变现策略包括bidding、插页式激励视频、开屏广告、各种细分功能的报告等等。 一、Bidding 竞价策略 …

文件夹的批量下载

1.业务背景 公司想实现文件系统下载&#xff0c;上次图简单就草率的写了文件下载&#xff0c;这不趁着同事请假赶集吧这坑给填上。 2.遇到问题 刚准备开始写&#xff0c;就头疼&#xff0c;文件只要获得数据输出流就行&#xff0c;但是这文件夹需要维护层级关系。 前端…

Postman高级用法——newman安装运行

newman是为postman而生专门的执行软件&#xff0c;newman执行脚本即非GUI方式执行&#xff08;命令行方式&#xff09; 下面为newman安装运行的详细操作&#xff01;&#xff01;&#xff01;&#xff08;认真看噢&#xff09; &#xff08;1&#xff09;安装node.js&#xf…

多个promise并发执行,如果某个promise失败,则尝试重新执行该promise一次,如果还是失败则提示错误

思路 可以使用 Promise.all()和Promise.catch() 结合的方式来实现多个promise的并发执行&#xff0c;并在某个promise失败时尝试重新执行。 首先&#xff0c;将所有的promise放入数组中&#xff0c;并使用Promise.all()来同时执行这些promise&#xff0c;这样可以确保所有的p…

利用 XGBoost 进行时间序列预测

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建3D应用场景 XGBoost 应用程序的常见情况是分类预测&#xff08;如欺诈检测&#xff09;或回归预测&#xff08;如房价预测&#xff09;。但是&#xff0c;也可以扩展 XGBoost 算法以预测时间序列数据。它是如何工作的&#xf…

【业务功能篇73】web系统架构演变-单体-集群-垂直化-服务化-微服务化

1.服务架构的演 1.1 单体架构 单体架构应该是我们最先接触到的架构实现了&#xff0c;在单体架构中使用经典的三层模型&#xff0c;即表现层&#xff0c;业务逻辑层和数据访问层。 单体架构只适合在应用初期&#xff0c;且访问量比较下的情况下使用&#xff0c;优点是性价比很…

Redis五种类型

Redis 基础类型 String 应用场景 缓存功能&#xff1a;string 最常用的就是缓存功能&#xff0c;会将一些更新不频繁但是查询频繁的数据缓存起来&#xff0c;以此来减轻 DB 的压力。 底层实现 如果字符串对象保存的是一个字符串值&#xff0c; 并且这个字符串值的长度大于…

【2023中国算力大会】高质量建设西部数谷,努力把宁夏打造成算力之都

2023年8月18日—19日&#xff0c;2023中国算力大会在宁夏银川举行&#xff0c;本届大会以“算领新产业潮流 力赋高质量发展”为主题&#xff0c;打造“主题论坛、成果展示、产业推介、先锋引领”四大核心内容&#xff0c;全面展示算力产业发展最新成果&#xff0c;为产业各方搭…