React-Router v6 新特性解读及迁移指南

栏目: IT技术 · 发布时间: 4年前

内容简介:18 年初,原来是相互抗衡的,却没想目前

前言

18 年初, React Router 的主要开发人员创建一个名为 Reach Router 的轻量级替代方案。

原来是相互抗衡的,却没想 React Router 直接拿来合并(真香!) React-Router v6 新特性解读及迁移指南

目前 v6 已是测试最后一版,估计新的特性不出意外就是下面这些了: React-Router v6 新特性解读及迁移指南

  1. <Switch> 重命名为 <Routes>
  2. <Route> 的新特性变更。
  3. 嵌套路由变得更简单。

  4. useNavigate 代替 useHistory
  5. 新钩子 useRoutes 代替 react-router-config
  6. 大小减少:从 20kb8kb

1. <Switch> 重命名为 <Routes>

该顶级组件将被重命名。但是,其功能大部分保持不变(嗨,瞎折腾)。

// v5

<Switch>

<Route exact path="/"><Home /></Route>

<Route path="/profile"><Profile /></Route>

</Switch>


// v6

<Routes>

<Route path="/" element={<Home />} />

<Route path="profile/*" element={<Profile />} />

</Routes>

2. <Route> 的新特性变更

component/renderelement 替代

总而言之,简而言之。就是变得更好用了。

import Profile from './Profile';


// v5

<Route path=":userId" component={Profile} />

<Route

path=":userId"

render={routeProps => (

<Profile routeProps={routeProps} animate={true} />

)}

/>


// v6

<Route path=":userId" element={<Profile />} />

<Route path=":userId" element={<Profile animate={true} />} />

3. 嵌套路由变得更简单

具体变化有以下:

  • <Route children> 已更改为接受子路由。
  • <Route exact><Route strict> 更简单的匹配规则。
  • <Route path> 路径层次更清晰。

3.1 简化嵌套路由定义

v5 中的嵌套路由必须非常明确定义,且要求在这些组件中包含许多字符串匹配逻辑(活久见啊,终于意识到这个问题了。)

React-Router v6 新特性解读及迁移指南

且看之前的处理:

// v5

import {

BrowserRouter,

Switch,

Route,

Link,

useRouteMatch

} from 'react-router-dom';


function App() {

return (

<BrowserRouter>

<Switch>

<Route exact path="/" component={Home} />

<Route path="/profile" component={Profile} />

</Switch>

</BrowserRouter>

);

}


function Profile() {

let { path, url } = useRouteMatch();


return (

<div>

<nav>

<Link to={`${url}/me`}>My Profile</Link>

</nav>


<Switch>

<Route path={`${path}/me`}>

<MyProfile />

</Route>

<Route path={`${path}/:id`}>

<OthersProfile />

</Route>

</Switch>

</div>

);

}

而在 v6 中,你可以删除字符串匹配逻辑。不需要任何 useRouteMatch()

// v6

import {

BrowserRouter,

Routes,

Route,

Link,

Outlet

} from 'react-router-dom';


function App() {

return (

<BrowserRouter>

<Routes>

<Route path="/" element={<Home />} />

<Route path="profile/*" element={<Profile/>} />

</Routes>

</BrowserRouter>

);

}


function Profile() {

return (

<div>

<nav>

<Link to="me">My Profile</Link>

</nav>


<Routes>

<Route path="me" element={<MyProfile />} />

<Route path=":id" element={<OthersProfile />} />

</Routes>

</div>

);

}

当然,还有更酸爽的操作,直接在路由里定义 <Route><Route> ,然后用接下来的一个新 APIOutlet

3.2 新 API : Outlet

这玩意儿,像极了 {this.props.children} ,具体用法看以下例子:

function App() {

return (

<BrowserRouter>

<Routes>

<Route path="/" element={<Home />} />

<Route path="profile" element={<Profile />}>

<Route path=":id" element={<MyProfile />} />

<Route path="me" element={<OthersProfile />} />

</Route>

</Routes>

</BrowserRouter>

);

}


function Profile() {

return (

<div>

<nav>

<Link to="me">My Profile</Link>

</nav>

{/*

将直接根据上面定义的不同路由参数,渲染<MyProfile />或<OthersProfile />

*/}

<Outlet />

</div>

)

}

3.3 多个 <Routes />

以前,我们只能 在 React App 中使用一个 Routes 。但是现在我们可以在 React App 中使用多个路由,这将帮助我们基于不同的路由管理多个应用程序逻辑。

import React from 'react';

import { Routes, Route } from 'react-router-dom';


function Dashboard() {

return (

<div>

<p>Look, more routes!</p>

<Routes>

<Route path="/" element={<DashboardGraphs />} />

<Route path="invoices" element={<InvoiceList />} />

</Routes>

</div>

);

}


function App() {

return (

<Routes>

<Route path="/" element={<Home />} />

<Route path="dashboard/*" element={<Dashboard />} />

</Routes>

);

}

4. 用 useNavigate 代替 useHistory

从一目了然改到双目失明。。。

总感觉 React Router 团队有点儿戏。。。

// v5

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


function MyButton() {

let history = useHistory();

function handleClick() {

history.push('/home');

};

return <button onClick={handleClick}>Submit</button>;

};

现在, history.push() 将替换为 navigation()

// v6

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


function MyButton() {

let navigate = useNavigate();

function handleClick() {

navigate('/home');

};

return <button onClick={handleClick}>Submit</button>;

};

history 的用法也将被替换成:

// v5

history.push('/home');

history.replace('/home');


// v6

navigate('/home');

navigate('/home', {replace: true});

React-Router v6 新特性解读及迁移指南
强行达成共识

5. 新钩子 useRoutes 代替 react-router-config

感觉又是一波强行 hooks ,但还是相对于之前简洁了一些。。。

function App() {

let element = useRoutes([

{ path: '/', element: <Home /> },

{ path: 'dashboard', element: <Dashboard /> },

{ path: 'invoices',

element: <Invoices />,

children: [

{ path: ':id', element: <Invoice /> },

{ path: 'sent', element: <SentInvoices /> }

]

},

// 重定向

{ path: 'home', redirectTo: '/' },

// 404找不到

{ path: '*', element: <NotFound /> }

]);

return element;

}

6. 大小减少:从 20kb8kb

React Router v6 给我们带来方便的同时,还把包减少了一半以上的体积。。。

React-Router v6 新特性解读及迁移指南

感觉可以去看一波源码了。。。

关于奇舞周刊

《奇舞周刊》是360公司大前端团队「 奇舞团 」运营的前端技术社区。关注公众号后,直接发送链接到后台即可给我们投稿。

React-Router v6 新特性解读及迁移指南


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

界面设计模式

界面设计模式

[美]泰德维尔(Tidwell,J.) / 蒋芳 / 电子工业出版社 / 2013-9-1 / CNY 119.00

模式意味着重用。 好的模式建立在对人与事物的深刻认知之上。 本书开篇即总结了“与人有关”的各类问题,为读者提供了界面设计总体思路上的指引,帮助读者举一反三。 接下来,本书收集并分析了很多常用的界面设计模式,帮助读者理解在实现级别的各种常用解决方案,将它们灵活地运用到自己的设计中。 同时,随着网络和技术的不断发展,本书在第1 版的基础上,更新了几乎所有的模式示例和说明,并新增......一起来看看 《界面设计模式》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具