react-router-domV6嵌套路由實(shí)現(xiàn)詳解
V6新特性
本片文章主要敘述react-router-dom v6版本基本使用介紹,下面開(kāi)始梳理一下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)
// 如果當(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});
依賴(lài)包大小從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 />,主要用于子組件顯示,作用類(lèi)似于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頁(yè)面
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() {
// 頁(yè)面嵌套路由需要通過(guò),遞歸路由組件,判斷是否存在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版本的路由嵌套在這里不再過(guò)多敘述了,如果你用React足夠多,肯定會(huì)了解
React-Router-dom-V5版本的嵌套是如何實(shí)現(xiàn)的
總結(jié)
React-Router-dom-V6版本不管是在體積上還是在功能方面都做了很大的升級(jí),例如上面嵌套路由的寫(xiě)法來(lái)看V6確實(shí)比V5明顯要好很多,畢竟代碼量上就減少了不少??,還有就是修復(fù)了NavLink的Url問(wèn)題。關(guān)于新特性的內(nèi)容就講述這么多吧,還有沒(méi)提到的部分,自己可以去官方文檔了解一下
以上就是react-router-domV6嵌套路由實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于react-router-domV6嵌套路由的資料請(qǐng)關(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à)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
30分鐘精通React今年最勁爆的新特性——React Hooks
這篇文章主要介紹了30分鐘精通React今年最勁爆的新特性——React Hooks,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
react native帶索引的城市列表組件的實(shí)例代碼
本篇文章主要介紹了react-native城市列表組件的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
采用React編寫(xiě)小程序的Remax框架的編譯流程解析(推薦)
這篇文章主要介紹了采用React編寫(xiě)小程序的Remax框架的編譯流程解析(推薦),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
React Router 中實(shí)現(xiàn)嵌套路由和動(dòng)態(tài)路由的示例
React Router 是一個(gè)非常強(qiáng)大和靈活的路由庫(kù),它為 React 應(yīng)用程序提供了豐富的導(dǎo)航和 URL 管理功能,能夠幫助我們構(gòu)建復(fù)雜的單頁(yè)應(yīng)用和多頁(yè)應(yīng)用,這篇文章主要介紹了React Router 中如何實(shí)現(xiàn)嵌套路由和動(dòng)態(tài)路由,需要的朋友可以參考下2023-05-05
React?Hooks項(xiàng)目實(shí)戰(zhàn)
React?Hooks是React?16.8版本引入的新特性,它使得在函數(shù)組件中也能夠使用狀態(tài)(state)和其他React特性,本文就來(lái)詳細(xì)介紹一下React?Hooks項(xiàng)目實(shí)戰(zhàn),感興趣的可以了解一下2023-11-11

