Day3: 前端路由(基础篇)

「目标」: 持续输出!每日分享关于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 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

npm和node版本升级教程

cmd中查看本地安装的node版本 node -v //查询node的位置 where node2.官网下载所需要的node版本&#xff0c;安装在刚查出来的文件夹下&#xff0c;即覆盖掉原来的版本 3.查看node版本是否已经更新 4.查看npm版本是否和node版本相匹配 cnpm install -g npm

使用VisualStudio制作上位机(三)

文章目录 使用VisualStudio制作上位机(三)第三部分:GUI内部函数设计使用VisualStudio制作上位机(三) Author:YAL 第三部分:GUI内部函数设计 这一部分,主要实现CAN设备的打开 将CAN厂家的二次开发文件添加到工程里调用相关函数打开或关闭CAN首先,添加“类文件”,类主…

Unity 物体的运动之跟随鼠标

你想让鼠标点击哪里&#xff0c;你的运动的对象就运动到哪里吗&#xff1f; Please follow me ! 首先&#xff0c;你要先添加一个Plane ,以及你的围墙&#xff0c;你的移动的物体 想要实现跟随鼠标移动&#xff0c;我们先创建一个脚本 using System.Collections; using Syst…

java八股文面试[java基础]—— hashCode 与 equals 区别 == 与 equals的区别

两个对象的hashCode()相同时&#xff0c;equals()相等吗&#xff1f;_两个对象的hashcode一样,equal一样么_不想当个程序员的博客-CSDN博客 equals()&#xff1a;比较的是非基本类型的数据的引用地址&#xff08;即内存地址&#xff09;是否相同&#xff0c;但是对于重写equal…

Redis多机实现

Background 为啥要有多机--------------1.容错 2.从服务器分担读压力。 主从结构一大难题------------如何保障一致性&#xff0c;对这个一致性要求不是很高&#xff0c;因为redis是用来做缓存的 同时我们要自动化进行故障转移-------哨兵机制&#xff0c;同时哨兵也可能cra…

内网穿透实战应用-windwos10系统搭建我的世界服务器,内网穿透实现联机游戏Minecraft

文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …

Matplotlib学习笔记

Matplotlib数据可视化库 jupyter notebook优势 画图优势&#xff0c;画图与数据展示同时进行。数据展示优势&#xff0c;不需要二次运行&#xff0c;结果数据会保留。 Matplotlib画图工具 专用于开发2D图表以渐进、交互式方式实现数据可视化 常规绘图方法 子图与标注 想要…

【C语言】动态内存管理,详细!!!

文章目录 前言一、为什么存在动态内存分配二、动态内存开辟函数的介绍1.malloc2.calloc3.realloc4.free 三、动态内存开辟中的常见错误1.误对NULL进行解引用操作2.对于动态开辟的空间进行了越界访问3.对于非动态开辟的内存进行了free操作4.只free掉动态开辟内存的一部分5.多次f…

Linux工具【2】(调试器gdb、项目自动化构建工具make/Makefile)

gdb、make/Makefile 引言调试器gdb介绍常用指令 自动化构建工具make/Makefile介绍使用依赖关系与依赖方法编辑Makefile伪目标 总结 引言 在上一篇文章中介绍了Linux中的编辑器vim与编译器gcc与g&#xff1a; 戳我看vim与gcc详解哦 在本篇文章中将继续来介绍Linux中的工具&…

ResNet18云空间部署

1-6步骤可以在云空间运行&#xff0c;也可以在本地运行&#xff1b;步骤7 在云空间运行。 1.编译ONNX模型 本章以 resnet18.onnx 为例, 介绍如何编译迁移一个onnx模型至BM1684X TPU平台运行。 该模型来自onnx的官网: models/vision/classification/resnet/model/resnet18-v1…

Mybatis (3)-----分页的运用

目录 一、分页查询 二&#xff0c;特殊的字符处理 三、总结 前言&#xff1a;在我们上篇已经学的动态sql的基础上&#xff0c;今天继续讲解关于maybatis的分页&#xff0c;特殊的字符处理。希望这篇博客可以帮助到大家哦&#xff01; 一、分页查询 为什么要重写mybatis的分…

星际争霸之小霸王之小蜜蜂(六)--让子弹飞

目录 前言 一、添加子弹设置 二、创建子弹 三、创建绘制和移动子弹函数 四、让子弹飞 五、效果 总结 前言 小蜜蜂的基本操作已经完成了&#xff0c;现在开始编写子弹的代码了。 一、添加子弹设置 在我的预想里&#xff0c;我们的小蜜蜂既然是一只猫&#xff0c;那么放出的子弹…

【MD5加密】

MD5加密 什么是MD5密码MD5用途MD5特点MD5加密MD5解密总结那我们上面也已经提到啦&#xff0c;说MD5是可以进行解密或者说他是可以泄露密码等&#xff0c;所以我们还可以使用以下方法进行再次加密 第一种&#xff1a;MD5固定盐值第二种&#xff1a;MD5随机盐值 什么是MD5密码 官…

基于鸽群算法优化的BP神经网络(预测应用) - 附代码

基于鸽群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于鸽群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.鸽群优化BP神经网络2.1 BP神经网络参数设置2.2 鸽群算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

25-非父子通信 - event bus 事件总线

作用:非父子组件之间&#xff0c;进行简易消息传递。(复杂场景 -> Vuex) 1.创建一个都能访问到的事件总线(空 Vue 实例) -> utils/EventBus.js import Vue from vue const Bus new Vue() export default Bus 2. A组件(接收方),监听 Bus实例 的事件(支持多个组件同时监…

机器人制作开源方案 | 滑板助力器

我们可以用一块废滑板做些什么呢&#xff1f; 如今&#xff0c;越来越多的人选择电动滑板作为代步工具或娱乐方式&#xff0c;市场上也涌现出越来越多的电动滑板产品。 &#xff08;图片来源&#xff1a;Backfire Zealot X Belt Drive Electric Skateboard– Backfire Board…

在Linux系统上安装和配置Redis数据库,无需公网IP即可实现远程连接的详细解析

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 Redis作为一款高速缓存的key value键值对的数据库,在…

学会Mybatis框架:一文掌握MyBatis与GitHub插件分页的完美结合【三.分页】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Mybatis的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Mybatis分页 1. Mybatis自带分页 2…

springboot小知识:配置feign服务超时时间

背景&#xff1a;当前项目通过feign服务调用了其他两个项目的接口&#xff0c;但是由于特殊需求&#xff0c;需要调整某一个项目的feign服务的默认超时时间&#xff1a; 默认连接超时10秒&#xff0c;默认读取超时时间 60秒 1.找到定义的FeignClient 2.根据FeignClient定义的名…

Node基础--Node简介以及安装教程

1.Node简介 Node.js发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c;让JavaScript 运行在服务端的开发平台&#xff0c;它让JavaScript成为与PHP、Python、Pe…