最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react-router-dom5如何升級(jí)到6

 更新時(shí)間:2024年01月03日 09:32:52   作者:田本初  
這篇文章主要介紹了react-router-dom5如何升級(jí)到6問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

升級(jí)前版本為5.1.2

下載與運(yùn)行

下載

npm install react-router-dom@6

運(yùn)行

運(yùn)行發(fā)現(xiàn)報(bào)錯(cuò):

將node_modules刪除,重新執(zhí)行npm i即可

運(yùn)行發(fā)現(xiàn)如下報(bào)錯(cuò):

這是因?yàn)橹坝幸胷eact-router-dom.min,v6中取消了該文件,所以未找到文件導(dǎo)致報(bào)錯(cuò)。

將引用變?yōu)閞eact-router-dom即可解決。

再次運(yùn)行發(fā)現(xiàn)如下報(bào)錯(cuò):

這是因?yàn)閞eact-router-dom6取消了withRouter,如果想要獲取路由地址,需要使用useLocation

變?yōu)?/p>

再次運(yùn)行發(fā)現(xiàn)如下報(bào)錯(cuò):

按照官網(wǎng)進(jìn)行如下修改:

Switch 被替換為 Routes

v5 時(shí)代的第一個(gè)被替代的是Switch組件。

Switch組件用于包裝我們的路由,它確保每次只加載一個(gè)匹配的路由。

但這在 v6 中不再存在。我們使用Routes組件來替換Switch。

請(qǐng)注意,我們?nèi)匀恍枰獙?dǎo)入BrowserRouter包裝我們的應(yīng)用程序,就像在 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 會(huì)被改成 Routes */}
                    {/* 路由Route在此定義 */}
                </Routes>
            </div>
        </BrowserRouter>
    );
}

export default App

注意:v5的Switch中可以包含非Route元素,但Routes中只能存在Route,否則會(huì)報(bào)錯(cuò)。

Route組件使用更新

盡管該Route組件在 v6 中仍然保留一個(gè)位置,但我們定義它的使用方式與我們?cè)?v5 中的方式不同。

我們將不再以 v5 中的任何方式放置我們想要渲染的組件,而是統(tǒng)一將其作為elementprop的值傳遞。

沒有exact配置

v5 中,不添加exact作為Route組件props的話,如果 URL 以 path 關(guān)鍵字開頭,則路徑將匹配,因?yàn)槠ヅ溥^程是從上到下的順序。

但在 v6 中,我們將不再需要該exact配置,因?yàn)槁窂侥J狡ヅ渌惴ㄒ迅?,并且現(xiàn)在更加增強(qiáng)。

在 v5 中,我們這樣做了:

<Switch>
   {/* 三種Route組件使用定義 */}
   <Route path="/signup" component={Product} />
   {/* 或 */}
   {/* 這個(gè)方法允許我們將 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

LinkNavLink組件仍然可以運(yùn)行在V6。Link組件使用與在 v5 的時(shí)候保持一樣,但使用NavLink組件時(shí),刪除了activeClassNameactiveStyle prop。在 v5 中,activeClassNameprop 用于在鏈接激活后自動(dòng)將一些 CSS 類應(yīng)用于鏈接,同時(shí)activeStyle允許我們?cè)阪溄蛹せ顣r(shí)向鏈接添加內(nèi)部樣式。

但是在 v6 中,現(xiàn)在可以使用一個(gè)函數(shù)來獲取有關(guān)鏈接活動(dòng)狀態(tài)的信息。該函數(shù)的參數(shù)是一個(gè)具有屬性的對(duì)象isActive。此屬性在鏈接處于活動(dòng)狀態(tài)時(shí)為,在非活動(dòng)時(shí)為。isActive的值允許我們使用條件表達(dá)式來指示活動(dòng)樣式或類名。

在 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組件將一個(gè)頁面帶到另一個(gè)頁面,但它不再從 v6 中的 react-router-dom 導(dǎo)出。它已被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上面代碼片段中的方式添加組件,它只會(huì)將導(dǎo)航到該路徑的導(dǎo)航推送到導(dǎo)航堆棧中,但是如果我們打算用新頁面替換當(dāng)前頁面,我們將 replace 屬性添加到Navigate組件中,如下所示:

<Route path="/games" element={<Navigate replace to="/about" />} />;

嵌套路由

顧名思義,嵌套路由是放置在另一個(gè)路由中的路由。它們用于在子組件中呈現(xiàn)更具體的信息。在 v6 中,將嵌套路由放置為父路由的子路由。然后引入Outlet組件,它是從渲染組件中的 react-router-dom 導(dǎo)出的,用于指定希望嵌套信息顯示在哪里。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 />}>
               {/* 這里嵌套路由的路徑是相對(duì)于父路由的路徑的。 */}
               {/* 這里變成 "/product/" */}
               <Route path="/" element={<AllProducts />} />
               {/* 這里變成 "/product/:id" */}
               <Route path="/:id" element={<ProductDetail />} />

           </Route>
       </Routes>
   );
}

function Product() {
   return (
       <Container>
           <>
               <div>Product</div>
               {/* 父組件的其他內(nèi)容 */}
           </>
           {/* 這是嵌套信息開始的地方 */}
           <Outlet />
       </Container>
   );
}

useNavigate代替useHistory

當(dāng)用戶因路徑上發(fā)生的事件(例如單擊按鈕、API 請(qǐng)求完成等)而被重定向時(shí),就會(huì)發(fā)生程序化導(dǎo)航。在 v5 中,可以使用useHistory鉤子來執(zhí)行以下操作:

import { useHistory } from "react-router-dom";

function Product() {
   const history = useHistory();

   const handleClick = () => {
       //這會(huì)將新路線推送到導(dǎo)航堆棧的頂部
       history.push("/new-route");
       history.push({pathname:"/new-route",state:{p1:xxx});  // 傳參

       //這會(huì)將當(dāng)前路線替換為導(dǎo)航堆棧中的新路由
       history.replace("/new-route");
   };

   return (
       <div>
           <button>點(diǎn)擊我重定向到新路由</button>
       </div>
   );
}

但是在 v6 中,useHistoryhook 被替換為useNavigatehook,并且以不同的方式使用它。

import { useNavigate } from "react-router-dom";

function Product() {
   const navigate = useNavigate();

   const handleClick = () => {
       //這會(huì)將新路線推送到導(dǎo)航堆棧的頂部
       navigate("/new-route");
	   navigate("/new-route",{state:{p1:xxx}});  // 傳參

       //這會(huì)將當(dāng)前路線替換為導(dǎo)航堆棧中的新路由
       navigate("/new-route", { replace: true });
   };

   return (
       <div>
           <button>點(diǎn)擊我重定向到新路由</button>
       </div>
   );
}

一件很酷的事情是以在導(dǎo)航堆棧上任意前進(jìn)和后退。通過使用正數(shù)作為上述參數(shù)navigate(),路由會(huì)向前移動(dòng)該步數(shù)。負(fù)數(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 團(tuán)隊(duì)并沒有將它包含在 v6 中,也沒有替代方案。因此,如果你需要該功能,你可以手動(dòng)實(shí)現(xiàn)它或返回到 v5。

除了不包括Prompt在當(dāng)前版本(v6)中,useBlockerusePrompt都不起作用。react-router 團(tuán)隊(duì)雖然在官方文檔中表示,他們目前正在努力將其添加回 v6,但不是針對(duì) 6.x 的第一個(gè)穩(wěn)定版本。

注意

react-router-dom5的Switch可以嵌套R(shí)edirect

但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>
	)
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • react實(shí)現(xiàn)鼠標(biāo)懸停在SVG地圖上某個(gè)區(qū)域時(shí)上方呈現(xiàn)柱形圖效果

    react實(shí)現(xiàn)鼠標(biāo)懸停在SVG地圖上某個(gè)區(qū)域時(shí)上方呈現(xiàn)柱形圖效果

    這篇文章主要介紹了react實(shí)現(xiàn)鼠標(biāo)懸停在SVG地圖上某個(gè)區(qū)域時(shí),其上方呈現(xiàn)柱形圖,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • React Router 中實(shí)現(xiàn)嵌套路由和動(dòng)態(tài)路由的示例

    React Router 中實(shí)現(xiàn)嵌套路由和動(dòng)態(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)嵌套路由和動(dòng)態(tài)路由,需要的朋友可以參考下
    2023-05-05
  • React之虛擬DOM的實(shí)現(xiàn)原理

    React之虛擬DOM的實(shí)現(xiàn)原理

    這篇文章主要介紹了React之虛擬DOM的實(shí)現(xiàn)原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • react router4+redux實(shí)現(xiàn)路由權(quán)限控制的方法

    react router4+redux實(shí)現(xiàn)路由權(quán)限控制的方法

    本篇文章主要介紹了react router4+redux實(shí)現(xiàn)路由權(quán)限控制的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • 教你如何實(shí)現(xiàn)在react項(xiàng)目中嵌入Blazor

    教你如何實(shí)現(xiàn)在react項(xiàng)目中嵌入Blazor

    這篇文章主要介紹了如何實(shí)現(xiàn)在react現(xiàn)有項(xiàng)目中嵌入Blazor,通過這個(gè)案例我們可以知道 blazor也可以像react那樣嵌入在任何的現(xiàn)有項(xiàng)目中,并且使用方便,需要的朋友可以參考下
    2023-01-01
  • react-router4按需加載(踩坑填坑)

    react-router4按需加載(踩坑填坑)

    這篇文章主要介紹了react-router4按需加載(踩坑填坑),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • React 并發(fā)功能體驗(yàn)(前端的并發(fā)模式)

    React 并發(fā)功能體驗(yàn)(前端的并發(fā)模式)

    React 是由 Facebook 軟件工程師 Jordan Walke 創(chuàng)建,React 的第一個(gè)版本在七年前問世,現(xiàn)在,F(xiàn)acebook 負(fù)責(zé)維護(hù),本文給大家介紹React 并發(fā)功能體驗(yàn)前端并發(fā)模式的問題,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • React18之狀態(tài)批處理的使用

    React18之狀態(tài)批處理的使用

    本文主要介紹了React18之狀態(tài)批處理的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • React+CSS 實(shí)現(xiàn)繪制橫向柱狀圖

    React+CSS 實(shí)現(xiàn)繪制橫向柱狀圖

    這篇文章主要介紹了React+CSS 實(shí)現(xiàn)繪制橫向柱狀圖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • React和Vue實(shí)現(xiàn)文件下載進(jìn)度條

    React和Vue實(shí)現(xiàn)文件下載進(jìn)度條

    本文主要介紹了React和Vue實(shí)現(xiàn)文件下載進(jìn)度條,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評(píng)論

卢湾区| 峡江县| 郓城县| 外汇| 偃师市| 濮阳市| 丹凤县| 五原县| 土默特右旗| 伽师县| 大石桥市| 原阳县| 南和县| 尖扎县| 南宫市| 河间市| 双牌县| 瑞昌市| 寻乌县| 石泉县| 卢湾区| 喜德县| 宁津县| 渝中区| 湖南省| 樟树市| 咸阳市| 常宁市| 噶尔县| 长沙县| 雷山县| 资阳市| 南城县| 巴林左旗| 常熟市| 合江县| 固原市| 中山市| 明水县| 仁化县| 定襄县|