亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

React?Router掌握路由搭建與權(quán)限管控的操作方法(?從入門到精通)

 更新時(shí)間:2025年01月07日 14:17:31   作者:web?Rookie  
本文詳細(xì)介紹了React?Router庫(kù)在React應(yīng)用開(kāi)發(fā)中的應(yīng)用,包括其核心功能、安裝使用、基礎(chǔ)使用、核心組件和功能、路由參數(shù)和嵌套路由、編程式導(dǎo)航以及路由權(quán)限管理等方面,感興趣的朋友一起看看吧

一、前言

react-router 庫(kù)在 React 應(yīng)用開(kāi)發(fā)中扮演著至關(guān)重要的角色,它是實(shí)現(xiàn)頁(yè)面路由管理的核心工具,能夠讓開(kāi)發(fā)者根據(jù)不同的 URL 路徑精準(zhǔn)地渲染對(duì)應(yīng)的組件,這對(duì)于構(gòu)建流暢、交互性強(qiáng)的單頁(yè)面應(yīng)用(SPA)來(lái)說(shuō)不可或缺。通過(guò)它,用戶在瀏覽應(yīng)用時(shí)無(wú)需頻繁刷新整個(gè)頁(yè)面,就能實(shí)現(xiàn)頁(yè)面內(nèi)容的動(dòng)態(tài)切換,極大地提升了用戶體驗(yàn)。
例如,許多知名的 React 應(yīng)用,如一些大型的電商平臺(tái)前端、在線辦公軟件等,都借助 react-router 來(lái)管理繁多的頁(yè)面路由,實(shí)現(xiàn)復(fù)雜的功能模塊切換和頁(yè)面導(dǎo)航,使得用戶可以方便快捷地在各個(gè)功能頁(yè)面之間穿梭。

一般來(lái)說(shuō),React-Router v6 需要 React v16.8 或更高版本。因?yàn)?React-Router v6 利用了 React 的 Hooks 等特性,而 React v16.8 是第一個(gè)引入 Hooks 的版本。如果使用較低版本的 React,可能會(huì)導(dǎo)致 React-Router 無(wú)法正常工作或某些功能缺失。

二、安裝

  • 使用 npm 安裝(推薦)
  • 打開(kāi)終端,進(jìn)入 React 項(xiàng)目目錄。
  • 若沒(méi)安裝 React 項(xiàng)目,可用 Create React App 等創(chuàng)建新項(xiàng)目。
  • 在項(xiàng)目目錄下,運(yùn)行 npm install react-router-dom 命令,安裝成功后,可查看 node_modules 目錄有無(wú) react-router-dom 文件夾,或在代碼文件導(dǎo)入相關(guān)模塊(如 import { BrowserRouter } from'react-router-dom')驗(yàn)證,無(wú)報(bào)錯(cuò)即安裝正確。

使用 yarn 安裝

  • 打開(kāi)終端,進(jìn)入 React 項(xiàng)目目錄。
  • 運(yùn)行 yarn add react-router-dom 命令,完成后即可使用。

三、基礎(chǔ)使用

項(xiàng)目 React 版本: 18.3.1;react-router-dom 版本:7.1.1。

設(shè)置路由基礎(chǔ)結(jié)構(gòu)

在 React 應(yīng)用入口文件(通常是 index.jsmain.js),用 BrowserRouter(基于瀏覽器歷史記錄,URL 更自然)或 HashRouter(特殊部署需求或兼容舊瀏覽器)包裹整個(gè)應(yīng)用。如在 main.js 中:

import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { BrowserRouter as Router } from 'react-router-dom';
import App from './App.jsx';
createRoot(document.getElementById('root')).render(
  <StrictMode>
    <Router>
      <App />
    </Router>
  </StrictMode>
);

這里將 App 組件包裹在 RouterBrowserRouter 的別名)中,這樣 App 組件及其子組件就可以訪問(wèn)到路由相關(guān)的功能。

定義路由和組件關(guān)聯(lián)

App 組件或其他組件內(nèi),用 Route 組件定義路由規(guī)則。

直接在組件中定義路由

這種方式將路由定義直接放在組件內(nèi)部,對(duì)于小型應(yīng)用或者路由規(guī)則比較簡(jiǎn)單的情況,具有直觀的優(yōu)點(diǎn)。開(kāi)發(fā)者可以一目了然地看到某個(gè)組件與具體路由路徑的關(guān)聯(lián)情況,并且路由規(guī)則與組件緊密結(jié)合,很適合組件自身內(nèi)部的路由管理,尤其當(dāng)組件是獨(dú)立的功能模塊時(shí),能使模塊功能更加內(nèi)聚。

import React from 'react';
import { Route } from 'react-router-dom';
import Home from './Home';
import About from './About';
const App = () => {
  return (
    <div>
      {/* 
        Route 組件定義路由,exact 精確匹配,確保路徑完全是'/'才渲染 Home 組件,
        訪問(wèn)'/about'時(shí)不會(huì)渲染 Home 組件。訪問(wèn)'/'渲染 Home 組件,訪問(wèn)'/about'渲染 About 組件。
      */}
      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
    </div>
  );
}
export default App

然而,當(dāng)應(yīng)用規(guī)模逐漸變大,路由規(guī)則變得復(fù)雜時(shí),這種寫法會(huì)暴露出明顯的缺點(diǎn)。比如在一個(gè)大型電商應(yīng)用中,若有上百個(gè)路由都寫在 App 組件內(nèi),代碼會(huì)變得極為臃腫,查找特定路由關(guān)聯(lián)的組件、修改路由參數(shù)等維護(hù)操作將變得異常繁瑣,代碼的可讀性也會(huì)大打折扣,不利于后續(xù)的開(kāi)發(fā)和維護(hù)。

定義單獨(dú)一個(gè)路由表

單獨(dú)創(chuàng)建一個(gè)路由表可以將所有的路由規(guī)則集中管理,這對(duì)于大型應(yīng)用開(kāi)發(fā)來(lái)說(shuō)尤為重要。在開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)者能夠在一個(gè)文件中清晰地查看所有的路由路徑、對(duì)應(yīng)的組件以及可能的路由參數(shù)等關(guān)鍵信息。而且,路由表具備良好的復(fù)用性,比如在不同的布局組件(如具有不同側(cè)邊欄的布局)中,都可以引用這個(gè)統(tǒng)一的路由表來(lái)實(shí)現(xiàn)相同的路由功能,無(wú)需重復(fù)配置。同時(shí),當(dāng)需要對(duì)路由規(guī)則進(jìn)行修改時(shí),只需在路由表文件中操作即可,無(wú)需逐個(gè)在使用路由的組件中進(jìn)行修改,極大地提高了開(kāi)發(fā)效率和代碼的可維護(hù)性。隨著應(yīng)用的不斷發(fā)展,添加新路由也十分方便,并且對(duì)于路由的中間件(如權(quán)限驗(yàn)證,只有登錄用戶才能訪問(wèn)某些路由)等功能,在路由表中也能更便捷地進(jìn)行配置。
創(chuàng)建 routes.js 文件定義路由表,集中管理路由規(guī)則。

import { lazy } from 'react';
// lazy 用于設(shè)置路由懶加載
const Home = lazy(() => import('@/pages/Home'));
const About = lazy(() => import('@/pages/About'));
const Router = [
  {
    path: '/',
    element: <Home />
  },
  {
    path: '/about',
    element: <About />
  },
  // 設(shè)置 404 頁(yè)面
  {
    path: '*',
    element: <NotFound />
  }
];
export default Router

然后在 App 組件中使用這個(gè)路由表:

import router from './router';
import { Suspense } from 'react';
import { useRoutes } from 'react-router-dom';
function App() {
  // useRoutes 依傳入路由配置生成相應(yīng)路由元素,代表應(yīng)渲染組件樹(shù)結(jié)構(gòu)。
  const element = useRoutes(router);
  // Suspense 設(shè)頁(yè)面跳轉(zhuǎn)加載提示,組件加載時(shí)顯示 fallback 指定內(nèi)容。
  return <Suspense fallback={'loading...'}>{element}</Suspense>;
}
export default App

此方式適用于大型應(yīng)用,復(fù)用性好,修改路由便捷,還方便配置中間件(如權(quán)限驗(yàn)證)。

創(chuàng)建導(dǎo)航鏈接

使用 Link 組件來(lái)創(chuàng)建應(yīng)用內(nèi)部的導(dǎo)航鏈接,它與傳統(tǒng)的 標(biāo)簽不同,當(dāng)用戶點(diǎn)擊 Link 組件時(shí),不會(huì)引起整個(gè)頁(yè)面的刷新,而是通過(guò) JavaScript 更新 URL 并觸發(fā)相應(yīng)的組件渲染,實(shí)現(xiàn)單頁(yè)面應(yīng)用內(nèi)的無(wú)縫導(dǎo)航。

import React from 'react';
import { Link } from 'react-router-dom';
const Navigation = () => {
  return (
    <nav>
      {/* 
        Link 組件 to 屬性指定導(dǎo)航目標(biāo)路徑,點(diǎn)擊'Home'鏈接導(dǎo)航到根路徑渲染 Home 組件,
        點(diǎn)擊'About'鏈接導(dǎo)航到'/about'路徑渲染 About 組件。
      */}
      <Link to="/">Home</Link>
      <Link to="/about">About</Link>
    </nav>
  );
}
export default Navigation

四、核心組件和功能

BrowserRouter 和 HashRouter

  • BrowserRouter:基于 HTML5 瀏覽器歷史記錄 API,URL 格式自然,無(wú)“#”符號(hào),如電商產(chǎn)品詳情頁(yè) URL 可為“/products/123”,利于 SEO。
  • HashRouter:用 URL 哈希部分管理路由,適用于舊瀏覽器或服務(wù)器不支持 HTML5 歷史記錄 API 的情況,部署在簡(jiǎn)單靜態(tài)服務(wù)器上表現(xiàn)良好。

hash和history

Route 組件

Route 組件是核心,定義路由規(guī)則,關(guān)聯(lián) URL 路徑與組件。

import React from 'react';
import { Route, BrowserRouter as Router } from 'react-router-dom';
import Home from './Home';
import About from './About';
const App = () => {
  return (
    <Router>
      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
    </Router>
  );
}
export default App

exact 屬性精確匹配路徑,避免誤渲染。

Link 組件

與傳統(tǒng) <a> 標(biāo)簽不同,點(diǎn)擊不刷新頁(yè)面,更新 URL 觸發(fā)組件渲染。

import React from 'react';
import { Link } from 'react-router-dom';
const Navigation = () => {
  return (
    <nav>
      <Link to="/">Home</Link>
      <Link to="/about">About</Link>
    </nav>
  );
}
export default Navigation

Switch 組件

包裹一組 Route 組件,只渲染第一個(gè)匹配成功的 Route,防止多個(gè)組件同時(shí)渲染。

import React from 'react';
import { Route, Switch, BrowserRouter as Router } from 'react-router-dom';
import Home from './Home';
import About from './About';
import NotFound from './NotFound';
const App = () => {
  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
        <Route component={NotFound} />
      </Switch>
    </Router>
  );
}
export default App

在這個(gè)例子中,如果沒(méi)有Switch組件,當(dāng)用戶訪問(wèn)一個(gè)不存在的路徑時(shí),NotFound組件和前面可能部分匹配的組件(比如Home組件)都可能會(huì)被渲染。有了Switch組件,只有NotFound組件會(huì)被渲染,因?yàn)榍懊娴穆酚啥紱](méi)有匹配成功

五、路由參數(shù)和嵌套路由

路由參數(shù)

React-Router 允許在路由路徑中定義參數(shù)。例如,在一個(gè)列表中,內(nèi)容詳情頁(yè)的路由可以定義為 /articles/:id,其中 :id 是一個(gè)參數(shù),表示詳情的唯一標(biāo)識(shí)符。在組件中可以通過(guò) props.match.params 獲取這個(gè)參數(shù)。

import React from 'react';
import { Route, BrowserRouter as Router } from 'react-router-dom';
const ArticleDetail = props => {
  const articleId = props.match.params.id;
  // 根據(jù) articleId 獲取文章詳情并渲染
  return (
    <div>
      <h1>Article Detail {articleId}</h1>
    </div>
  );
}
const App = () => {
  return (
    <Router>
      <Route path="/articles/:id" component={ArticleDetail} />
    </Router>
  );
}
export default App

用戶訪問(wèn) /articles/123 時(shí),articleId 為“123”。

嵌套路由

復(fù)雜應(yīng)用有嵌套路由情況,如電商產(chǎn)品詳情頁(yè)有評(píng)論區(qū)。

import React from 'react';
import { Route, BrowserRouter as Router, Switch } from 'react-router-dom';
import ProductDetail from './ProductDetail';
import ProductReviews from './ProductReviews';
const App = () => {
  return (
    <Router>
      <Switch>
        <Route path="/products/:id" component={ProductDetail}>
          <Route path="/products/:id/reviews" component={ProductReviews} />
        </Route>
      </Switch>
    </Router>
  );
}
export default App

訪問(wèn)“/products/123/reviews”時(shí),先渲染 ProductDetail 組件,再在其內(nèi)部合適位置渲染 ProductReviews 組件。

嵌套路由層級(jí)加深及應(yīng)用場(chǎng)景拓展

以企業(yè)級(jí)應(yīng)用為例,展示部門詳情頁(yè)、員工列表頁(yè)、員工個(gè)人詳情頁(yè)和員工績(jī)效頁(yè)等多層嵌套路由場(chǎng)景,通過(guò)合理配置實(shí)現(xiàn)頁(yè)面有序切換。

import React from 'react';
import { Route, BrowserRouter as Router, Switch } from 'react-router-dom';
const DepartmentDetail = props => {
  return (
    <div>
      <h1>Department Detail</h1>
      {/* 展示部門相關(guān)信息 */}
      <Route path={`${props.match.path}/employees`} component={EmployeeList} />
    </div>
  );
}
const EmployeeList = props => {
  return (
    <div>
      <h2>Employee List</h </div>
      {/* 展示員工列表 */}
      <Route path={`${props.match.path}/:employeeId`} component={EmployeeDetail} />
      <Route path={`${props.match.path}/:employeeId/performance`} component={EmployeePerformance} />
    </div>
  );
}
const EmployeeDetail = props => {
    const { employeeId } = props.match.params;
    return (
      <div>
        <h3>Employee Detail - ID: {employeeId}</h3>
        {/* 展示員工個(gè)人詳細(xì)信息 */}
      </div>
    );
}
const EmployeePerformance = props => {
    const { employeeId } = props.match.params;
    return (
      <div>
        <h3>Employee Performance - ID: {employeeId}</h3>
        {/* 展示員工績(jī)效相關(guān)信息 */}
      </div>
    );
}
const App = () => {
    return (
      <Router>
        <Switch>
          <Route path="/departments/:departmentId" component={DepartmentDetail} />
        </Switch>
      </Router>
    );
}
export default App

通過(guò)這樣的復(fù)雜示例,可以更好理解嵌套路由在構(gòu)建大型、功能豐富的應(yīng)用中是如何發(fā)揮作用的,以及如何根據(jù)實(shí)際業(yè)務(wù)需求去設(shè)計(jì)和配置多層嵌套的路由結(jié)構(gòu),更好地應(yīng)對(duì)復(fù)雜的頁(yè)面關(guān)系和功能模塊劃分

六、編程式導(dǎo)航

Link 組件,React-Router 支持編程式導(dǎo)航,通過(guò) history 對(duì)象實(shí)現(xiàn),可在組件中用 props.history 獲?。ńM件需通過(guò) Route 組件渲染)。

import React from 'react';
import { Route, BrowserRouter as Router, useNavigate } from 'react-router-dom';
const MyComponent = props => {
  const Navigate = useNavigate();
  const handleClick = () => {
    Navigate('/about');
  }
  return (
    <div>
      <button onClick={handleClick}>Go to About</button>
    </div>
  );
}
const App = () => {
  return (
    <Router>
      <Route path="/" component={MyComponent} />
    </Router>
  );
}
export default App

點(diǎn)擊按鈕,調(diào)用 handleClick 函數(shù),導(dǎo)航到“/about”路徑,適用于表單提交成功等內(nèi)部邏輯導(dǎo)航。

七、路由權(quán)限

路由表

import { lazy } from 'react';
import Auth from './AuthRoute';
const Home = lazy(() => import('@/pages/Home'));
const About = lazy(() => import('@/pages/About'));
const List = lazy(() => import('@/pages/List'));
const User = lazy(() => import('@/pages/User'));
const NotFound = lazy(() => import('@/pages/NotFound'));
const Router = [
  {
    path: '/',
    element: <Home />
  },
  {
    path: '/about',
    element: <About />
  },
  {
    path: '/app/',
    element: (
      // 自定義權(quán)限組件
      <Auth>
        <BasicLayout />
      </Auth>
    ),
    errorElement: <NotFound></NotFound>,
    children: [
      {
        path: 'list',
        element: <List />
      },
      {
        path: 'list/user',
        element: <User />
      }
    ]
  },
  // 設(shè)置404頁(yè)面
  {
    path: '*',
    element: <NotFound />
  }
];
export default Router

權(quán)限組件

import { useEffect, useRef } from 'react';
import { useNavigate, useLocation } from 'react-router-dom';
import { message } from 'antd';
import useUpdateEffect from '@/components/useUpdateEffect';
export default function Auth({ children }: any) {
  const location = useLocation().pathname;
  const didMountRef = useRef(false);
  const Navigate = useNavigate();
  const token = localStorage.getItem('token');
  useEffect(() => {
    if (didMountRef.current) {
      if (!token) {
        message.error('您未登錄,將跳轉(zhuǎn)');
        setTimeout(() => {
          Navigate('/login');
        }, 1000);
      }
    } else {
      didMountRef.current = true;
    }
  }, [token]);
  return children;
}

404 頁(yè)面

import React from 'react';
const CommonLine = props => (
  // 根據(jù)個(gè)人需求改動(dòng)
  <div>未找到該頁(yè)面</div>
);
export default CommonLine

到此這篇關(guān)于React Router 一站式攻略:從入門到精通,掌握路由搭建與權(quán)限管控的文章就介紹到這了,更多相關(guān)React Router 路由搭建與權(quán)限管控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • react合成事件與原生事件的相關(guān)理解

    react合成事件與原生事件的相關(guān)理解

    本文主要介紹了react合成事件與原生事件的相關(guān)概念,幫助大家區(qū)分這兩種事件,學(xué)習(xí)react的同學(xué)不妨了解下
    2021-05-05
  • React Native中ScrollView組件輪播圖與ListView渲染列表組件用法實(shí)例分析

    React Native中ScrollView組件輪播圖與ListView渲染列表組件用法實(shí)例分析

    這篇文章主要介紹了React Native中ScrollView組件輪播圖與ListView渲染列表組件用法,結(jié)合實(shí)例形式詳細(xì)分析了ScrollView組件輪播圖與ListView渲染列表組件具體功能、使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • react 可拖拽進(jìn)度條的實(shí)現(xiàn)

    react 可拖拽進(jìn)度條的實(shí)現(xiàn)

    本文主要介紹了react 可拖拽進(jìn)度條的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • React Native中WebView與html雙向通信遇到的坑

    React Native中WebView與html雙向通信遇到的坑

    這篇文章主要介紹了React Native中WebView與html雙向通信的一些問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • React深入淺出分析Hooks源碼

    React深入淺出分析Hooks源碼

    在react類組件(class)寫法中,有setState和生命周期對(duì)狀態(tài)進(jìn)行管理,但是在函數(shù)組件中不存在這些,故引入hooks(版本:>=16.8),使開(kāi)發(fā)者在非class的情況下使用更多react特性
    2022-11-11
  • React利用scheduler思想實(shí)現(xiàn)任務(wù)的打斷與恢復(fù)

    React利用scheduler思想實(shí)現(xiàn)任務(wù)的打斷與恢復(fù)

    這篇文章主要為大家詳細(xì)介紹了React如何利用scheduler思想實(shí)現(xiàn)任務(wù)的打斷與恢復(fù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2024-03-03
  • 詳解create-react-app 自定義 eslint 配置

    詳解create-react-app 自定義 eslint 配置

    這篇文章主要介紹了詳解create-react-app 自定義 eslint 配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • React中嵌套組件與被嵌套組件的通信過(guò)程

    React中嵌套組件與被嵌套組件的通信過(guò)程

    這篇文章主要介紹了React中嵌套組件與被嵌套組件的通信過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • React性能優(yōu)化系列之減少props改變的實(shí)現(xiàn)方法

    React性能優(yōu)化系列之減少props改變的實(shí)現(xiàn)方法

    這篇文章主要介紹了React性能優(yōu)化系列之減少props改變的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • React中進(jìn)行條件渲染的實(shí)現(xiàn)方法

    React中進(jìn)行條件渲染的實(shí)現(xiàn)方法

    React是一種流行的JavaScript庫(kù),它被廣泛應(yīng)用于構(gòu)建Web應(yīng)用程序,在React中,條件渲染是一個(gè)非常重要的概念,它允許我們根據(jù)不同的條件來(lái)呈現(xiàn)不同的內(nèi)容,在本文中,我們將探討React如何進(jìn)行條件渲染,需要的朋友可以參考下
    2023-11-11

最新評(píng)論