react-router-dom5如何升級到6
前言
升級前版本為5.1.2
下載與運行
下載
npm install react-router-dom@6
運行
運行發(fā)現(xiàn)報錯:
將node_modules刪除,重新執(zhí)行npm i即可
運行發(fā)現(xiàn)如下報錯:
這是因為之前有引用react-router-dom.min,v6中取消了該文件,所以未找到文件導致報錯。
將引用變?yōu)閞eact-router-dom即可解決。
再次運行發(fā)現(xiàn)如下報錯:
這是因為react-router-dom6取消了withRouter,如果想要獲取路由地址,需要使用useLocation
變?yōu)?/p>
再次運行發(fā)現(xiàn)如下報錯:
按照官網進行如下修改:
Switch 被替換為 Routes
v5
時代的第一個被替代的是Switch組件
。
該Switch
組件用于包裝我們的路由,它確保每次只加載一個匹配的路由。
但這在 v6 中不再存在。我們使用Routes
組件來替換Switch
。
請注意,我們仍然需要導入BrowserRouter
包裝我們的應用程序,就像在 v5 中所做的那樣。
在 v5 中,我們是這樣做:
import { BrowserRouter, Switch } from "react-router-dom"; function App() { return ( <BrowserRouter> <div className="App"> <Switch> {/* 路由Route在此定義 */} </Switch> </div> </BrowserRouter> ); } export default App
但在 v6 中,我們將這樣做
import { BrowserRouter, Routes } from "react-router-dom"; function App() { return ( <BrowserRouter> <div className="App"> <Routes> {/* Switch 會被改成 Routes */} {/* 路由Route在此定義 */} </Routes> </div> </BrowserRouter> ); } export default App
注意:v5的Switch中可以包含非Route元素,但Routes中只能存在Route,否則會報錯。
Route組件使用更新
盡管該Route組件在 v6
中仍然保留一個位置,但我們定義它的使用方式與我們在 v5
中的方式不同。
我們將不再以 v5
中的任何方式放置我們想要渲染的組件,而是統(tǒng)一將其作為element
prop的值傳遞。
沒有exact配置
在 v5
中,不添加exact
作為Route組件
的props
的話,如果 URL 以 path 關鍵字開頭,則路徑將匹配,因為匹配過程是從上到下的順序。
但在 v6 中,我們將不再需要該exact
配置,因為路徑模式匹配算法已更改,并且現(xiàn)在更加增強。
在 v5 中,我們這樣做了:
<Switch> {/* 三種Route組件使用定義 */} <Route path="/signup" component={Product} /> {/* 或 */} {/* 這個方法允許我們將 props 傳遞給渲染的組件 */} <Route path="/games"> <Product id={2} /> </Route> {/* 或是通過render函數(shù) */} <Route path="/games" render={(props) => <Product {...props} />} /> </Switch>
在 v6 中,
<Routes> {" "} <Route path="/games" element={<Product />} /> {/* 帶有props的渲染組件 */} <Route path="/movies" element={<Product id={200} category="shirt" />} /> </Routes>
Links 和 NavLinks
Link
和NavLink
組件仍然可以運行在V6。Link
組件使用與在 v5 的時候保持一樣,但使用NavLink
組件時,刪除了activeClassName
和activeStyle
prop。在 v5 中,activeClassName
prop 用于在鏈接激活后自動將一些 CSS
類應用于鏈接,同時activeStyle
允許我們在鏈接激活時向鏈接添加內部樣式。
但是在 v6 中,現(xiàn)在可以使用一個函數(shù)來獲取有關鏈接活動狀態(tài)的信息。該函數(shù)的參數(shù)是一個具有屬性的對象isActive
。此屬性在鏈接處于活動狀態(tài)時為真,在非活動時為假。isActive
的值允許我們使用條件表達式來指示活動樣式或類名。
在 v5 中,
import {NavLink} from “react-router-dom” {/* … */} <NavLink to="/product" style={{ color: "#689" }} activeStyle={{ color: "#3072c9" }} className="nav_link" activeClassName="active" > Products </NavLink>
但在 v6 中,我們將這樣做:
<NavLink to="/product" style={({ isActive }) => ({ color: isActive ? "#3072c9" : "#689" })} className={({ isActive }) => `link${isActive ? " active" : ""}`} > Product </NavLink>
Navigate替代Redirect
在 v5 中,使用該Redirect
組件將一個頁面帶到另一個頁面,但它不再從 v6
中的 react-router-dom
導出。它已被Navigate
組件替換。
在 v5 中,
<Route path="/faq"> <Redirect to="/about" /> </Route> <Route path="/about" component={About} />
但在 v6 中,
<Route path="/games" element={<Navigate to="/about" />} />; <Route path="/games" element={<About />} />;
需要注意的是,如果只是按照Navigate上面代碼片段中的方式添加組件,它只會將導航到該路徑的導航推送到導航堆棧中,但是如果我們打算用新頁面替換當前頁面,我們將 replace 屬性添加到Navigate組件中,如下所示:
<Route path="/games" element={<Navigate replace to="/about" />} />;
嵌套路由
顧名思義,嵌套路由是放置在另一個路由中的路由。它們用于在子組件中呈現(xiàn)更具體的信息。在 v6 中,將嵌套路由放置為父路由的子路由。然后引入Outlet
組件,它是從渲染組件中的 react-router-dom
導出的,用于指定希望嵌套信息顯示在哪里。Outlet
組件不是必需的,但它使代碼更清晰。
在 v5 中,
import { useRouteMatch } from "react-router-dom"; function App() { return ( <BrowserRouter> <Switch> <Route exact path="/about" component={About} /> <Route path="/product" component={Product} /> </Switch> </BrowserRouter> ); } function Product() { let match = useRouteMatch(); return ( <div> <Switch> {/* match.path 返回父路由中指定的路徑。在這種情況下,它是“/product" */} <Route path={`${match.path}`}> <AllProducts /> </Route> {/* 匹配 /product/:id */} <Route path={`${match.path}/:id`}> <ProductDetail /> </Route> </Switch> </div> ); }
在 v6 中,
import { Outlet } from "react-router-dom"; function App() { return ( <Routes> <Route path="/about" element={<About />} /> <Route path="/product" element={<Product />}> {/* 這里嵌套路由的路徑是相對于父路由的路徑的。 */} {/* 這里變成 "/product/" */} <Route path="/" element={<AllProducts />} /> {/* 這里變成 "/product/:id" */} <Route path="/:id" element={<ProductDetail />} /> </Route> </Routes> ); } function Product() { return ( <Container> <> <div>Product</div> {/* 父組件的其他內容 */} </> {/* 這是嵌套信息開始的地方 */} <Outlet /> </Container> ); }
useNavigate代替useHistory
當用戶因路徑上發(fā)生的事件(例如單擊按鈕、API 請求完成等)而被重定向時,就會發(fā)生程序化導航。在 v5 中,可以使用useHistory
鉤子來執(zhí)行以下操作:
import { useHistory } from "react-router-dom"; function Product() { const history = useHistory(); const handleClick = () => { //這會將新路線推送到導航堆棧的頂部 history.push("/new-route"); history.push({pathname:"/new-route",state:{p1:xxx}); // 傳參 //這會將當前路線替換為導航堆棧中的新路由 history.replace("/new-route"); }; return ( <div> <button>點擊我重定向到新路由</button> </div> ); }
但是在 v6 中,useHistory
hook 被替換為useNavigate
hook,并且以不同的方式使用它。
import { useNavigate } from "react-router-dom"; function Product() { const navigate = useNavigate(); const handleClick = () => { //這會將新路線推送到導航堆棧的頂部 navigate("/new-route"); navigate("/new-route",{state:{p1:xxx}}); // 傳參 //這會將當前路線替換為導航堆棧中的新路由 navigate("/new-route", { replace: true }); }; return ( <div> <button>點擊我重定向到新路由</button> </div> ); }
一件很酷的事情是以在導航堆棧上任意前進和后退。通過使用正數(shù)作為上述參數(shù)navigate()
,路由會向前移動該步數(shù)。負數(shù)向后做同樣的事情
// Goes forward navigate(1) // Goes forward twice navigate(2) // Goes backward navigate(-1) // Goes backward three times navigate(-3)
刪除Prompt組件
Prompt如果有未保存的更改,v5 中的組件可防止意外離開頁面。但是 react-router
團隊并沒有將它包含在 v6
中,也沒有替代方案。因此,如果你需要該功能,你可以手動實現(xiàn)它或返回到 v5。
除了不包括Prompt
在當前版本(v6)中,useBlocker
和usePrompt
都不起作用。react-router
團隊雖然在官方文檔中表示,他們目前正在努力將其添加回 v6
,但不是針對 6.x 的第一個穩(wěn)定版本。
注意
react-router-dom5的Switch可以嵌套Redirect
但react-router-dom6的Routes中只可以存在Route和Route.Fragment
v5的Router寫法,需要利用history
import { createBrowserHistory } from "history" const customHistory = createBrowserHistory() const Root = () => { return ( <Router history={customHistory}> ...... </Router> ) }
v6直接更改路由引入方式即可
import { BrowserRouter } from "react-router-dom" const Root = () => { return ( <BrowserRouter> ...... </BrowserRouter> ) }
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
react用Redux中央倉庫實現(xiàn)一個todolist
這篇文章主要為大家詳細介紹了react用Redux中央倉庫實現(xiàn)一個todolist,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09使用React+ts實現(xiàn)無縫滾動的走馬燈詳細過程
這篇文章主要給大家介紹了關于使用React+ts實現(xiàn)無縫滾動的走馬燈詳細過程,文中給出了詳細的代碼示例以及圖文教程,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2023-08-08使用React+SpringBoot開發(fā)一個協(xié)同編輯的表格文檔實現(xiàn)步驟
隨著云計算和團隊協(xié)作的興起,協(xié)同編輯成為了許多企業(yè)和組織中必不可少的需求,本文小編就將為大家介紹如何使用React+SpringBoot簡單的開發(fā)一個協(xié)同編輯的表格文檔,感興趣的朋友一起看看吧2023-11-11