網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
React Router應(yīng)該是React生態(tài)系統(tǒng)中最受歡迎的庫(kù)了,npm周下載量達(dá)600w+,github也有45.2k的加星,足以說(shuō)明它是一款非常優(yōu)秀的庫(kù),作為React社區(qū)重要的庫(kù),它經(jīng)歷了多次迭代和重大更改,就在上個(gè)月,更是迎來(lái)了一個(gè)大的正式版更新6.x,當(dāng)前最新為6.0.2,相對(duì)比于之前的5.x版本做出了較大改變,不管從用法還是從性能上都有了明顯的提升,本文也將用新老版本對(duì)比的方式讓你能以最快的速度上手新用法
話不多說(shuō),先列出6.0做出的改變之處:
- 用法變化
- 替換為
- 嵌套路由新寫(xiě)法
- 推出全新hook,全面擁抱函數(shù)組件
- 基于對(duì)象的路由,實(shí)現(xiàn)js配置所有路由
- 整體代碼比上個(gè)版本減小大約70%
用法變化
組件變化較大,移除了component與render屬性,使用element屬性替代,因?yàn)榕c之前的版本代碼寫(xiě)法不能兼容,寫(xiě)法區(qū)別如下?
?// 5.x用法 ? ?<Route path="/home" component={Home} /> ? ?<Route path="/login" render={()=><Login/>}/> ? ?// 6.x用法 ? ?<Route path="/home" element={<Home/>} /> ? ?<Route path="/login" component={<Login/>} />
替換為
v6版本移除了 組件,并使用替換,除了能替代 組件的功能外,也做了一些改變,比如所有的都必須包裹在中,否則拋出錯(cuò)誤
?// 5.x用法 ? ?<Switch> ? ? ? ?<Route path="/home" component={Home} /> ? ? ? ?<Route path="/login" component={Login} /> ? ?</Switch> ? ?// 6.x用法 ? ? <Routes> ? ? ? ?<Route path="/home" element={<Home/>} /> ? ? ? ?<Route path="/login" component={<Login/>} /> ? ?</Routes>
嵌套路由
v6版本的react-router支持多種嵌套路由寫(xiě)法,寫(xiě)法分別如下:
第一種寫(xiě)法:延續(xù)v5版本寫(xiě)法,保持原有組件結(jié)構(gòu) 這種寫(xiě)法比較適合重構(gòu)的項(xiàng)目,不需要改變太多的代碼便能過(guò)渡到v6版本
? // App.jsx ? ?<Routes> ? ? ? ?<Route path="/home" element={<Home/>} /> ? ? ? ?<Route path="/user/*" element={<User/>} /> ? ?</Routes> ? ?// User.jsx ? ?<Routes> ? ? ? ?<Route path="profile" element={<UserProfile/>} /> ? ? ? ?<Route path=":/id" element={<UserDetail/>} /> ? ?</Routes>
雖然組件結(jié)構(gòu)與v5版本一至,但寫(xiě)法上有一定的差異,父組件App.jsx中的path屬性最后必須使用星號(hào)(path="/user/*"),子組件User.jsx中的路徑都是相對(duì)于其父級(jí)路徑,所以不需要像v5版本那樣寫(xiě)全整個(gè)路徑,媽媽再也不用擔(dān)心我會(huì)寫(xiě)錯(cuò)地址。
另外,如果中的path屬性不以/開(kāi)頭,則是相對(duì)于其父級(jí)路徑,這樣的好處是使嵌套路由實(shí)現(xiàn)變得更加簡(jiǎn)單,并易于組合復(fù)雜的路由和布局
第二種寫(xiě)法:把所有的寫(xiě)在一起,配合實(shí)現(xiàn)路由組件的顯示
?// App.jsx ? ?<Routes> ? ? ? ?<Route path="/home" element={<Home/>} /> ? ? ? ?<Route path="/user" element={<User/>}> ? ? ? ? ? ?<Route path="profile" element={<UserProfile/>} /> ? ? ? ? ? ?<Route path=":/id" element={<UserDetail/>} /> ? ? ? ?</Route> ? ?</Routes> ? ?// User.jsx ? ?<Outlet/>
這樣寫(xiě)法讓我們能更清晰地去了解路由結(jié)構(gòu),能更好地管理我們的路由,而能讓我們能更精確地把嵌套的路由組件布局到需要位置顯示
第三種寫(xiě)法:使用useRoutes()實(shí)現(xiàn)路由配置
使用useRoutes配置路由與配置路由效果一致,只是這種寫(xiě)法使用javascript生成路由,不依賴JSX,返回相應(yīng)結(jié)構(gòu)的路由組件樹(shù),有木有感覺(jué)回到了VueRouter?有木有?
function App(){ // 以下寫(xiě)法與第二種寫(xiě)法效果一至 const element = useRoutes([ {path:'/home',element:<Home/>}, { path:'/user', element:<User/>, children:[ {path:'profile',element:<UserProfile/>}, {path:':/id',element:<UserDetail/>}, ] } ]) return element }
以上三種寫(xiě)法各有各的優(yōu)點(diǎn),開(kāi)發(fā)者可以根據(jù)自身的需求選擇一種來(lái)實(shí)現(xiàn)你的嵌套路由
重定向
新版本的react-router移除了組件,但可以使用新增的組件配合組件實(shí)現(xiàn)重定向效果
<Routes> ? ? ? ?<Route path="/home" element={<Home/>} /> ? ? ? ?<Route path="/" element={<Navigate to="/home"/>}> ? ?</Routes>
路由跳轉(zhuǎn)
路由配置好后免不了要進(jìn)行頁(yè)面跳轉(zhuǎn),但新版的react-router移除了history對(duì)象,故不能使用v5版本的history(包括useHistory hook)已不能使用,我們可以使用以下兩中方式進(jìn)行跳轉(zhuǎn)
使用或進(jìn)行跳轉(zhuǎn)這種方式與上一個(gè)版本幾乎沒(méi)有太大的區(qū)別,唯一的區(qū)別是組件的高亮寫(xiě)法發(fā)生了變化
// v5版本 <NavLink to="/home" activeStyle={{color:'#f00'}}>首頁(yè)</NavLink> <NavLink to="/home" activeClassName="active">首頁(yè)</NavLink> // v6版本 <NavLink to="/home" style={({isActive})=>(isActive?{color:'#f00'}:{})}>首頁(yè)</NavLink> <NavLink to="/home" className={({isActive})=>isActive?'current':''}>首頁(yè)</NavLink>
PS: 默認(rèn)已經(jīng)有一個(gè)高亮的active類(lèi),可以直接使用,不需要額外設(shè)置
使用useNavigate()進(jìn)行跳轉(zhuǎn)有時(shí)候我們并不能使用以上兩個(gè)組件進(jìn)行跳轉(zhuǎn),如根據(jù)ajax請(qǐng)求返回值跳轉(zhuǎn)不同的頁(yè)面,這時(shí)我們就得使用js的方式時(shí)行跳轉(zhuǎn)了,雖然新版的react-router已經(jīng)移除掉history對(duì)象,但給我們提供了 useNavigate hook實(shí)現(xiàn)路由跳轉(zhuǎn),使用方法如下
?import { useNavigate } from "react-router-dom"; ? ?let navigate = useNavigate(); ? ?navigate(`/home`); ? ?// 跳轉(zhuǎn)且不保留瀏覽記錄 ? ?navigate(`/home`,{replace:true}); ? ?// 返回上一頁(yè) ? ?navigate(-1) ? ?// 對(duì)象方式跳轉(zhuǎn) ? ?navigate({ ? ? ? ?pathname:'/home' ? })
需要注意一點(diǎn)就是,在v6版本的react-router中,如果跳轉(zhuǎn)的路徑如果不是以/開(kāi)頭,則為相對(duì)路徑,相對(duì)于其父級(jí)路由路徑,這樣的設(shè)置能讓我們更好的控制跳轉(zhuǎn)
路由傳參
我們都知道,在進(jìn)行路由跳轉(zhuǎn)時(shí),可以附帶一些參數(shù)一起傳遞到跳轉(zhuǎn)頁(yè)面,新版的react-router已經(jīng)從props中移除了history、location、match,也移除掉了withRouter高階組件,所以無(wú)法使用老版本的方式傳參與接收,新版用法如下
search傳參
?let navigate = useNavigate(); ? ?navigate(`/home?page=1&size=10`); ? ?navigate({ ? ? ? ?pathname:'/home', ? ? ? ?search:'page=1&size=10' ? });
在對(duì)應(yīng)組件接收參數(shù)也很簡(jiǎn)單,使用useSearchParams hook進(jìn)行接收,得到URLSearchParams對(duì)象以及設(shè)置search參數(shù)函數(shù)組成的數(shù)據(jù)
? ?function Home(){ ? ? ? ?const [searchParams,setSearchParams] = useSearchParams() ? ? ? ?searchParams.get('page');//1 ? ? ? ?searchParams.get('size');//10 ? ? ? ?return ( ? ? ? ? ? ?<div>首頁(yè)</div> ? ? ? ) ? }
動(dòng)態(tài)路由傳參
<Route path="/user" element={<User/>}> <Route path=":/id" element={<UserDetail/>} /> </Route>
配置完以上路由后,當(dāng)頁(yè)面跳轉(zhuǎn)到/user/123這個(gè)路徑時(shí),可以在組件中使用useParams hook獲取123這個(gè)id
function UserDetail(){ const {id} = useParams() return ( <div>id:{id}</div> ) }
state傳參通過(guò)、或 useNavigate進(jìn)行跳轉(zhuǎn)時(shí),都可以傳遞state參數(shù),用法如下:
<Link to="/home" state={{idx:1,key:'qf'}}>首頁(yè)</Link> navigate('/home',{state:{idx:1,key:'qf'}})
在首頁(yè)組件中通過(guò)useLocation hook獲取state值
function Home(){ const {state} = useLocation(); state.idx; // 1 state.key; // qf return ( <div>首頁(yè)</div> ) }
其他
另外,React路由同樣支持SSR服務(wù)端渲染等其它功能,由于篇幅在限,在此不做過(guò)多說(shuō)明,感興趣的小伙伴請(qǐng)繼續(xù)關(guān)注我,后續(xù)的寫(xiě)文章專(zhuān)門(mén)介紹react-router在在服務(wù)端的用法。
總結(jié)
原文鏈接:https://blog.csdn.net/sdasadasds/article/details/122554211
相關(guān)推薦
- 2023-01-05 Kotlin?高階函數(shù)與Lambda表達(dá)式示例詳解_Android
- 2023-01-13 Go?cobra庫(kù)使用教程_Golang
- 2022-07-03 python調(diào)用騰訊云實(shí)名認(rèn)證接口辨別身份證真假_python
- 2022-03-26 Android?Studio中Logcat寫(xiě)入和查看日志_Android
- 2022-10-10 React?Hooks鉤子中API的使用示例分析_React
- 2022-11-07 Vite+React搭建開(kāi)發(fā)構(gòu)建環(huán)境實(shí)踐記錄_React
- 2022-07-11 Python標(biāo)準(zhǔn)庫(kù)uuid模塊(生成唯一標(biāo)識(shí))詳解_python
- 2022-07-30 C++簡(jiǎn)明圖解分析淺拷貝與深拷貝_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支