react-router-dom6(對比?router5)快速入門指南
React Router 6 快速上手
在之前的文章中,我們已經(jīng)學(xué)習(xí)了react-router-dom v5的內(nèi)容,在react-router-dom v6版本中,對舊版本的API以及一些組件做了些許修改。本文開始,我將帶大家學(xué)習(xí)最新的react-router-dom v6版本的路由知識,并且會與v5老版本進行一些對比。
需要學(xué)習(xí)react-router-dom v5版本的可以點擊:
1.概述
- React Router 以三個不同的包發(fā)布到npm上,它們分別為:
- react-router:路由的核心庫,提供了很多的:組件、鉤子
- react-router-dom:包含react-router所有內(nèi)容,并添加了一些專門用于DOM的組件,例如
<BrowserRouter>
等 - react-router-native:包括react-router所有內(nèi)容,并添加一些專門用于ReactNative的API,例如
<NativeRouter>
等
- 與React Router 5.x版本相比,改變了什么?
- 內(nèi)置組件的變化:移除
<Switch />
,新增<Routes />
等 - 語法的變化:
component={About}
變?yōu)?code>element={<About />}等 - 新增多個hook:
useParams
、useNavigate
、useMatch
等 - 官方明確推薦函數(shù)式組件!
- 內(nèi)置組件的變化:移除
2.基本使用
我們還是使用之前講解react-router-dom@5的示例。
import React, { Fragment } from 'react' import { NavLink, Routes, Route } from 'react-router-dom' import About from './pages/About' import Home from './pages/Home' export default function App() { return ( <Fragment> <div> <div className="row"> <div className="col-xs-offset-2 col-xs-8"> <div className="page-header"><h2>React Router Demo</h2></div> </div> </div> <div className="row"> <div className="col-xs-2 col-xs-offset-2"> <div className="list-group"> // 編寫路由鏈接 <NavLink className='list-group-item' to="/home">Home</NavLink > <NavLink className='list-group-item' to="/about">About</NavLink > </div> </div> <div className="col-xs-6"> <div className="panel"> <div className="panel-body"> {/* 注冊路由 */} <Routes> <Route path='/about' element={<About />} /> <Route path='/home' element={<Home />} /> </Routes> </div> </div> </div> </div> </div> </Fragment> ) }
注意??,在v6版本中,依舊需要將外層App組件用 < B r o w s e r R o u t e r > <BrowserRouter> <BrowserRouter>標(biāo)簽包裹起來。
const root = ReactDOM.createRoot(document.getElementById('root')) root.render( <React.StrictMode> <BrowserRouter> <App /> </BrowserRouter> </React.StrictMode>, );
3.重定向
在react-router-dom v5版本中,我們是使用Redirect
進行重定向的,但是在新版本中呢,刪除了Redirect
,換成了另一個叫做:Navigate
。
// 重定向 // react-router-dom v5 <Redirect to="/home" /> // react-router-dom v6 <Route path='/' element={<Navigate to="/home" />} />
值得注意的是,Navigate
組件接收兩個屬性,一個是上面提到的to屬性,另一個屬性是replace
。
<Navigate to="/about" replace />
我們知道,路由的跳轉(zhuǎn)有兩種模式,一種是push
,push會將這個url壓入路由history棧頂; 而replace
模式會將棧頂?shù)膗rl替換 。
Navigate
組件中可以設(shè)置replace
的值為true或者false,默認(rèn)為false
,也就是重定向默認(rèn)是push
模式跳轉(zhuǎn)。
4.NavLink高亮
高亮樣式
.LinkBackColor { background-color: orange !important; color: white !important; }
修改高亮之前
修改高亮之后
react-router-dom v5中,實現(xiàn)NavLink高亮使用的是NavLink組件標(biāo)簽中的activeClassName
屬性。
<NavLink activeClassName='LinkBackColor' className="list-group-item" to="/about">About</NavLink>
但是在新版本v6中,我們?nèi)绻雽崿F(xiàn)NavLink高亮效果,需要將className
屬性設(shè)置為一個函數(shù)。
<NavLink className={ ({ isActive }) => { return isActive ? "list-group-item LinkBackColor" : "list-group-item" } } to="/about">About</NavLink >
代碼優(yōu)化
將計算className的值封裝成一個函數(shù)
function computedClassName({ isActive }) { return isActive ? "list-group-item LinkBackColor" : "list-group-item" } <NavLink className={computedClassName} to="/home">Home</NavLink >
5.useRoutes路由表
在Vue中,Vue CLI
腳手架搭建完畢之后,項目目錄中就會有一個router
文件夾,里面就是用來存放路由表的。
在react-router-dom v6版本中,也可以很輕松的把路由都中心化地維護在路由表中了。
src結(jié)構(gòu) ├─App.jsx ├─index.js ├─routes | └index.js ├─pages | ├─About.jsx | └Home.jsx
/routes/index.js
import { Navigate } from "react-router-dom" import About from "../pages/About" import Home from "../pages/Home" export default [ { path: '/about', element: <About /> }, { path: '/home', element: <Home /> }, { path: '/', element: <Navigate to="/about" /> } ]
使用路由表
import { NavLink, useRoutes } from 'react-router-dom' import routes from './routes' // 根據(jù)路由表生成對應(yīng)的路由規(guī)則 const element = useRoutes(routes) // 注冊路由 + {element} - <Routes> - <Route path='/about' element={<About />} /> - <Route path='/home' element={<Home />} /> - <Route path='/' element={<Navigate to="/about" />} /> - </Routes>
6.嵌套路由(Outlet)
如圖所示,Message與News都是Home組件下的子路由組件,這里的/home/message與/home/news就發(fā)生了路由的嵌套。
我們還是使用路由表來統(tǒng)一維護路由組件。
首先修改路由表:
{ path: '/home', element: <Home />, children: [ { path: 'message', element: <Message /> }, { path: 'news', element: <News /> } ] },
將嵌套的二級路由放在children屬性
中注冊,這一點與Vue
類似。
Home組件:
import React from 'react' import { NavLink, Outlet } from 'react-router-dom' export default function Home() { return ( <div> <h2>Home組件內(nèi)容</h2> <div> <ul className="nav nav-tabs"> <li> <NavLink className='list-group-item' to='news'>News</NavLink> </li> <li> <NavLink className='list-group-item' to='message'>Message</NavLink> </li> </ul> {/* 指定路由組件呈現(xiàn)的位置 */} <Outlet /> </div> </div> ) }
<NavLink className='list-group-item' to='news'>News</NavLink> 中的to屬性有三種寫法: 1. to='news' 2. to='./news' 3. to='/home/news' //這一種與react-router-dom5中一樣
Outlet
組件用于指定嵌套路由組件呈現(xiàn)的位置,詳細的說明會在后續(xù)專欄文章《總結(jié)路由API》中提到。
到此這篇關(guān)于快速上手react-router-dom6(對比 router5)的文章就介紹到這了,更多相關(guān)react-router-dom6內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React實現(xiàn)多個場景下鼠標(biāo)跟隨提示框詳解
這篇文章主要為大家介紹了React實現(xiàn)多個場景下鼠標(biāo)跟隨提示框詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09在react中使用highlight.js將頁面上的代碼高亮的方法
本文通過 highlight.js 庫實現(xiàn)對文章正文 HTML 中的代碼元素自動添加語法高亮,具有一定的參考價值,感興趣的可以了解一下2022-01-01React使用context進行跨級組件數(shù)據(jù)傳遞
這篇文章給大家介紹了React使用context進行跨級組件數(shù)據(jù)傳遞的方法步驟,文中通過代碼示例給大家介紹的非常詳細,對大家學(xué)習(xí)React context組件數(shù)據(jù)傳遞有一定的幫助,感興趣的小伙伴跟著小編一起來學(xué)習(xí)吧2024-01-01圖文示例講解useState與useReducer性能區(qū)別
這篇文章主要為大家介紹了useState與useReducer性能區(qū)別圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05