国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

React Router v6 完全指南,超實(shí)用!

開發(fā) 前端
React Router 創(chuàng)建于 2014 年,是一個(gè)用于 React 的聲明式、基于組件的客戶端和服務(wù)端路由庫,它可以保持 UI 與 URL 同步,擁有簡單的 API 與強(qiáng)大的功能。

大家好,我是 CUGGZ。

React Router 是 React 生態(tài)系統(tǒng)中最受歡迎的第三方庫之一,近一半的 React 項(xiàng)目中使用了 React Router,下面就來看看如何在 React 項(xiàng)目中使用 React Router v6 吧!

1. 概述

React Router 創(chuàng)建于 2014 年,是一個(gè)用于 React 的聲明式、基于組件的客戶端和服務(wù)端路由庫,它可以保持 UI 與 URL 同步,擁有簡單的 API 與強(qiáng)大的功能。

大多數(shù)現(xiàn)代 React 項(xiàng)目使用 npm、yarn、pnpm 等包管理器來管理項(xiàng)目依賴項(xiàng)。要將 React Router 添加到現(xiàn)有項(xiàng)目,就需要根據(jù)使用的包管理器來安裝依賴:

// npm
npm install react-router-dom@6

// pnpm
pnpm add react-router-dom@6

// yarn
yarn add react-router-dom@6

接下來,使用 CodeSandBox 來創(chuàng)建一個(gè) React + TypeScript 項(xiàng)目,使用核心庫的版本如下:

  • react:18.0.0
  • react-dom:18.0.0
  • react-router:6.3.0
  • react-router-dom:6.3.0

Demo 初始目錄結(jié)構(gòu)如下:

- public
- src
 - App.tsx
  - index.tsx
  - style.css
- package.json
- tsconfig.json

在介紹 React Router 的概念以前,需要先區(qū)分兩個(gè)概念:

  • react-router:為 React 應(yīng)用提供了路由的核心功能。
  • react-router-dom:基于 react-router,加入了在瀏覽器運(yùn)行環(huán)境下的一些功能。

2. 基本使用

(1)BrowserRouter

要想在 React 應(yīng)用中使用 React Router,就需要在 React 項(xiàng)目的根文件(index.tsx)中導(dǎo)入 Router 組件:

import { StrictMode } from "react";
import * as ReactDOMClient from "react-dom/client";
import { BrowserRouter } from "react-router-dom";

import App from "./App";

const rootElement = document.getElementById("root");
const root = ReactDOMClient.createRoot(rootElement);

root.render(
  <StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </StrictMode>
);

在這個(gè)文件中,我們導(dǎo)入了 BrowserRouter 組件,然后使用該組件包裹了 App 組件。現(xiàn)在,在這個(gè) BrowserRouter 組件中,來自 react-router-dom 的其他組件和 hooks 就可以正常工作了。

BrowserRouter 是最常用的路由方式,即瀏覽器路由。官方文檔也建議將 BrowserRouter 組件用于 Web 應(yīng)用程序。除了這種方式,React Router 還支持其他幾種路由方式:

  • HashRouter:在路徑前加入#成為一個(gè)哈希值,Hash 模式的好處是不會因?yàn)樗⑿马撁娑也坏綄?yīng)路徑;
  • MemoryRouter:不存儲 history,路由過程保存在內(nèi)存中,適用于 React Native 這種非瀏覽器環(huán)境;
  • NativeRouter:配合 React Native 使用,多用于移動端;
  • StaticRouter:主要用于服務(wù)端渲染時(shí)。

(2)NavLink

在創(chuàng)建導(dǎo)航鏈接之前,先在App.tsx組件中創(chuàng)建一個(gè)標(biāo)題:

import "./styles.css";

export default function App() {
  return (
    <div className="App">
      <header>
        <h1>Hello World</h1>
      </header>
    </div>
  );
}

頁面如下:

下面來創(chuàng)建三個(gè)導(dǎo)航鏈接,這些鏈接會指向App.tsx 中的一些路由。這時(shí)就需要導(dǎo)入 NavLink 組件,它是一個(gè)導(dǎo)航鏈接組件,類似于 HTML 中的<a>標(biāo)簽。NavLink 組件使用 to 來指定需要跳轉(zhuǎn)的鏈接:

import { NavLink } from "react-router-dom";
import "./styles.css";

export default function App() {
  return (
    <div className="App">
      <header>
        <h1>Hello World</h1>
      </header>
      <nav>
        <NavLink to="">首頁</NavLink>
        <NavLink to="product">產(chǎn)品</NavLink>
        <NavLink to="about">關(guān)于</NavLink>
      </nav>
    </div>
  );
}

當(dāng)點(diǎn)擊“首頁”時(shí),就會跳轉(zhuǎn)至路由 /:

當(dāng)點(diǎn)擊“產(chǎn)品”時(shí),就會跳轉(zhuǎn)至路由 /product:

當(dāng)點(diǎn)擊“關(guān)于”時(shí),就會跳轉(zhuǎn)至路由 /about:

可以看到,當(dāng)點(diǎn)擊這些導(dǎo)航鏈接時(shí),網(wǎng)頁的 URL 就會改變,跳轉(zhuǎn)到對應(yīng)的路由。

NavLink 是存在 active 狀態(tài)的,所以可以為active 狀態(tài)和非active 狀態(tài)的導(dǎo)航鏈接添加樣式:

.nav-active {
  color: red;
  font-weight: bold;
}

接下來為導(dǎo)航鏈接添加樣式判斷條件,選擇性的為其添加nav-active類:

import { NavLink } from "react-router-dom";
import "./styles.css";

export default function App() {
  return (
    <div className="App">
      <header>
        <h1>Hello World</h1>
      </header>
      <nav>
        <NavLink
       to=""
          className={({ isActive }) => isActive ? "nav-active" : void 0}
        >
          首頁
        </NavLink>
        <NavLink to="product">產(chǎn)品</NavLink>
        <NavLink to="about">關(guān)于</NavLink>
      </nav>
    </div>
  );
}

當(dāng)點(diǎn)擊“首頁”時(shí),會跳轉(zhuǎn)到首頁,導(dǎo)航鏈接會變成 active 狀態(tài)。這時(shí),“首頁”二字會變成紅色,字體也會加粗:

(3)Link

在 react-router-dom 中,可以使用 Link 組件來創(chuàng)建常規(guī)鏈接。Link 組件與 NavLink 組件非常相似,唯一的區(qū)別就是 NavLink 存在 active 狀態(tài),而 Link 沒有。

Link 組件和 NavLink 組件的使用方式類似,例如在產(chǎn)品頁面有一個(gè)返回首頁的按鈕,需要傳遞給 to 需要跳轉(zhuǎn)的路徑:

import { Link } from "react-router-dom";
import "./styles.css";

export default function Product() {
  return (
    <div className="product">
      <header>
        <Link to="/">返回首頁</Link>
      </header>
    </div>
  );
}

如果需要對 Link 進(jìn)行更多控制,也可以傳遞給 to 一個(gè)對象,在這個(gè)對象中,可以通過 search 屬性來添加查詢字符串或通過 hash 屬性來傳遞 hash值,例如:

import { Link } from "react-router-dom";
import "./styles.css";

export default function Settings() {
  return (
    <div className="settings">
      <header>
        <h1>Hello World</h1>
        <Link
          to={{
            pathname: "/settings",
            search: "?sort=date",
            hash: "#hash"
          }}
        >
          設(shè)置
        </Link>
      </header>
    </div>
  );
}

點(diǎn)擊“設(shè)置”時(shí),路由就變成了:/settings?sort=date#hash。

(4)Routes

下面來看看如何將路由映射為對應(yīng)的頁面(組件)。首先需要從 react-router-dom 中導(dǎo)入一個(gè)名為 Routes 的組件,它將包含可以在頁面特定部分顯示的所有不同的路由。

在 index.tsx 中進(jìn)行如下修改:

import { NavLink, Routes, Route } from "react-router-dom";
import Product from "./Product";
import "./styles.css";

export default function App() {
  return (
    <div className="App">
      <header>
        <h1>Hello World</h1>
      </header>
      <nav>
        <NavLink to="">首頁</NavLink>
        <NavLink to="product">產(chǎn)品</NavLink>
        <NavLink to="about">關(guān)于</NavLink>
      </nav>
      <Routes>
    
      </Routes>
    </div>
  );
}

我們需要在 Routes 組件中使用 Route 組件來定義所有路由。該組件接受兩個(gè) props:

  • path:頁面 URL 應(yīng)導(dǎo)航到的路徑,類似于 NavLink 組件的 to;
  • element:頁面導(dǎo)航到該路由時(shí)加載的元素。

Route 組件用于將應(yīng)用的位置映射到不同的 React 組件。例如,當(dāng)用戶導(dǎo)航到 /product 路徑時(shí)呈現(xiàn) Product 組件,可以這樣來寫:

import { NavLink, Routes, Route } from "react-router-dom";
import Product from "./Product";
import About from "./About";
import Home from "./Home";
import Error from "./Error";
import "./styles.css";

export default function App() {
  return (
    <div className="App">
      <header>
        <h1>Hello World</h1>
      </header>
      <nav>
        <NavLink to="">首頁</NavLink>
        <NavLink to="product">產(chǎn)品</NavLink>
        <NavLink to="about">關(guān)于</NavLink>
      </nav>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/product" element={<Product />} />
        <Route path="/about" element={<About />} />
        <Route path="*" element={<Error />} />
      </Routes>
    </div>
  );
}

當(dāng)點(diǎn)擊“產(chǎn)品”時(shí),就會加載 Product 組件:

當(dāng)點(diǎn)擊“首頁”時(shí),就會加載 Home 組件:

當(dāng)在地址欄輸入一個(gè)沒有定義的路由時(shí),就會加載 Error 組件:

從上面的代碼中可以看到,如果想要在所有 Route 都不匹配時(shí)就渲染 404 頁面,只需將 404 頁面對應(yīng)的 Route 的 path 設(shè)置為 *:

<Routes>
  <Route path="/" element={<Home />} />
  <Route path="product" element={<Product />} />
  <Route path="about" element={<About />} />
  <Route path="*" element={<Error />} />
</Routes>

(5)路由順序

在 React Router v6 以前,我們必須按照一定的順序來定義路由,以獲得準(zhǔn)確的渲染。在 v6 及之后的版本中,路由定義的順序無關(guān)緊要。

以下代碼在 v5 中,/product/new將匹配到第一個(gè)路由并渲染 Product 組件:

<Switch>
  <Route path="/product/:id" component={Product} />
  <Route path="/product/new" component={NewProduct} />
</Switch>

而在 v6 中,將 <Switch> 組件替換為了 <Routes> 組件。/products/new將匹配這兩個(gè)路由,但只會渲染NewProduct組件,因?yàn)樗歉唧w的匹配:

<Routes>
  <Route path="/product/:id" element={<Product />} />
  <Route path="/product/new" element={<NewProduct />} />
</Routes>

3. 編程式導(dǎo)航

React Router 提供了兩種不同的編程式導(dǎo)航方式:

  • 聲明式導(dǎo)航組件:<Navigate> 組件
  • 命令式導(dǎo)航方法:useNavigate Hook

我們可以使用這兩種編程的方式來跳轉(zhuǎn)到指定的路由,也可以實(shí)現(xiàn)路由的重定向,比如在瀏覽器的地址欄輸入一個(gè) URL 并進(jìn)行跳轉(zhuǎn)時(shí),如果應(yīng)用中沒有定義該路由,就跳轉(zhuǎn)到應(yīng)用的首頁。

(1)Navigate

<Navigate>組件是一種聲明式的導(dǎo)航方式。使用 Navigate 組件時(shí),首先需要從 react-router-dom 導(dǎo)入 Navigate 組件。然后在 Navigate 組件中通過 to props 來指定要跳轉(zhuǎn)的路徑:

import { NavLink, Routes, Route, Navigate } from "react-router-dom";
import Product from "./Product";
import About from "./About";
import Home from "./Home";
import "./styles.css";

export default function App() {
  return (
    <div className="App">
      <header>
        <h1>Hello World</h1>
      </header>
      <nav>
        <NavLink to="">首頁</NavLink>
        <NavLink to="product">產(chǎn)品</NavLink>
        <NavLink to="about">關(guān)于</NavLink>
      </nav>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="product" element={<Product />} />
        <Route path="about" element={<About />} />
        <Route path="*" element={<Navigate to="/" />} />
      </Routes>
    </div>
  );
}

這樣,當(dāng)在瀏覽器地址欄輸入一個(gè)未定義的路由時(shí),就會要轉(zhuǎn)到首頁。

(2)useNavigate

useNavigate Hook是一種命令式導(dǎo)航方式。使用這個(gè) Hook 時(shí),首先需要從 react-router-dom 中導(dǎo)入 useNavigate,然后傳遞給它需要跳轉(zhuǎn)的路由即可。假如在提交完表單之后,跳轉(zhuǎn)到主頁,可以這樣實(shí)現(xiàn):

import { useNavigate } from 'react-router-dom

function Register () {
  const navigate = useNavigate()

  return (
    <div>
      <Form afterSubmit={() => navigate('/')} />
    </div>
  )
}

4. 通過路由傳遞狀態(tài)

在 react-router-dom 中可以通過以下三種方式來傳遞狀態(tài):

  • 使用 Link 組件
  • 使用 Navigate 組件
  • 使用 useNavigate 鉤子

(1)Link

下面來使用 Link 組件通過 state props 來將數(shù)據(jù)從產(chǎn)品頁面?zhèn)鬟f到主頁:

import React from "react";
import { Link } from "react-router-dom";
function Contact() {
  return (
    <div>
      <header>產(chǎn)品頁面</header>
      <Link to="/" state={"From Product"}>
        返回
      </Link>
    </div>
  );
}
export default Contact;

現(xiàn)在我們就將需要的數(shù)據(jù)傳遞出來了,那該如何在首頁獲取從產(chǎn)品頁面?zhèn)鬟f出來的數(shù)據(jù)呢?可以在接收信息的頁面(首頁)中使用一個(gè)名為 useLocation 的鉤子來獲取數(shù)據(jù):

import { useLocation } from "react-router-dom";
import "./styles.css";

export default function Settings() {
  let location = useLocation();
  return (
    <div className="App">
      <header>首頁</header>
      <p>{location.state}</p>
    </div>
  );
}

當(dāng)在產(chǎn)品頁面點(diǎn)擊返回時(shí),就會跳轉(zhuǎn)到首頁,并且首頁顯示了從產(chǎn)品頁面?zhèn)鬟f出來的數(shù)據(jù):

(2)Navigate

Navigate 組件也可以在 react-router-dom 中傳遞狀態(tài),其使用方式和 Link 組件類似。假如當(dāng)點(diǎn)擊關(guān)于按鈕時(shí),跳轉(zhuǎn)到首頁,并告訴首頁該跳轉(zhuǎn)是從哪個(gè)頁面來的:

<Route path="/about" element={<Navigate to="/" state={"From About"} />} />

在首頁中仍然是使用 useLocation 鉤子來獲取狀態(tài)值:

import { useLocation } from "react-router-dom";
import "./styles.css";

export default function Settings() {
  let location = useLocation();
  return (
    <div className="App">
      <header>首頁</header>
      <p>{location.state}</p>
    </div>
  );
}

當(dāng)在首頁點(diǎn)擊“關(guān)于”時(shí),就會重定向到首頁,并且首頁中會顯示 From About:

(3)useNavigate

上面我們介紹了如何使用 useNavigate 鉤子來進(jìn)行重定向,在調(diào)用 navigate() 函數(shù)時(shí),給它傳遞了一個(gè)參數(shù),即要重定向的路徑。實(shí)際上,navigate() 函數(shù)接受兩個(gè)參數(shù),第一個(gè)參數(shù)就是跳轉(zhuǎn)的路徑,第二個(gè)參數(shù)是包含狀態(tài)的對象。可以借助  useNavigate Hook 來實(shí)現(xiàn)狀態(tài)傳遞:

import { useNavigate } from 'react-router-dom

function Register () {
  const navigate = useNavigate()

  return (
    <div>
      <Form afterSubmit={() => navigate('/', { state: "From the About Page"})} />
    </div>
  )
}

在首頁中仍然是使用 useLocation 鉤子來獲取狀態(tài)值,和上面兩種方式一樣,這里不再多介紹。

5. 動態(tài)路由

一個(gè)很常見的場景,在維基百科進(jìn)行搜索時(shí),URL 的模式始終是一樣的,如下:

https://zh.wikipedia.org/wiki/{keyword}

這里的 keyword 就是我們在維基百科中搜索的內(nèi)容,這個(gè)內(nèi)容是不固定的,并且有很多很多,我們不可能為每個(gè)關(guān)鍵詞都創(chuàng)建一個(gè)路由。其實(shí),只需要聲明一個(gè)帶有 keyword 占位符的路由即可。對于上面的例子,只需要將 Route 組件的 path props 聲明為這樣:

<Route path="/wiki/:keyword" element={<Wiki />} />

這時(shí),無論是訪問/wiki/javascript還是/wiki/react,都會加載 Wiki 組件。

那我們該如何在組件中訪問 URL 中的動態(tài)部分呢?從 v5.1 開始,React Router 就提供了一個(gè) useParams Hook,它返回一個(gè)對象,該對象具有 URL 參數(shù)及其值之間的映射。使用方式如下:

import React from 'react'
import {useParams} from 'react-router';

function Wiki() {
  const { keyword } = useParams()
  
  return (
    <div>{ keyword }</div>
  )
}

這樣,通過獲取到的 URL 參數(shù),就可以請求頁面對應(yīng)的數(shù)據(jù)。

6. 嵌套路由

嵌套路由允許父路由充當(dāng)包裝器并控制子路由的渲染。比如,在應(yīng)用中點(diǎn)擊消息時(shí),會跳轉(zhuǎn)到 /messages 路由,并顯示所有的通知列表。當(dāng)點(diǎn)擊某一條消息時(shí),就會跳轉(zhuǎn)到 /messages/:id 路由,這時(shí)就能看到指定 id 的消息詳情,同時(shí)消息列表是顯示在左側(cè)的。這個(gè)場景就要依賴嵌套路由來實(shí)現(xiàn)。下面來看看如何使用 React Router 實(shí)現(xiàn)這種嵌套路由模式。

從最基礎(chǔ)的結(jié)構(gòu)開始定義:

function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/messages" element={<Messages />} />
      <Route path="/settings" element={<Settings />} />
    </Routes>
  );
}

現(xiàn)在,我們希望 Messages 能夠控制渲染子路由,那能不能直接在 Messages 組件中來定義子路由呢?就像這樣:

function Messages() {
  return (
    <div>
      <Conversations />
      <Routes>
        <Route path=":id" element={<MessagesDetails />} />
      </Routes>
    </div>
  );
}

現(xiàn)在,當(dāng)用戶導(dǎo)航到 /messages 時(shí), React Router 會呈現(xiàn) Messages 組件。Messages 組件中通過 Conversations 組件來顯示消息列表,然后使用將 /messages/:id 映射到 Chat 組件的 Route 來渲染另一個(gè) Routes。

注意: 這里不必在嵌套路由中包含完整的 /messages/:id 路徑,因?yàn)?nbsp;Routes 是很智能的,當(dāng)省略了前導(dǎo) /,就會認(rèn)為這條路徑是相對于父級 /messages 的。

這樣,只有在跳轉(zhuǎn)到/Messages時(shí)才會渲染消息列表。當(dāng)訪問與 /messages/:id 模式匹配的路由時(shí),消息列表就消失了,嵌套路由永遠(yuǎn)不被會渲染。

為了解決這個(gè)問題,我們需要告訴 React Router 想要在路由為 /messages 時(shí)或者為任何其他匹配 /messages/* 模式的路由時(shí)要渲染消息列表。

那如果只是將路徑修改為 /messages/*會怎樣呢?

function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/messages/*" element={<Messages />} />
      <Route path="/settings" element={<Settings />} />
    </Routes>
  );
}

這樣做的確生效了,無論是導(dǎo)航到 /messages 還是 /messages/:id,都能正常加載消息列表組件:

通過將 /* 附加到 /messages 路徑的末尾,實(shí)際上是在告訴 React Router,Messages 有一個(gè)嵌套的 Routes 組件。并且父路徑應(yīng)該匹配 /messages 以及與 /messages/* 匹配的任何其他路由。

當(dāng)我們希望在子 Route 控制渲染嵌套路由時(shí),這是有效的。但是如果我們希望在 App 組件包含創(chuàng)建嵌套路由所需的所有信息,而不是必須在 Messages 組件中定義呢?React Router 也是支持這種創(chuàng)建嵌套路由的方式:

function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/messages" element={<Messages />}>
        <Route path=":id" element={<MessagesDetails />} />
      </Route>
      <Route path="/settings" element={<Settings />} />
    </Routes>
  );
}

這里以聲明式的方式將子 Route 嵌套為父 Route 的子級。和上面一樣,子路由是相對于父路由的,因此不需要包含父 (/messages) 路徑。

現(xiàn)在,只需要告訴 React Router 應(yīng)該在父路由(Messges)中的哪個(gè)位置渲染子路由(MessagesDetails)。這就就需要使用 React Router 的 Outlet 組件:

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

function Messages() {
  return (
    <div>
      <Conversations />
      <Outlet />
    </div>
  );
}

如果應(yīng)用的路由與嵌套 Route 的路徑匹配,Outlet 組件就會渲染 Route 的元素。根據(jù)上面的 Routes,如果在當(dāng)前的路由是 /messages,Outlet 組件將渲染為 null;如果當(dāng)前的路由是 /messages/1,Outlet 組件將渲染 <MessagesDetails /> 組件。

7.  查詢參數(shù)

在 React Router 中,如何從 URL 中獲取參數(shù)呢?例如以下 URL:

twitter.com/search?q=react&src=typed_query&f=live

從 v6 開始,React Router  使用 URLSearchParams API 來處理查詢字符串,URLSearchParams 內(nèi)置于所有瀏覽器(IE 除外)中,并提供了處理查詢字符串的實(shí)用方法。當(dāng)創(chuàng)建 URLSearchParams 實(shí)例時(shí),需要向它傳遞一個(gè)查詢字符串:

const queryString = "?q=react&src=typed_query&f=live";
const sp = new URLSearchParams(queryString);

sp.has("q"); // true
sp.get("q"); // react
sp.getAll("src"); // ["typed_query"]
sp.get("nope"); // null

sp.append("sort", "ascending");
sp.toString(); // "?q=react&src=typed_query&f=live&sort=ascending"

sp.set("q", "bytes.dev");
sp.toString(); // "?q=bytes.dev&src=typed_query&f=live&sort=ascending"

sp.delete("sort");
sp.toString(); // "?q=bytes.dev&src=typed_query&f=live"

React Router 提供了一個(gè)自定義的 useSearchParams Hook,它是基于 URLSearchParams 進(jìn)行的封裝。useSearchParams 返回一個(gè)數(shù)組,該數(shù)組第一個(gè)元素是 URLSearchParams 的實(shí)例,第二個(gè)元素是更新查詢參數(shù)的一個(gè)方法。

對于上面的 URL,使用 useSearchParams 從查詢字符串中獲取值:

import { useSearchParams } from 'react-router-dom'

const Results = () => {
  const [searchParams, setSearchParams] = useSearchParams();

  const q = searchParams.get('q')
  const src = searchParams.get('src')
  const f = searchParams.get('f')

  return (
    // ...
  )
}

如果需要更新查詢字符串,可以使用 setSearchParams,向它傳遞一個(gè)對象,該對象的key/value 對將作為 &key=value 添加到 url:

const Results = () => {
  const [searchParams, setSearchParams] = useSearchParams();

  const q = searchParams.get('q')
  const src = searchParams.get('src')
  const f = searchParams.get('f')

  const updateOrder = (sort) => {
    setSearchParams({ sort })
  }

  return (
    ...
  )
}

8. Route 配置

React Router v6 內(nèi)置了一個(gè) useRoutes Hook,它在功能上等同于 <Routes>,但它是使用 JavaScript 對象而不是 <Route> 元素來定義路由。這個(gè)對象具有與普通 <Route> 元素相同的屬性,但它們不需要使用 JSX 來編寫。

useRoutes 的返回值要么是一個(gè)有效的 React 元素(可以使用它來渲染路由樹),如果沒有匹配項(xiàng),則返回 null。

假如應(yīng)用中有以下路徑:

/
/invoices
  :id
  pending
  complete

使用 <Route> 組件來定義路由將會是這樣的:

export default function App() {
  return (
    <div>
      <Navbar />
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/invoices" element={<Invoices />}>
          <Route path=":id" element={<Invoice />} />
          <Route path="pending" element={<Pending />} />
          <Route path="complete" element={<Complete />} />
        </Route>
      </Routes>
    </div>
  );
}

而 useRoutes 是利用 JavaScript 對象完成的,而不是使用 React 元素 (JSX) 來聲明路由。定義形式如下:

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

const routes = useRoutes([
  { path: "/", element: <Home /> },
  {
    path: "/invoices",
    element: <Invoices />,
    children: [
      { path: ":id", element: <Invoice /> },
      { path: "/pending", element: <Pending /> },
      { path: "/complete", element: <Complete /> },
    ],
  },
]);

export default function App() {
  return (
    <div>
      <Navbar />
      {routes}
    </div>
  );
}
責(zé)任編輯:姜華 來源: 前端充電寶
相關(guān)推薦

2022-09-13 09:02:19

React客戶端服務(wù)端

2022-08-15 17:34:22

react-routv6

2020-03-20 10:25:41

React-Routev6前端

2010-05-26 17:46:51

IPv6測試

2011-07-18 21:55:58

Phantom 掃描儀

2015-09-10 10:20:49

2015-07-27 15:26:47

設(shè)計(jì)

2009-10-30 09:59:09

Hyper-V應(yīng)用技巧

2024-01-22 06:30:00

AI模型

2022-06-23 09:04:14

ReactHooks項(xiàng)目

2021-03-12 10:01:33

Sudo命令Linux

2022-03-03 22:00:19

Hooks函數(shù)組件React

2019-04-26 13:25:06

服務(wù)器開發(fā)工具

2020-11-18 14:36:12

B端客戶設(shè)計(jì)

2009-02-23 09:39:47

2023-12-22 12:40:13

AI技術(shù)

2009-11-30 09:55:16

阿爾法v6路由器

2023-10-08 18:07:42

Kubernetes開源容器

2014-10-09 10:50:49

91桌面

2009-11-30 10:19:28

阿爾法v6路由器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

黄页在线观看免费| 国产在线不卡视频| 亚洲区小说区图片区qvod| 亚洲欧美一级二级三级| 大美女一区二区三区| 精品国产乱码久久久久久虫虫漫画| 亚洲成人黄色在线观看| 亚洲人成电影网| 日本精品一区二区三区在线| 日韩高清国产精品| 国产理论在线播放| 最新国产在线拍揄自揄视频| 米奇精品关键词| 中文字幕免费不卡| 欧美精品videos| 欧美精品无码一区二区三区| 一区二区三区四区高清视频| 国产99久久久久| 51精品国自产在线| 97netav| 成人a视频在线| 红桃视频在线观看一区二区| 国产精品国产三级国产aⅴ原创| 久久成人精品电影| 婷婷六月天丁香| 日韩av字幕| 日韩欧美卡一卡二| 日本一区视频在线观看| 欧美黑人一区二区三区| 丁香资源影视免费观看| 伊人久久影院| 国产精品毛片久久久久久久| 国产精品久久久久久久一区探花 | 在线精品国精品国产尤物884a| 国产精品播放| 欧美三区在线| 欧美在线免费视频| 日韩系列在线| 国产精品自产拍在线观| 亚洲a在线视频| 久久久久久高清| 国产一区二区三区久久悠悠色av| 分分操这里只有精品| 国产亚洲欧美激情| 李宗瑞系列合集久久| 欧美日韩精品一区二区天天拍小说| av免费在线观看网站| 亚洲欧美视频在线| 爱高潮www亚洲精品| 成人字幕网zmw| 青青草国产成人av片免费| 男女日批视频在线观看| 亚洲人一二三区| 国产天堂在线| 影音先锋欧美精品| 你微笑时很美电视剧整集高清不卡| 91中文字精品一区二区| 国产一区二区三区四区五区入口| 免费看污黄网站| 在线视频国内自拍亚洲视频| 亚洲小少妇裸体bbw| 97国产成人精品视频| 黄色亚洲在线| 无码人妻丰满熟妇区96| 精品国产精品三级精品av网址| 免费在线国产视频| 97精品国产97久久久久久| 最新成人av网站| 北条麻妃在线一区| 欧美亚洲综合久久| 精品久久久久久久久久岛国gif| 亚洲自拍另类欧美丝袜| 国产精品一区二区在线观看网站| 黄色一级片视频| 亚洲精品久久久久| 曰本一区二区三区视频| 日本一区网站| 亚洲靠逼com| 久热在线观看视频| 国产日韩欧美在线看| 国产福利一区二区| 成人免费在线电影| 隔壁老王国产在线精品| 日本系列欧美系列| 久久.com| 色视频www在线播放国产成人 | 欧美成人综合网站| jizzjizz少妇亚洲水多| 国产99在线免费| 亚洲天堂免费在线观看视频| 91资源在线观看| 99精品在线直播| 亚洲免费观看高清完整版在线观看熊| 性欧美18xxxhd| 国产一区二区三区高清| 一区二区三区av电影| 嫩草伊人久久精品少妇av杨幂| 国产精品国产精品国产专区蜜臀ah | 激情视频免费观看在线| www.亚洲男人天堂| 日韩av电影免费观看高清完整版| 最新在线观看av网站| 久久久久久久成人| 国产精品香蕉一区二区三区| 黄色网页在线观看| 国产高清自拍一区| 日韩欧美国产黄色| 日韩一区二区中文| 日本搞黄视频| 91a在线视频| 国产午夜精品一区二区三区视频| 日本三级一区| 亚洲综合网中心| 欧美大片一区二区| 国产一区成人| 黄色网页在线免费观看| 好吊色欧美一区二区三区 | 亚洲精品2区| 宅男午夜在线| 日本sm极度另类视频| 久久精品一区二区三区不卡 | 精品久久久久久久久久久aⅴ| 日韩视频免费在线播放| 国产一区二区三区日韩欧美| 麻豆成人综合网| 国产91足控脚交在线观看| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 91国在线精品国内播放 | av日韩精品| 另类小说第一页| 欧美高清视频在线播放| 国产日韩综合av| 国产精品美女在线观看直播| 无人在线观看的免费高清视频| 欧美成人精品一区二区| 国产日韩一级二级三级| 懂色av一区二区| 免费观影入口看日本视频| 日韩av高清不卡| 精品久久久中文| 伊人久久成人| 丁香花在线电影小说观看| 丰满女人性猛交| 日韩视频免费看| 国产亚洲1区2区3区| 香蕉久久夜色精品国产使用方法| 欧美h版电影| 国产精品久久久久久久久久久久午夜片| 欧美三级韩国三级日本一级| 久久av在线| 亚洲伦理影院| 在线观看亚洲色图| 成人伊人精品色xxxx视频| 欧美精品vⅰdeose4hd| 久久超碰97中文字幕| 欧美综合影院| 免费激情网址| 精品日产一区2区三区黄免费| 精品成a人在线观看| jlzzjlzz国产精品久久| 成人免费在线电影网| 亚洲精品视频99| 日韩av一区二区三区美女毛片| 亚洲色图25p| 亚洲日本中文字幕区| 亚洲网址在线| 国产精品亚洲d| 男女激情视频网站| 欧美日韩一区二 | 91九色国产在线播放| 国产在线观看福利| 国产欧美日韩视频| 欧美videos中文字幕| 久久人人爽人人爽| 午夜精品亚洲| av高清一区| 午夜成在线www| 国产精品久久成人免费观看| 欧美最猛性xxxxx(亚洲精品)| 日韩视频一区二区| 国产蜜臀97一区二区三区| 在线视频观看日韩| 免费观看在线一区二区三区| 粉嫩一区二区三区国产精品| 妺妺窝人体色777777| 亚洲999一在线观看www| 中文亚洲视频在线| 日韩欧美主播在线| 91在线观看下载| 精品99视频| 久久综合另类图片小说| 韩国av网站在线| 成色在线视频| 欧美少妇在线观看| 亚洲综合国产精品| 欧美夫妻性生活视频| 欧美不卡在线视频| 精品电影在线观看| 久久久精品综合| 日本女优在线视频一区二区|