react—路由

news2024/12/24 3:08:51

1. 注册路由

路由的注册和vue框架中类似,注册过后需要在地址栏输入你想要进去的页面。

// 引入
import { createRoot } from "react-dom/client";
import { createBrowserRouter,RouterProvider,Route,Link }from "react-router-dom";
// 引入组件
import Home from "./views/home/Home.jsx";
import User from "./views/user/User.jsx";
import Root from "./views/root/Root.jsx";
// 注册路由
const router = createBrowserRouter([
  {
    path: "/",
    element: <Home />,
  },
  {
    path: "user",
    element: <User />,
  },
  {
    path: "root",
    element: <Root />,
  },
]);
createRoot(document.getElementById("root")).render(<RouterProvider router={router} />);

 在实际中肯定不是通过在地址栏输入不同路由来切换页面的,接下来就通过标签和js语法写代码来实现页面(组件)的切换。

2. 切换路由——换组件

2.1. 利用标签跳<Link to="/路由名"></Link>

2.2. js跳转——useNavigate

// 引入
import { useNavigate } from "react-router-dom"; 
let router = useNavigate();
let fn = () => {
  // router('root');
  router({ pathname: "root" });
}

3. 页面跳转传参

3.1. state传参——{state:传的参数}

传参:state中可以穿字符串、对象等等。

获取:目标页面通过官方提供的useLocation方法来接收传过来的参数,通过useLocation().state取到数据

// 传参
router({ pathname: "/root" },{state:{goodsname:"隔离",price:159}});

// 目标页面接收
import { useLocation } from "react-router-dom";
  let obj = useLocation();
  useEffect(() => {
    console.log(obj.state);
  }, []);

传的参数在网址中看不见。

3.2. url传参——?参数或search:'字符串参数'

传参:Link标签跳转:<Link to="/user?userid=12&username=rosy">user</Link>

           js语法传参:  router({ pathname: "/user", search:'userid=12&username=rosy' })

获取:useLocation().search

需要注意的是,这种传参方式,目标页面接收到的参数是query字符串,我们需要将这个字符串处理成对象的行,才能通过对象点语法取到数据。

import React from "react";
import { useLocation } from "react-router-dom";
export default function User() {
  let routes = useLocation();
  // 解析当前网站的querystring 例:'email=123&count=11'
  let querystring = (str) => {
    let obj = {};
    // ? 前面有就执行后面代码 没有就不执行
    // let arr = str.split('?')[1]?.split('&').map(el => el.split('='));
    // 易理解方法
    let query = str.split("?")[1];
    // 没传参
    if (!query) {
      return obj;
    }
    // 传参了,切割字符串
    let arr = query.split("&").map((el) => el.split("="));
    arr.forEach((el) => {
      // el=[['email','123],['page','22']]
      obj[el[0]] = el[1];
    });
    return obj;
  };
  let queryobj = querystring(routes.search);
  console.log(queryobj);
  return (
    <div>
      <h3>User</h3>
    </div>
  );
}

参数可以在网址中看到。

3.3. 动态路由传参

// 注册路由时
  {
    // 动态传参
    // path: "/login/:date",
    // 传多个
    path: "/login/:date/:time",
    element: <Login />,
  },
// 主页跳转到login页面
// router({ pathname: "/login/1234" });
// 传多个
router({ pathname: "/login/1234/hi" });
// login页面接收
let data = useParams();
console.log(data);

 参数可以在网址中看到。传过来的参数就是对象的形式,但不推荐使用,因为写代码时注册路由和跳转传参都要写,麻烦。

4. 嵌套路由(子路由)

注册路由:父路由的children属性,是个数组。

注:二级路由不能写成'/a1',这样写真正的网址是'http://ip:port/a1';

        而'a1'指的网址是当前网页的网址的最后添加/a1,也就是'http://ip:port/user/a1

占位组件:<Outlet></Outlet>

// 注册子路由
{
  path: "/user",
  element: <User />,
  children: [
    {
      path: "/user/info",
      element: <Info />,
    },
    {
      path: "collection",
      element: <Collection />,
    },
  ],
}
// 父组件return的模板
<div>
  <h3>User</h3>
  <Link to='/user/info'>info</Link><br />
  <Link to='collection'>collection</Link>
  {/* 占位组件 */}
  <Outlet></Outlet>
</div>

5. 路由健全

5.1 路由守卫——loader

相当于vue中的路由守卫,有些页面需要一定条件才能访问,比如说个人中心页面需要登录过后才能访问。

// 独享守卫 写在单个路由中,作为属性
loader: () => {
    // 假设做是否登录判断
  if (false) {
    return null;
  } else {
    return redirect('/login')
  }
}
// 全局守卫 写在路由前面 作为函数
let loader = () => {
  // 假设做是否登录判断
  if (false) {
    return null;
  } else {
    return redirect("/login");
  }
};

5.2 重定向——redirect

相当于自动帮你切网址

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

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

相关文章

springboot分组校验

1、分组校验场景 主要2个场景&#xff0c;场景1&#xff1a;多个接口使用相同的入参&#xff0c;不同接口需要校验的内容不同。场景2&#xff1a;针对同一个接口&#xff0c;某个值&#xff08;一般是类型&#xff09;的不同会影响其他值的内容&#xff0c;此时需要根据某个值的…

【Linux】设置 命令 --help 帮助文件为中文

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 前言设置系统默认语言为中文安装man-…

【C#】并行编程实战:使用 PLINQ(2)

PLINQ 是语言集成查询&#xff08;Language Integrate Query , LINQ&#xff09;的并行实现&#xff08;P 表示并行&#xff09;。本章将继续介绍其编程的各个方面以及与之相关的一些优缺点。 本文的主要内容为 PLINQ 中的合并选项以及抛出和处理异常。 本教程对应学习工程&…

Xshell连接不上虚拟机的解决办法(给他最后一次机会)

VM还原默认设置 如果你之前的操作都没问题的话Xshell还是连接不上我们的虚拟机&#xff0c;可以试试这个方法 点VM中的 编辑–>虚拟网络编辑器–还原默认设置**(这个方法也特别有效)** 注意还原好以后我们主要看一下VM8的 这是没还原之前的NAT设置 没还原之前的DHCP设置…

如何在Windows 10中创建引导到UEFI固件设置的快捷方式

大多数计算机都有一个特定的键,当计算机启动时按下该键,用户可以访问UEFI(固件)设置。然而,我们经常在错过给定的时间段时按键太晚,因为笔记本电脑默认情况下只需等待几秒钟就可以启动到 Windows。 另一个引导到 UEFI 设置的选项是重新启动到高级启动选项,然后从那里开…

centos6.X防火墙110.42.2

防火墙机制介绍122.228.84 Centos5.X 6.X的防火墙机制为什么称为iptables呢&#xff1f; 因为这个防火墙软件里面有多个表格&#xff08;table&#xff09;,每个表格都定义自己的默认策略与规则&#xff0c;且每个表用途都不同。 Centos5.X 6.X 主要表格&#xff08;table&am…

第三课:设计小技巧

前期准备 下载一份官方规范&#xff0c;将官方规范文件置入到 Figma 中&#xff0c;若是使用网页版&#xff0c;建议打开两个 Figma 网页&#xff0c;在两个网页中分别打开规范文档和需要设计的项目&#xff0c;这样便可以通过 Tab 切换&#xff0c;快速将官方文档中的文件复…

学习c++ Part03

文章目录 前言1.动态空间申请1.1 静态空间申请1.2 动态分配 2.字符串处理函数3.结构体3.1 结构体的浅拷贝3.2 结构体的深拷贝3.3 结构体变量在堆区 结构体指针成员也指向堆区&#xff08;先释放成员&#xff0c;再释放结构体&#xff09;3.4 结构体的对齐规则3.5 结构体的位域&…

跟我一起从零开始学python(三)多线程/多进程/协程

前言 回顾之前讲了python语法编程 &#xff0c;关于从零入门python的第一遍&#xff0c;编程语法必修内容&#xff0c;比如python3基础入门&#xff0c;列表与元组&#xff0c;字符串&#xff0c;字典&#xff0c;条件丶循环和其他语句丶函数丶面向对象丶异常和文件处理和网络…

oracle,update更新时,条件没走索引

update更新时没走索引&#xff0c; 查询索引是有效的&#xff1a; 没走索引的原因是条件字段的字段类型不一致&#xff0c; 一个是varchar2&#xff0c; 另一个是 nvarchar2 。 要走索引需要字段类型一致&#xff0c;可以利用to_char()将 nvarchar2转为 varchar2

VS2019+Qt5.15 在线显示百度地图

1.Qt5.15编译程序需要选择mscv2019 Release版本 2.需要到百度地图开发平台注册并获取到开发者key 3.显示地图是JS与Qt的交互过程&#xff0c;显示地图的html文件&#xff1a; <!DOCTYPE html> <html><head> <meta name"viewport" content&q…

订单自动取消的11种实现方式(上)

一、DelayQueue DelayQueue是JDK提供的api&#xff0c;是一个延迟队列 DelayQueue泛型参数得实现Delayed接口&#xff0c;Delayed继承了Comparable接口。 getDelay方法返回这个任务还剩多久时间可以执行&#xff0c;小于0的时候说明可以这个延迟任务到了执行的时间了。 com…

企业微信小程序登录,错误码:60020

在使用企业微信wx.qy.login API进行登录获取【session_key】时&#xff0c;报出错误码&#xff1a;60020 此错误记得好像意指的是获取的企业【access_token】用以去置换登录令牌【session_key】时&#xff0c;下发【access_token】的IP地址和获取【session_key】的IP不一致&am…

kotlin Flow系列之 - 冷流SafeFlow源码解析之 - Safe在那里?

本文涉及源码基于kotlinx-coroutines-core-jvm:1.7.1 kotlin 协成系列文章: 你真的了解kotlin中协程的suspendCoroutine原理吗? Kotlin Channel系列&#xff08;一&#xff09;之读懂Channel每一行源码 kotlin Flow系列之-冷流SafeFlow源码解析之 - Safe在那里&#xff1f; ko…

【vue2动画效果】实现两组单词逐渐减短,最后只保留首字母的效果

前言 实现两组单词逐渐减短&#xff0c;最后只保留首字母的效果 效果&#xff1a; 正文 <template><div class"header"><div style"margin-right: 12px; display: inline-flex"><divclass"door"id"book1"v-f…

常用数据回归建模算法总结记录

本文的主要目的是总结记录日常学习工作中常用到的一些数据回归拟合算法&#xff0c;对其原理简单总结记录&#xff0c;同时分析对应的优缺点&#xff0c;以后需要的时候可以直接翻看&#xff0c;避免每次都要查询浪费时间&#xff0c;欢迎补充。 (1)线性回归 (Linear Regressio…

解决springboot上传中文文件报错:NoClassDefFoundError: javax/mail/internet/MimeUtility

解决springboot上传中文文件报错:NoClassDefFoundError: javax/mail/internet/MimeUtility 1. 背景&#xff1a; springboot版本&#xff1a;2.7.11 前端使用 UnityEngine.WWWForm 进行文件上传 报错信息&#xff1a;org.springframework.web.multipart.MultipartException: F…

【资料分享】RK3568开发板规格书(4x ARM Cortex-A55(64bit),主频1.8GHz)

1 开发板简介 创龙科技TL3568-EVM是一款基于瑞芯微RK3568J/RK3568B2处理器设计的四核ARM Cortex-A55国产工业评估板&#xff0c;每核主频高达1.8GHz/2.0GHz&#xff0c;由核心板和评估底板组成。核心板CPU、ROM、RAM、电源、晶振、连接器等所有器件均采用国产工业级方案&#…

【拼多多API商品详情页面采集】具体的API接口调用步骤

要从拼多多获取商品数据&#xff0c;可以使用拼多多提供的API接口。首先需要注册一个拼多多开放平台的开发者账号&#xff0c;然后创建一个应用程序&#xff0c;获取应用程序的app_id和app_secret&#xff0c;以在API请求中进行身份验证。 在使用API接口时&#xff0c;需要按照…

力扣1816. 截断句子

代码展示&#xff1a; 方法1&#xff1a;通过StringBuilder创建的变量str来记录截断得到的字符串 思路&#xff1a;遍历字符串s&#xff0c;定义一个变量count_space来记录空格出现的次数&#xff0c;当空格没有出现k次时便将字符依次连接到StringBuilder类型的变量str后&#…