react-router-domV6嵌套路由實(shí)現(xiàn)詳解
V6新特性
本片文章主要敘述react-router-dom v6版本基本使用介紹,下面開始梳理一下V6的新特性,以及嵌套路由的實(shí)現(xiàn)。
<Route>的屬性變更c(diǎn)omponent/render->element
// v5 <Route path='/login' component={<Suspense fallback={<Loading />}><Login /></Suspense>}> </Route> // v6 <Route path='/login' element={<Suspense fallback={<Loading />}><Login /></Suspense>}> </Route>
<Link/>使用變動
// 如果當(dāng)前url為/home // V5 <Link to="page1"> -> <Link to="/page1"> // V6做法 <Link to="page1"> -> <Link to="/home/page1">
當(dāng)前在 /home 我需要跳轉(zhuǎn)到/home/page1,在V5中是存在路由歧義的,但是V6已經(jīng)修復(fù)了
<Redirect/> 替換為 <Navigate/>
// v5 <Redirect to='/login'/> // v6 <Navigate to='/login' />
<Switch/> 重命名為 <Routes/>
// v5 // Suspense 異步加載 import {Switch,Router,Route} from 'react-router-dom' <Router> <Switch> <Route path='/login'> <Suspense fallback={<Loading />}><Login /></Suspense> </Route> <Route path='/*' > <Suspense fallback={<Loading />}><NotFound /></Suspense> </Route> </Switch> </Router> // v6 import {Routes,Router,Route} from 'react-router-dom' <Router> <Routes> <Route path='/login' element={<Suspense fallback={<Loading />}><Login /></Suspense>}> </Route> <Route path='/*' element={<Suspense fallback={<Loading />}><NotFound /></Suspense>}> </Route> </Routes> </Router>
V5中使用component或者render去渲染,或者被當(dāng)做子組件渲染,但是在V6這些方法都已經(jīng)element被淘汰
用useNavigate代替useHistory
// v5 let history = useHistory() history.push('/login'); history.replace('/login'); //v6 let navigate = useNavigate(); navigate('/login'); navigate('/login', {replace: true});
依賴包大小從20kb減少到8kb,整體體積減少
新鉤子useRoutes代替react-router-config
function Page() { let pages = useRoutes([ { path: '/login', element:<Login/> }, // 404找不到 { path: '*', element: <NotFound /> } ]); return pages; }
新標(biāo)簽:<Outlet/>
<Content style={{ height: '90vh' }}> <Outlet></Outlet> </Content>
<Outlet/>
的出現(xiàn)幫我們節(jié)省了很多代碼邏輯避免了多個(gè)< Routes />
,主要用于子組件顯示,作用類似于Vue中的router-view
V6嵌套路由實(shí)現(xiàn)
- 路由配置routers.js
export const routerItems = [ { path:'/', Component:lazy(()=>import('./views/root')), redirect:'/designdraft', roles:[USER_ROLES.ADMIN,USER_ROLES.TEST], children:[ { path:'designdraft', Component:lazy(()=>import('./views/designdraft/index')), roles:[USER_ROLES.ADMIN], }, { path:'code', Component:lazy(()=>import('./views/code/index')), roles:[USER_ROLES.ADMIN], children:[], }, ] }, { path:'/login', Component:lazy(()=>import('./views/login')), children:[] }, { path:'*', Component:lazy(()=>import('./views/404')), children:[] } ]
- 嵌套路由組件封裝
import{ Suspense,lazy, useEffect } from 'react'; import {routerItems } from '../routers'; // 引入 import { HashRouter as Router, Routes, Route, Navigate, } from 'react-router-dom'; // loading頁面 const Loading = () => ( <> <div className='loadsvg'> <div> loading... </div> </div> </> ) // 遞歸函數(shù) const rotuerViews = (routerItems)=>{ if(routerItems && routerItems.length){ return routerItems.map(({path,Component,children,redirect})=>{ return children && children.length ? ( <Route path={path} key={path} element={<Suspense fallback={<Loading/>}><Component/></Suspense>}> {rotuerViews(children)} // 遞歸遍歷子路由 {redirect? (<Route path={path} element={<Navigate to={redirect} />}></Route>): (<Route path={path} element={<Navigate to={children[0].path} />}></Route>) } </Route> ):( <Route key={path} path={path} element={ <Suspense fallback={<Loading/>}><Component/></Suspense>}> </Route> ) }) } } const PageView = () => { return ( <Router> <Routes> {rotuerViews(routerItems)} </Routes> </Router> ) } export default PageView;
- 視圖顯示
class Rootpage extends React.Component { // 狀態(tài)型組件 constructor(props) { super(props) } render() { // 頁面嵌套路由需要通過,遞歸路由組件,判斷是否存在redirect,進(jìn)行路由重定向 let token = sessionStorage.getItem('keys'); return ( <> <div> // 路由跳轉(zhuǎn) <NavLink to="/designdraft" state="admin">designdraft</NavLink> <NavLink to="/code" state="admin">code</NavLink> </div> <div> // 子路由視圖顯示 <Outlet></Outlet> </div> </> ) } } export default Rootpage
- V5版本的路由嵌套在這里不再過多敘述了,如果你用React足夠多,肯定會了解
React-Router-dom-V5
版本的嵌套是如何實(shí)現(xiàn)的
總結(jié)
React-Router-dom-V6
版本不管是在體積上還是在功能方面都做了很大的升級,例如上面嵌套路由的寫法來看V6確實(shí)比V5明顯要好很多,畢竟代碼量上就減少了不少??,還有就是修復(fù)了NavLink
的Url問題。關(guān)于新特性的內(nèi)容就講述這么多吧,還有沒提到的部分,自己可以去官方文檔了解一下
以上就是react-router-domV6嵌套路由實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于react-router-domV6嵌套路由的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
每天一個(gè)hooks學(xué)習(xí)之useUpdateEffect
這篇文章主要為大家介紹了每天一個(gè)hooks學(xué)習(xí)之useUpdateEffect使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05使用React-Router時(shí)出現(xiàn)的錯(cuò)誤及解決
這篇文章主要介紹了使用React-Router時(shí)出現(xiàn)的錯(cuò)誤及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-0330分鐘精通React今年最勁爆的新特性——React Hooks
這篇文章主要介紹了30分鐘精通React今年最勁爆的新特性——React Hooks,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03react native帶索引的城市列表組件的實(shí)例代碼
本篇文章主要介紹了react-native城市列表組件的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08采用React編寫小程序的Remax框架的編譯流程解析(推薦)
這篇文章主要介紹了采用React編寫小程序的Remax框架的編譯流程解析(推薦),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04React Router 中實(shí)現(xiàn)嵌套路由和動態(tài)路由的示例
React Router 是一個(gè)非常強(qiáng)大和靈活的路由庫,它為 React 應(yīng)用程序提供了豐富的導(dǎo)航和 URL 管理功能,能夠幫助我們構(gòu)建復(fù)雜的單頁應(yīng)用和多頁應(yīng)用,這篇文章主要介紹了React Router 中如何實(shí)現(xiàn)嵌套路由和動態(tài)路由,需要的朋友可以參考下2023-05-05React?Hooks項(xiàng)目實(shí)戰(zhàn)
React?Hooks是React?16.8版本引入的新特性,它使得在函數(shù)組件中也能夠使用狀態(tài)(state)和其他React特性,本文就來詳細(xì)介紹一下React?Hooks項(xiàng)目實(shí)戰(zhàn),感興趣的可以了解一下2023-11-11