предисловие
В начале 18 летReact Router
Reach Router
Легкая альтернатива.
Оказалось друг против друга, но я не думалReact Router
Возьмите его прямо и слейте (он так хорошо пахнет!)
В настоящее времяv6
Это последняя версия теста, и предполагается, что новые функции будут следующими.
-
<Switch>
переименован в<Routes>
. -
<Route>
новые изменения функций. - Вложенные маршруты стали проще.
- использовать
useNavigate
заменятьuseHistory
. - новый крючок
useRoutes
заменятьreact-router-config
. - Уменьшение размера: от
20kb
прибыть8kb
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/render
одеялоelement
заменять
В общем, в двух словах. Стало лучше.
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
Вложенные маршруты должны быть очень хорошо определены и требуют большого количества логики сопоставления строк в этих компонентах (увидимся скоро, наконец, поняли это).
И посмотрите на предыдущую обработку:
// 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>
, затем используйте следующий новыйAPI
:Outlet
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});
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. Уменьшение размера: от20kb
прибыть8kb
React Router v6
Принося нам удобство, он также уменьшает объем сумки более чем наполовину. . .
Я чувствую, что могу посмотреть исходный код. . .
7. Миграция и другие важные исправления...
Официальное руководство по миграции находится здесь:Руководство по миграции React Router v6
По сути, перечисленные выше новые функции — это практически все содержимое миграции.
Основной способ начать — обновить пакет:
$ npm install react-router@6 react-router-dom@6
# or, for a React Native app
$ npm install react-router@6 react-router-native@6
Одна из вещей, которая, как мне кажется, требует особого внимания, это:React Router v6 использует упрощенную сетку путей и поддерживает только 2 типа заполнителей: динамические:id
параметры стиля и*
подстановочный знак
Ниже приведены все допустимые пути маршрутизации в v6:
/groups
/groups/admin
/users/:id
/users/:id/messages
/files/*
/files/:id/*
/files-*
использоватьRegExp
Обычные совпадающие пути будут недействительны:
/users/:id?
/tweets/:id(\d+)
/files/*/cat.jpg
v6
Все совпадения пути будут игнорировать завершающий "в URL"/
". Фактически,<Route strict>
был удален и не действует в v6. Это не означает, что вам не нужно использовать косую черту.
существуетv5
Путь до версии, есть неоднозначность маршрутизации
- Текущий путь: "
/users
",но<Link to="me">
будет прыгать<a href="/me">
. - Текущий путь: "
/users/
",но<Link to="me">
будет прыгать<a href="/users/me">
.
React Router v6
Исправил эту двусмысленность, удалив хвост"/
":
- Текущий путь: "
/users
",но<Link to="me">
будет прыгать<a href="/users/me">
. - Текущий путь: "
/users
",но<Link to="../me">
будет прыгать<a href="/me">
.
Его форма больше похожа на командную строкуcd
Применение:
// 当前路径为 /app/dashboard
<Link to="stats"> // <a href="/app/dashboard/stats">
<Link to="../stats"> // <a href="/app/stats">
<Link to="../../stats"> // <a href="/stats">
<Link to="../../../stats"> // <a href="/stats">
// 命令行当前路径为 /app/dashboard
cd stats // pwd is /app/dashboard/stats
cd ../stats // pwd is /app/stats
cd ../../stats // pwd is /stats
cd ../../../stats // pwd is /stats
Эпилог
Справочная статья:
- [A Sneak Peek at React Router v6
](alligator.IO/реагировать/реагировать…)
❤️ После прочтения трех вещей
Если вы найдете этот контент вдохновляющим, я хотел бы пригласить вас сделать мне три небольших одолжения:
- Ставьте лайк, чтобы больше людей увидело этот контент
- Обратите внимание на «Учителей фронтенд-убеждения» и время от времени делитесь оригинальными знаниями.
- Также смотрите другие статьи
Персональный WeChat учителя-убеждающего:huab119
Вы также можете прийти ко мнеGitHub
Получите исходные файлы всех статей в блоге:
Руководство по убеждению:GitHub.com/Roger-Hi RO/…Давай поиграем. ~