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

React 路由react-router-dom示例詳解

 更新時(shí)間:2024年01月26日 11:23:47   作者:邢帥兵_  
一個(gè)路由就是一個(gè)映射關(guān)系(key:value),key為路徑, value可能是function或component,本文給大家介紹React 路由react-router-dom詳解,感興趣的朋友跟隨小編一起看看吧

React 路由react-router-dom詳解

( 路由嵌套 + 路由傳參 + 路由權(quán)限 + 路由優(yōu)化 按需導(dǎo)入 + 404頁(yè)面 )

前面我們先了解一下 路由是什么? 路由分類有哪些??jī)?nèi)置API有哪些
可能有點(diǎn)枯燥,不喜歡看的直接跳過(guò)

1,相關(guān)理解

單頁(yè)Web應(yīng)用(single page web application,SPA)。整個(gè)應(yīng)用只有一個(gè)完整的頁(yè)面。點(diǎn)擊頁(yè)面中的鏈接不會(huì)刷新頁(yè)面,只會(huì)做頁(yè)面的局部更新。數(shù)據(jù)都需要通過(guò)ajax請(qǐng)求獲取, 并在前端異步展現(xiàn)。

2,路由的理解:

1. 什么是路由?

一個(gè)路由就是一個(gè)映射關(guān)系(key:value)key為路徑, value可能是function或component

2,react-router-dom的理解:

react的一個(gè)插件庫(kù)。專門用來(lái)實(shí)現(xiàn)一個(gè)SPA應(yīng)用。基于react的項(xiàng)目基本都會(huì)用到此庫(kù)。

一,基本路由使用: 先看看效果:

1,下載安裝:

win + R

cmd 打開(kāi)

cd/react項(xiàng)目文件目錄

安裝:

 npm  i react-router-dom -S

很好,你已經(jīng)完成了,安裝!

二, 接下來(lái)是使用路由的步驟

文件

1, 創(chuàng)建頁(yè)面

src路徑下新建views文件,頁(yè)面組件新建在這里面

2,新建路由文件

src路徑下 新建router文件夾,在這里配置路由

3,配置路由文件:

router路徑下 新建index.jsx文件夾,在這里配置路由

導(dǎo)入路由依賴

// 導(dǎo)入路由依賴
import { useRoutes } from "react-router-dom";

導(dǎo)入所需組件,首頁(yè) 關(guān)于

// 導(dǎo)入所需組件,首頁(yè)  關(guān)于
import HomeView from "../views/HomeView";
import AboutView from "../views/AboutView";

創(chuàng)建路由

// 創(chuàng)建路由
const routes = [
  {
    path: "/",
    element: (<HomeView></HomeView>)
  },
  {
    path: "/about",
    element: (<AboutView ></AboutView >)
  },
];

使用useRoutes 創(chuàng)建,導(dǎo)出路由

// 使用useRoutes 創(chuàng)建
export default function RouterView() {
  // 創(chuàng)建路由
  const elem = useRoutes(routes);
  // 返回接口
  return elem;
}

完整代碼:

以上配置是路由基礎(chǔ)配置
這樣還是看不到效果的,要配置導(dǎo)航使用路由

4,使用并切換路由,配置App.jsx文件:

路徑:src / App.jsx

導(dǎo)入:

import RouterView from "./router";
import { HashRouter as Router, NavLink } from "react-router-dom";

Router: 路由

RouterView: 路由組件 ,導(dǎo)入路由文件

HashRouter: 哈希路由

NavLink: 導(dǎo)航鏈接

使用,配置導(dǎo)航鏈接,這里使用 函數(shù)組件:

全部代碼:

import RouterView from "./router";
import { HashRouter as Router, NavLink } from "react-router-dom";
function App() {
  return (
    <Router>
      <NavLink to="/">首頁(yè)</NavLink> &emsp;||&emsp;
      <NavLink to="/about">關(guān)于</NavLink> &emsp;||&emsp;
      <RouterView />
    </Router>
  );
}
export default App;

效果圖:

三, 路由傳參:

1,路由文件配置:

2,組件使用: ProductView.jsx文件配置: 引入useParams

這里我新建了一個(gè)組件 ProductView.jsx

 import { useParams } from "react-router-dom"

獲取參數(shù)

  const { id } = useParams()

渲染參數(shù):

    <h1>產(chǎn)品參數(shù):{id}</h1>

ProductView.jsx 文件代碼:

App.jsx 文件配置:

傳參:

<NavLink to="/product/123">產(chǎn)品123</NavLink> &emsp;||&emsp;
<NavLink to="/product/456">產(chǎn)品456</NavLink> &emsp;||&emsp;

App.jsx 文件代碼:

效果:

四, 路由嵌套:

路由文件配置:src / router / index.jsx

// 導(dǎo)入路由依賴
import { useRoutes } from "react-router-dom";
// 導(dǎo)入所需組件,首頁(yè)  關(guān)于
import HomeView from "../views/HomeView";
import AboutView from "../views/AboutView";
import ProductView from "../views/ProductView";
import AdminView from "../views/admin/AdminView";
import DashView from "../views/admin/DashView";
import OrderList from "../views/admin/OrderList";
// 組件嵌套組件
import Private from "./Private";
// 創(chuàng)建路由
const routes = [
  {
    path: "/",
    element: <HomeView></HomeView>
  },
  {
    path: "/about",
     element: <AboutView></AboutView>
  },
  {
    path: "/product/:id",
    element: <ProductView></ProductView>
  },
  {
    path: "/admin",
    element:  <AdminView />
    // 配置子路由
    children: [
      {
        path: "",
        element: <DashView></DashView>
      },
      {
        path: "orderlist",
        element: <OrderList></OrderList>
      }
    ]
  },
// 使用useRoutes 創(chuàng)建
export default function RouterView() {
  // 創(chuàng)建路由
  const elem = useRoutes(routes);
  // 返回接口
  return elem;
}

組件文件配置:

新建文件 以下圖:

views / AdminView.jsx文件:

import { NavLink, Outlet } from "react-router-dom";
function AdminView() {
  return (
    <div>
      <h3>管理頁(yè)面</h3>
      <NavLink to="">管理頁(yè)面</NavLink>&emsp;||&emsp;
      <NavLink to="orderlist">概覽頁(yè)面</NavLink>
      <Outlet />
    </div>
  );
}
export default AdminView;

NavLink :導(dǎo)航鏈接
Outlet: 子組件容器

views / DashView.jsx文件:

function DashView() {
    return ( <div>
        <h3>概覽頁(yè)面內(nèi)容</h3>
    </div> );
}
export default DashView;

views / OrderList.jsx文件:

function OrderList() {
    return (<div>
        <h3>管理頁(yè)面內(nèi)容</h3>
    </div>);
}
export default OrderList;

效果圖:

五, 路由查詢參數(shù):

1, App.jsx文件 導(dǎo)航配置:

代碼:

import RouterView from "./router";
import { HashRouter as Router, NavLink } from "react-router-dom"
function App() {
    return (<Router>
        <NavLink to="/">首頁(yè)</NavLink >  &emsp;||&emsp;
        <NavLink to="/about">關(guān)于</NavLink> &emsp;||&emsp;
        <NavLink to="/admin">admin頁(yè)面</NavLink> &emsp;||&emsp;
        <NavLink to="/product/123">產(chǎn)品123</NavLink> &emsp;||&emsp;
        <NavLink to="/product/456">產(chǎn)品456</NavLink> &emsp;||&emsp;
        <NavLink to="/about?redirect=hello">產(chǎn)品hello</NavLink> &emsp;||&emsp;
        <NavLink to="/about?redirect=word">產(chǎn)品word</NavLink> &emsp;||&emsp;
        <RouterView></RouterView>
    </Router>);
}
export default App;

傳參:?redirect= “ 傳的查詢參數(shù) ”

2,AboutView.jsx 文件:

代碼:

import { useSearchParams, NavLink, useNavigate, useLocation } from "react-router-dom"
function AboutView() {
    // 獲取about查詢參數(shù)redirect的值
    const [SearchParams] = useSearchParams()
    // 獲取redirect的值
    const redirect = SearchParams.get('redirect')
    // 渲染
    return (<div>
         {/* // 傳遞查詢參數(shù) */}
        <h1>About頁(yè)面查詢參數(shù):-{redirect}</h1>
    </div>);
}
// 導(dǎo)出組件
export default AboutView;

六,組件按需導(dǎo)入(懶加載):

用于 性能優(yōu)化。
lazy方法, subspense組件

1,定義懶加載組件router / LazyLoad.jsx

// 動(dòng)態(tài)加載組件
import { lazy, Suspense } from "react";
// 動(dòng)態(tài)加載組件 方法
function LazyLoad(url) {
  // 配置動(dòng)態(tài)加載組件路徑
  const Element = lazy(() => import(url));
  return (
    // 返回組件,Suspense:懶加載組件
    <Suspense fallback={<h3>加載中. . . </h3>}>
      {/* 內(nèi)容組件 */}
      <Element />
    </Suspense>
  );
}
// 導(dǎo)出方法
export default LazyLoad;

2,路由router / index.jsx文件使用: 引入:

// 導(dǎo)入懶加載組件方法
import LazyLoad from "./LazyLoad";

使用:

element: LazyLoad("../views/HomeView")

router / index.jsx文件 代碼:

// 導(dǎo)入路由依賴
import { useRoutes } from "react-router-dom";
// 導(dǎo)入所需組件,首頁(yè)  關(guān)于
import HomeView from "../views/HomeView";
import AboutView from "../views/AboutView";
import ProductView from "../views/ProductView";
import AdminView from "../views/admin/AdminView";
import DashView from "../views/admin/DashView";
import OrderList from "../views/admin/OrderList";
// 創(chuàng)建路由
const routes = [
  {
    path: "/",
    element: ("../views/HomeView")
  },
  {
    path: "/about",
    element: ("../views/AboutView")
  },
  {
    path: "/product/:id",
    element: ("../views/ProductView")
  },
  {
    path: "/admin",
    element:  <Private><AdminView /></Private>,
    // 配置子路由
    children: [
      {
        path: "",
        element: <DashView></DashView>
      },
      {
        path: "orderlist",
        element: <OrderList></OrderList>
      }
    ]
  },
];
// 使用useRoutes 創(chuàng)建
export default function RouterView() {
  // 創(chuàng)建路由
  const elem = useRoutes(routes);
  // 返回接口
  return elem;
}

效果圖:

按需加載

七,路由權(quán)限:

類似于Vue里的路由守衛(wèi):未登陸 不能打開(kāi)一些頁(yè)面
有權(quán)限返回子組件,沒(méi)有權(quán)限跳轉(zhuǎn)到登錄

1,定義權(quán)限組件router/Private.jsx

本地存儲(chǔ)有 token,就有權(quán)限,
沒(méi)有token,就沒(méi)有權(quán)限

import {Navigate} from "react-router-dom"
// 權(quán)限路由
function Private(props) {
    if(localStorage.getItem("token")) {
        return <>{props.children}</> ;
    }else {
        return <Navigate to="/" />
    }
}
export default Private;

2,路由index . jsx文件使用:

權(quán)限組件包裹著 內(nèi)容組件
element: < Private>< AdminView /></ Private>,

// 導(dǎo)入路由依賴
import { useRoutes } from "react-router-dom";
// 導(dǎo)入所需組件,首頁(yè)  關(guān)于
import HomeView from "../views/HomeView";
import AboutView from "../views/AboutView";
import ProductView from "../views/ProductView";
import AdminView from "../views/admin/AdminView";
import DashView from "../views/admin/DashView";
import OrderList from "../views/admin/OrderList";
import Private from "./Private";
import LazyLoad from "./LazyLoad";
// 創(chuàng)建路由
const routes = [
  {
    path: "/",
    element: LazyLoad("../views/HomeView")
  },
  {
    path: "/about",
    element: LazyLoad("../views/AboutView")
  },
  {
    path: "/product/:id",
    element: LazyLoad("../views/ProductView")
  },
  {
    path: "/admin",
    element:  <Private><AdminView /></Private>,
    // 配置子路由
    children: [
      {
        path: "",
        element: <DashView></DashView>
      },
      {
        path: "orderlist",
        element: <OrderList></OrderList>
      }
    ]
  },
];
// 使用useRoutes 創(chuàng)建
export default function RouterView() {
  // 創(chuàng)建路由
  const elem = useRoutes(routes);
  // 返回接口
  return elem;
}

效果圖:

八,設(shè)置404錯(cuò)誤頁(yè)面:

1,新建404組件文件 src / views / NoMatch.jsx :

import { NavLink } from "react-router-dom"
function NoMatch() {
    return (<div>
        <h1>你的頁(yè)面被??偷走了!</h1>
        <NavLink to="/">首頁(yè)</NavLink>
    </div>);
}
export default NoMatch;

2,路由配置,src / router / index.jsx :

// 配置404頁(yè)面
{
path: “*”,
element:
}
path 值為 *

// 導(dǎo)入路由依賴
import { useRoutes } from "react-router-dom";
// 導(dǎo)入所需組件,首頁(yè)  關(guān)于
import NoMatch from "../views/NoMatch";
import HomeView from "../views/HomeView";
// import AboutView from "../views/AboutView";
import ProductView from "../views/ProductView";
import AdminView from "../views/admin/AdminView";
import DashView from "../views/admin/DashView";
import OrderList from "../views/admin/OrderList";
// 導(dǎo)入權(quán)限組件
import Private from "./Private";
// 導(dǎo)入懶加載組件方法
import LazyLoad from "./LazyLoad";
// 創(chuàng)建路由
const routes = [
  {
    path: "/",
    element: LazyLoad("../views/HomeView")
  },
  {
    path: "/about",
    element: LazyLoad("../views/AboutView")
  },
  {
    path: "/product/:id",
    element: LazyLoad("../views/ProductView")
  },
  {
    path: "/admin",
    element: ( <Private><AdminView /></Private>),
    // 配置子路由
    children: [
      {
        path: "",
        element: <DashView/>
      },
      {
        path: "orderlist",
        element: <OrderList/>
      }
    ]
  },
  // 配置404頁(yè)面
  {
    path: "*",
    element: <NoMatch />
  }
];
// 使用useRoutes 創(chuàng)建
export default function RouterView() {
  // 創(chuàng)建路由
  const elem = useRoutes(routes);
  // 返回接口
  return elem;
}

效果圖:

總結(jié):

路由組件與方法:

組件

< HashRouter> 哈希路由
< BrowserRouter> 瀏覽器路由
< NavLink> 導(dǎo)航鏈接
選中會(huì)有active 類名
< Link>導(dǎo)航鏈接
< OutLet>子路由容器

方法

useRoutes使用路由配置
useParams() 路由參數(shù)
useSearchParams() 獲取查詢參數(shù)

到此這篇關(guān)于React 路由react-router-dom詳解的文章就介紹到這了,更多相關(guān)React 路由react-router-dom內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入淺析react native es6語(yǔ)法

    深入淺析react native es6語(yǔ)法

    這篇文章主要介紹了深入淺析react native es6語(yǔ)法的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • 簡(jiǎn)單分析React中的EffectList

    簡(jiǎn)單分析React中的EffectList

    這篇文章主要簡(jiǎn)單分析了React中的EffectList,幫助大家更好的理解和學(xué)習(xí)使用React進(jìn)行前端開(kāi)發(fā),感興趣的朋友可以了解下
    2021-04-04
  • React組件通信實(shí)現(xiàn)流程詳解

    React組件通信實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了React組件通信,在開(kāi)發(fā)中組件通信是React中的一個(gè)重要的知識(shí)點(diǎn),本文通過(guò)實(shí)例代碼給大家講解react中常用的父子、跨組件通信的方法,需要的朋友可以參考下
    2022-12-12
  • react+react-beautiful-dnd實(shí)現(xiàn)代辦事項(xiàng)思路詳解

    react+react-beautiful-dnd實(shí)現(xiàn)代辦事項(xiàng)思路詳解

    這篇文章主要介紹了react+react-beautiful-dnd實(shí)現(xiàn)代辦事項(xiàng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • React中g(shù)etDefaultProps的使用小結(jié)

    React中g(shù)etDefaultProps的使用小結(jié)

    React中的getDefaultProps功能允許開(kāi)發(fā)者為類組件定義默認(rèn)屬性,提高組件的靈活性和容錯(cuò)性,本文介紹了getDefaultProps的作用、語(yǔ)法以及最佳實(shí)踐,并探討了其他替代方案,如函數(shù)組件中的默認(rèn)參數(shù)、高階組件和ContextAPI等,理解這些概念有助于提升代碼的可維護(hù)性和用戶體驗(yàn)
    2024-09-09
  • React-router 4 按需加載的實(shí)現(xiàn)方式及原理詳解

    React-router 4 按需加載的實(shí)現(xiàn)方式及原理詳解

    本篇文章主要介紹了React-router 4 按需加載的實(shí)現(xiàn)方式及原理詳解,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-05-05
  • React immer與Redux Toolkit使用教程詳解

    React immer與Redux Toolkit使用教程詳解

    這篇文章主要介紹了React中immer與Redux Toolkit的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-10-10
  • react電商商品列表的實(shí)現(xiàn)流程詳解

    react電商商品列表的實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了react實(shí)現(xiàn)電商商品列表的流程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • react中useState使用:如何實(shí)現(xiàn)在當(dāng)前表格直接更改數(shù)據(jù)

    react中useState使用:如何實(shí)現(xiàn)在當(dāng)前表格直接更改數(shù)據(jù)

    這篇文章主要介紹了react中useState的使用:如何實(shí)現(xiàn)在當(dāng)前表格直接更改數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 一文帶你搞懂useCallback的使用方法

    一文帶你搞懂useCallback的使用方法

    useCallback是用來(lái)幫忙緩存函數(shù)的,當(dāng)依賴項(xiàng)沒(méi)有發(fā)生變化時(shí),返回緩存的指針,而props涉及到復(fù)雜對(duì)象類型都是通過(guò)指針來(lái)傳遞到,下面這篇文章主要給大家介紹了關(guān)于useCallback使用的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評(píng)論