首页 > 其他分享 >从React Router V5 升级到 V6

从React Router V5 升级到 V6

时间:2024-04-10 21:23:34浏览次数:13  
标签:react React V5 v6 router 组件 Router

1. 升级 react-router 包

npm install react-router-dom@[VERSION_NUMBER]
替换VERSION_NUMBER为我们要安装的版本,或者如果我们想要最新版本,则替换为“ latest ”,如下所示:

npm install react-router-dom@6
或者

npm install react-router-dom@latest

2. 使用 Routes 替换 Switch

在 React Router v5 中,我们使用Switch组件包装路由,它可以确保每次只匹配的路由。但Switch组件在 React Router v6 中已经被废弃了,在React Router v6中我们使用Routes组件来替换Switch。

React Router v5:


function App() {
    return (
        <BrowserRouter>
							<Switch>
									{/* 定义路径 Route */}
							</Switch>
        </BrowserRouter>
    );
}
export default App

React Router v6:

import { BrowserRouter, Routes } from "react-router-dom";

function App() {
    return (
        <BrowserRouter>
						<Routes>
								{/* 使用 Routes 代替 Switch*/}
								{/* 定义路径 Route */}
						</Routes>
        </BrowserRouter>
    );
}
export default App

3. 废弃 exact 属性

在 v5 中,如果给某个Route组件添加exact属性,那么路由将会进行精确匹配,而整个路由匹配过程是从上到下按顺序进行的。
而在 v6 中,我们将不再需要声明exact属性,路径模式匹配彻底改写,不再严格要求路径顺序,为我们的开发增加了极大的灵活性。

React Router v5:

<Switch>
   {/* Route组件使用三种方式 */}
	 {/* 直接在component定义子页面 */}
   <Route path="/page1" component={Page} />
   {/* 通过嵌套子页面 */}
   <Route path="/page2">
       <Page id={2} />
   </Route>
   {/* 通过render函数渲染页面 */}
   <Route path="/page3" render={(props) => <Page {...props} />} />
</Switch>

React Router v6:

<Routes>
   <Route path="/page1" element={<Page />} />
   <Route path="/page2" element={<Page id={2} />} />
</Routes>

Link和NavLink组件仍然可以在V6中运行。

Link组件与 v5 基本一致
NavLink组件删除了activeClassName和activeStyle prop。
在 v6 中,我们现在可以使用一个函数来获取有关链接活动状态的信息。该函数的参数是一个具有属性的对象isActive。此属性在链接处于活动状态时为真,在非活动时为假。isActive的值允许我们使用条件表达式来指示活动样式或类名。

React Router v5:

import {NavLink} from “react-router-dom”

{/* … */}
<NavLink
   to="/page1"
   style={{ color: "red" }}
   activeStyle={{ color: "blue" }}
   activeClassName="active"
>
   page1
</NavLink>

React Router v6:

<NavLink
   to="/page1"
   style={({ isActive }) => ({ color: isActive ? "red" : "blue" })}
   className={({ isActive }) => `link${isActive ? " active" : ""}`}
>
   page1
</NavLink>

5. Navigate替代Redirect

v5 的重定向组件 Redirect 将会在v6中被废弃,我们需要使用 Navigate组件来在 v6 中实现页面重定向。

React Router v5:

<Route path="/page1">
   <Redirect to="/page2" />
</Route>
<Route path="/page3" component={Page} />

React Router v6:

<Route path="/page" element={<Navigate to="/page2" />} />;
<Route path="/page3" element={<Page />} />;

6. 嵌套路由

顾名思义,嵌套路由是放置在另一个路由中的路由,用于在子组件中呈现更具体的导航信息。

在 v6 中,引入了Outlet组件,用于指定我们希望嵌套信息显示在哪里。Outlet 组件不是必需的,但它使代码更清晰。

React Router v5:

import { useRouteMatch } from "react-router-dom";

function App() {
   return (
       <BrowserRouter>
           <Switch>
               <Route path="/touristRoute" component={TouristRoute} />
           </Switch>
       </BrowserRouter>
   );
}

function TouristRoute() {
   let match = useRouteMatch();
   return (
       <div>
           <Switch>
               {/* 匹配 “/touristRoute" */}
               <Route path={`${match.path}`}>
                   <AllTouristRoute />
               </Route>
               {/* 匹配 /touristRoute/:id */}
               <Route path={`${match.path}/:id`}>
                   <TouristRouteDetail />
               </Route>
           </Switch>

       </div>
   );
}

React Router v6:

import { Outlet } from "react-router-dom";

function App() {
   return (
       <Routes>
           <Route path="/page" element={<Page />} />
           <Route path="/touristRoute" element={<Order />}>
               {/* 匹配 "/touristRoute/" */}
               <Route path="/" element={<AllTouristRoute />} />
               {/* 这里变成 "/touristRoute/:id" */}
               <Route path="/:id" element={<TouristRouteDetail />} />

           </Route>
       </Routes>
   );
}

function TouristRoute() {
   return (
       <Container>
           <>
               <div>TouristRoute</div>
           </>
           {/* 路由嵌套于此 */}
           <Outlet />
       </Container>
   );
}

7. useHistory vs useNavigate

在 v6 中,useHistory 被废弃了,需要使用 useNavigate

React Router v5:

import { useHistory } from "react-router-dom";

function Product() {
   const history = useHistory();

   const handleClick = () => {
       //这会将新路线推送到导航堆栈的顶部
       history.push("/new-route");

       //这会将当前路线替换为导航堆栈中的新路由
       history.replace("/new-route");
   };

   return (
       <div>
           <button>点击我重定向到新路由</button>
       </div>
   );
}

React Router v6:

import { useNavigate } from "react-router-dom";

function Product() {
   const navigate = useNavigate();

   const handleClick = () => {
       //这会将新路线推送到导航堆栈的顶部
       navigate("/new-route");

       //这会将当前路线替换为导航堆栈中的新路由
       navigate("/new-route", { replace: true });
   };

   return (
       <div>
           <button>点击我重定向到新路由</button>
       </div>
   );
}

在 v6中,我们可以在导航堆栈上任意前进和后退。调用方法navigate(),参数传入正数,路由会向前移动;负数则后退。

// 前进1步
navigate(1)
// 前进2步
navigate(2)
// 后退1步
navigate(-1)
// 后退3步
navigate(-3)

标签:react,React,V5,v6,router,组件,Router
From: https://www.cnblogs.com/mengqc1995/p/18127478

相关文章

  • react组件之cmao-ui,编写流程图的功能介绍
    流程组件介绍:该组件参考老版力软learun框架中的jquery流程组件进行重构,改写为react的组件。样式、操作、交互方式大致相近。该组件依赖的react版本大于18(不是不能做到兼容旧版react,而是要写就写新版本的,还用老的干嘛)下载//npm下载npminstallcmao-ui引用该组件是......
  • 跨框架探索:React Redux 和 Vuex 对比分析快速掌握React Redux
    ReactRedux和Vuex都是前端状态管理库,分别用于React和Vue.js框架。它们都提供了一套规范的状态管理机制,帮助开发者更好地组织和管理应用状态。下面是它们的一些异同点:相同点:中心化状态管理:两者都提供了一个全局的存储中心,使得组件间状态共享变得简单。响应式:状......
  • react-redux 持久化
    1.安装 redux-persistnpminstallredux-persist 2.store/index.js文件import{configureStore,combineReducers}from"@reduxjs/toolkit";import{persistStore,persistReducer}from'redux-persist';importstoragefrom'redux-persis......
  • react 配置@别名
    1.安装craco工具npmi-D@craco/cracocraco是一个用于扩展CreateReactApp(CRA)的工具,CRA是一个用于快速搭建React应用的脚手架工具。CRA提供了一个简单的项目结构和配置,使得开发者可以快速开始一个React项目的开发。然而CRA的配置是被隐藏的,开发者无法对其进行自定......
  • JSX.Element 和 React.ElementType的区别是什么?
    在React和TypeScript中,JSX.Element和React.ElementType代表了两种不同的概念:JSX.Element:JSX.Element是一个类型,表示由JSX编译后生成的实际React元素对象。当你在React应用中使用JSX编写组件时,每一个JSX表达式都会编译为一个JSX.Element对象。例如:constMyComponent:React.......
  • react路由使用
    在介绍ReactRouter的概念以前,需要先区分两个概念:react-router:为React应用提供了路由的核心功能;react-router-dom:基于react-router,加入了在浏览器运行环境下的一些功能。1.安装(本文6.22.3版本)npmi react-router-dom -S2.创建router/index.jsimportGoo......
  • react ref和context
    ref获取domcontext类似provider和injected,用于嵌套很深的爷孙组件传值子组件使用父组件创建的context对象,不能自己创建context创建在函数组件和class组件都是一样的exportletContext1=React.createContext('')<Context1.Providervalue='Contextvalue函数组件'>......
  • react 函数组件和hook
    函数组件1.函数组件没有生命周期2.函数组件没有this3.函数组件通过hook完成各种操作4.函数组件本身就是render函数5.props在函数第一个参数解释useState参考https://www.cnblogs.com/ssszjh/p/14581014.htmlprops参考https://www.cnblogs.com/ssszjh/p/18118746生命周期......
  • react 性能问题和优化
    某个组件更新,子组件也会一起更新react更新采用时间切片,vue则是依赖收集执行更新操作为16ms,如果操过16ms,先暂停更新,让浏览器先渲染时间切片时间是16ms,因为人眼刷新率约60帧,60hz为16ms1.避免state改为同样的值(class用PureComponent,函数组件默认已经处理了)2.处理子组......
  • Vue实现手机APP页面的切换,如何使用Vue Router进行路由管理呢?
    在Vue中,实现手机APP页面的切换,通常会使用VueRouter进行路由管理。VueRouter是Vue.js官方的路由管理器,它和Vue.js深度集成,使构建单页面应用变得易如反掌。以下是一个简单的步骤说明,展示如何使用VueRouter实现手机APP页面的切换:安装VueRouter如果你还没有安装VueRouter,可......