当前位置: 首页 > news >正文

React Router v6中的更新

标题react-router v6 中的更新

React Router 是一个基于 React 之上的强大路由库,它可以让你向应用中快速地添加视图和数据流,同时保持页面与 URL 间的同步

import { BrowserRouter as Router, Routes, Route, Outlet } from 'react-router-dom';

1.Switch 重命名为 Routes

​ Routes 是以前Switch组件的升级版,它包括相对路由和链接、自动路由排名、嵌套路由和布局等功能

2.Route新特性

​ 负责渲染React组件的UI,其中的path属性,始终与当前url匹配,第二个需要的属性叫做 element,当遇到当前url是,会告诉Route组件要渲染哪个React组件,这里的element是v6新增的,替换v5中的component的属性

import Children from './Children';
// v5
<Route path=":id" component={Children} />
<Route
  path=":id"
  render={routeProps => (
    <Profile routeProps={routeProps} />
  )}
/>
// v6
<Route path=":userId" element={<Profile />} />

3.路由嵌套更简单,新增API:Outlet

​ 这个很重要,当路由被嵌套时,一般认为网页的某一部分保持不变,只有网页的子部分发生变化

​ v5 中,必须明确定义嵌套路由,v6中并非如此,他从React Router库中挑选了一个名为 Outlet 的最佳元素,为特定路由呈现任何匹配的子元素

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home/>} />
        <Route path="new" element={<New/>}>
          <Route path=":id" element={<List/>} />
          <Route path="me" element={<Others/>} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
}

function New() {
  return (
    <div>
      <nav>
        <Link to="me">My Profile</Link>
      </nav>
        {/*
       将直接根据上面定义的不同路由参数,渲染<MyProfile />或<OthersProfile />
        */}
      <Outlet/>
    </div>
  )
}

4.useNavigate

​ useNavigate代替useHistory,useNavigae中不在保存useHistory中的路由信息,获取路由信息通过useLocation

// v5
history.push('/new')
history.replace('/new')
history.go(-1)

// v6
navigate('/new')
navigate('/new', {replace: true})
navigate(-1)

5.useRoutes

function App() {
  let element = useRoutes([
    { path: '/', element: <Home /> },
    { path: 'dashboard', element: <Dashboard /> },
    { path: 'invoices',
      element: <List />,
      children: [
        { path: ':id', element: <List /> },
        { path: 'new', element: <New /> }
      ]
    },
    // 重定向
    { path: 'home', redirectTo: '/' },
    // 404找不到
    { path: '*', element: <NotFound /> }
  ]);
  return element;
}

6.v6中所有路径匹配都忽略URL尾部的’/',Route 中的strict 在v6中已被删除

// v5 之前存在的路由歧义
1.当前路径'/users',则<Link to='me'>将跳转<a href='/me'>
2.当前路径'/users/',则<Link to='me'>将跳转<a href='/users/me'>

// v6修复了这种歧义
1.当前路径'/users',则<Link to='me'>将跳转<a href='/users/me'>
2.当前路径'/users',则<Link to='../me'>将跳转<a href='/me'>

// 像命令行中cd的用法
当前路径为 /app/dashboard
<Link to='stats'>			// <a href='/app/dashboard/stats'>
<Link to='../stats'>		// <a href='/dashboard/stats'>
<Link to='../stats'>		// <a href='/stats'>
<Link to='../../../stats'>		// <a href='/stats'>

7.保留了v5中的useParams和useLocation

8.v6中没有withRouter,但是在类组件中很多情况下会用到

const withRouter = Component => {
  const ComponentWithRouterProp = props => {
    let location = useLocation();
    let navigate = useNavigate();
    let params = useParams();
    return (
      <Component
        {...props}
        router={{location, navigate, params}}
      />
    );
  };

  return ComponentWithRouterProp;
};

9.大小,从20.5KB减少到7.4KB

相关文章:

  • xacro搭建ros仿真机器人(待更新)
  • Visual Studio C++ Hello World
  • 线程安全问题和多线程安全经典案例
  • IDEA2020创建JavaWeb项目并配置tomcat
  • Windows下小狼毫输入法(Rime)的安装与配置
  • java 调用C#语言写的dll文件代码 超详细过程
  • Java面试题11-ReentrantLock中的公平锁与非公平锁的底层实现
  • 股票行情查询易语言代码
  • STM32学习记录 -- 通用定时器的配置(TIM2-TIM5)
  • node搭建服务器
  • 域名解析信息易语言代码
  • 【GNN报告】蒙特利尔大学朱兆成:基于图神经网络的知识图谱推理
  • ATF启动(二):BL1
  • Nginx之正则表达式、location匹配简介以及rewrite重写
  • Kafka 集群安装及常用命令
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Intervention/image 图片处理扩展包的安装和使用
  • Java IO学习笔记一
  • JavaScript设计模式系列一:工厂模式
  • Java精华积累:初学者都应该搞懂的问题
  • Linux CTF 逆向入门
  • npx命令介绍
  • springboot_database项目介绍
  • Terraform入门 - 1. 安装Terraform
  • win10下安装mysql5.7
  • 阿里云应用高可用服务公测发布
  • 对JS继承的一点思考
  • 力扣(LeetCode)357
  • 如何设计一个比特币钱包服务
  • 移动端解决方案学习记录
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ionic异常记录
  • 积累各种好的链接
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • # centos7下FFmpeg环境部署记录
  • #HarmonyOS:Web组件的使用
  • #Lua:Lua调用C++生成的DLL库
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Python第六天)文件处理
  • (分类)KNN算法- 参数调优
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (六)c52学习之旅-独立按键
  • (论文阅读40-45)图像描述1
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (学习日记)2024.01.19
  • .htaccess配置常用技巧
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /dev/sda2 is mounted; will not make a filesystem here!