網站首頁 編程語言 正文
V6新特性
本片文章主要敘述react-router-dom?v6版本基本使用介紹,下面開始梳理一下V6的新特性,以及嵌套路由的實現。
<Route>的屬性變更component/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/>使用變動
// 如果當前url為/home // V5 <Link to="page1"> -> <Link to="/page1"> // V6做法 <Link to="page1"> -> <Link to="/home/page1">
當前在 /home 我需要跳轉到/home/page1,在V5中是存在路由歧義的,但是V6已經修復了
<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去渲染,或者被當做子組件渲染,但是在V6這些方法都已經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; }
新標簽:<Outlet/>
<Content style={{ height: '90vh' }}> <Outlet></Outlet> </Content>
<Outlet/>
的出現幫我們節省了很多代碼邏輯避免了多個< Routes />
,主要用于子組件顯示,作用類似于Vue中的router-view
V6嵌套路由實現
- 路由配置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> </> ) // 遞歸函數 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 { // 狀態型組件 constructor(props) { super(props) } render() { // 頁面嵌套路由需要通過,遞歸路由組件,判斷是否存在redirect,進行路由重定向 let token = sessionStorage.getItem('keys'); return ( <> <div> // 路由跳轉 <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
版本的嵌套是如何實現的
總結
React-Router-dom-V6
版本不管是在體積上還是在功能方面都做了很大的升級,例如上面嵌套路由的寫法來看V6確實比V5明顯要好很多,畢竟代碼量上就減少了不少??,還有就是修復了NavLink
的Url問題。關于新特性的內容就講述這么多吧,還有沒提到的部分,自己可以去官方文檔了解一下
原文鏈接:https://juejin.cn/post/7075585581706641415
相關推薦
- 2023-03-15 React受控組件與非受控組件實例分析講解_React
- 2024-03-18 bootstrap application 和 nacos 中配置文件的優先級
- 2022-10-06 C#?獲取本機IP地址(IPv4和IPv6)_C#教程
- 2023-10-30 Spring的BeanFactory與FactoryBean的區別
- 2022-10-04 Android實現圓圈倒計時_Android
- 2023-01-30 Python中String模塊示例詳解_python
- 2022-05-06 嵌入式C語言輕量級程序架構內核編寫_C 語言
- 2022-09-07 Python的flask常用函數route()_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支