上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

React 路由react-router-dom详解

guduadmin211月前

React 路由react-router-dom详解

( 路由嵌套 + 路由传参 + 路由权限 + 路由优化 按需导入 + 404页面 )

前面我们先了解一下 路由是什么? 路由分类有哪些?内置API有哪些?

可能有点枯燥,不喜欢看的直接跳过!

1,相关理解

  1. 单页Web应用(single page web application,SPA)。
  2. 整个应用只有一个完整的页面。
  3. 点击页面中的链接不会刷新页面,只会做页面的局部更新。
  4. 数据都需要通过ajax请求获取, 并在前端异步展现。

2,路由的理解:

1. 什么是路由?
  1. 一个路由就是一个映射关系(key:value)
  2. key为路径, value可能是function或component

2,react-router-dom的理解:

  1. react的一个插件库。
  2. 专门用来实现一个SPA应用。
  3. 基于react的项目基本都会用到此库。

一,基本路由使用:

先看看效果:

React 路由react-router-dom详解,在这里插入图片描述,第1张

1,下载安装:

  1. win + R

  2. cmd 打开

    React 路由react-router-dom详解,在这里插入图片描述,第2张

  3. cd/react项目文件目录

    React 路由react-router-dom详解,在这里插入图片描述,第3张

  4. 安装:

 npm  i react-router-dom -S

React 路由react-router-dom详解,在这里插入图片描述,第4张

很好,你已经完成了,安装!

二, 接下来是使用路由的步骤

文件

React 路由react-router-dom详解,在这里插入图片描述,第5张

1, 创建页面

在 src路径下新建views文件,页面组件新建在这里面

React 路由react-router-dom详解,在这里插入图片描述,第6张

2,新建路由文件

在 src路径下 新建router文件夹,在这里配置路由

React 路由react-router-dom详解,在这里插入图片描述,第7张

3,配置路由文件:

在 router路径下 新建index.jsx文件夹,在这里配置路由

React 路由react-router-dom详解,在这里插入图片描述,第8张

  1. 导入路由依赖
// 导入路由依赖
import { useRoutes } from "react-router-dom";
  1. 导入所需组件,首页 关于
// 导入所需组件,首页  关于
import HomeView from "../views/HomeView";
import AboutView from "../views/AboutView";
  1. 创建路由
// 创建路由
const routes = [
  {
    path: "/",
    element: ()
  },
  {
    path: "/about",
    element: ()
  },
];
  1. 使用useRoutes 创建,导出路由
// 使用useRoutes 创建
export default function RouterView() {
  // 创建路由
  const elem = useRoutes(routes);
  // 返回接口
  return elem;
}

完整代码:

React 路由react-router-dom详解,在这里插入图片描述,第9张

以上配置是路由基础配置:

这样还是看不到效果的,要配置导航使用路由

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

路径:src / App.jsx

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

Router: 路由

RouterView: 路由组件 ,导入路由文件

HashRouter: 哈希路由

NavLink: 导航链接

  1. 使用,配置导航链接,这里使用 函数组件:

全部代码:

import RouterView from "./router";
import { HashRouter as Router, NavLink } from "react-router-dom";
function App() {
  return (
    
      首页  || 
      关于  || 
      
    
  );
}
export default App;
  1. 效果图:

    React 路由react-router-dom详解,在这里插入图片描述,第10张

三, 路由传参:

1,路由文件配置:

React 路由react-router-dom详解,在这里插入图片描述,第11张

2,组件使用:

ProductView.jsx文件配置:

  1. 引入useParams

这里我新建了一个组件 ProductView.jsx

 import { useParams } from "react-router-dom"
  1. 获取参数
  const { id } = useParams()
  1. 渲染参数:
    

产品参数:{id}

ProductView.jsx 文件代码:

React 路由react-router-dom详解,在这里插入图片描述,第12张

App.jsx 文件配置:

传参:

产品123  || 
产品456  || 
App.jsx 文件代码:

React 路由react-router-dom详解,在这里插入图片描述,第13张

效果:

React 路由react-router-dom详解,在这里插入图片描述,第14张

四, 路由嵌套:

  1. 路由文件配置:src / router / index.jsx
// 导入路由依赖
import { useRoutes } from "react-router-dom";
// 导入所需组件,首页  关于
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";
// 创建路由
const routes = [
  {
    path: "/",
    element: 
  },
  {
    path: "/about",
     element: 
  },
  {
    path: "/product/:id",
    element: 
  },
  {
    path: "/admin",
    element:  
    // 配置子路由
    children: [
      {
        path: "",
        element: 
      },
      {
        path: "orderlist",
        element: 
      }
    ]
  },
// 使用useRoutes 创建
export default function RouterView() {
  // 创建路由
  const elem = useRoutes(routes);
  // 返回接口
  return elem;
}
  1. 组件文件配置:

新建文件 以下图:

React 路由react-router-dom详解,在这里插入图片描述,第15张

views / AdminView.jsx文件:

import { NavLink, Outlet } from "react-router-dom";
function AdminView() {
  return (
    

管理页面

管理页面 ||  概览页面
); } export default AdminView;

NavLink :导航链接

Outlet: 子组件容器

views / DashView.jsx文件:

function DashView() {
    return ( 

概览页面内容

); } export default DashView;

views / OrderList.jsx文件:

function OrderList() {
    return (

管理页面内容

); } export default OrderList;

效果图:

React 路由react-router-dom详解,在这里插入图片描述,第16张

五, 路由查询参数:

1, App.jsx文件 导航配置:

React 路由react-router-dom详解,在这里插入图片描述,第17张

代码:

import RouterView from "./router";
import { HashRouter as Router, NavLink } from "react-router-dom"
function App() {
    return (
        首页   || 
        关于  || 
        admin页面  || 
        产品123  || 
        产品456  || 
        产品hello  || 
        产品word  || 
        
    );
}
export default App;

传参:?redirect= “ 传的查询参数 ”

2,AboutView.jsx 文件:

代码:

import { useSearchParams, NavLink, useNavigate, useLocation } from "react-router-dom"
function AboutView() {
    // 获取about查询参数redirect的值
    const [SearchParams] = useSearchParams()
    // 获取redirect的值
    const redirect = SearchParams.get('redirect')
    // 渲染
    return (
{/* // 传递查询参数 */}

About页面查询参数:-{redirect}

); } // 导出组件 export default AboutView;

六,组件按需导入(懒加载):

用于 性能优化。

lazy方法, subspense组件

1,定义懒加载组件router / LazyLoad.jsx

// 动态加载组件
import { lazy, Suspense } from "react";
// 动态加载组件 方法
function LazyLoad(url) {
  // 配置动态加载组件路径
  const Element = lazy(() => import(url));
  return (
    // 返回组件,Suspense:懒加载组件
    

加载中. . .

}> {/* 内容组件 */}
); } // 导出方法 export default LazyLoad;

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

引入:
// 导入懒加载组件方法
import LazyLoad from "./LazyLoad";
使用:
element: LazyLoad("../views/HomeView")
router / index.jsx文件 代码:
// 导入路由依赖
import { useRoutes } from "react-router-dom";
// 导入所需组件,首页  关于
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";
// 创建路由
const routes = [
  {
    path: "/",
    element: ("../views/HomeView")
  },
  {
    path: "/about",
    element: ("../views/AboutView")
  },
  {
    path: "/product/:id",
    element: ("../views/ProductView")
  },
  {
    path: "/admin",
    element:  ,
    // 配置子路由
    children: [
      {
        path: "",
        element: 
      },
      {
        path: "orderlist",
        element: 
      }
    ]
  },
];
// 使用useRoutes 创建
export default function RouterView() {
  // 创建路由
  const elem = useRoutes(routes);
  // 返回接口
  return elem;
}
效果图:

按需加载

React 路由react-router-dom详解,在这里插入图片描述,第18张

七,路由权限:

类似于Vue里的路由守卫:未登陆 不能打开一些页面

有权限返回子组件,没有权限跳转到登录

1,定义权限组件router/Private.jsx

本地存储有 token,就有权限,

没有token,就没有权限

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

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

权限组件包裹着 内容组件

element: < Private>< AdminView />,

// 导入路由依赖
import { useRoutes } from "react-router-dom";
// 导入所需组件,首页  关于
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";
// 创建路由
const routes = [
  {
    path: "/",
    element: LazyLoad("../views/HomeView")
  },
  {
    path: "/about",
    element: LazyLoad("../views/AboutView")
  },
  {
    path: "/product/:id",
    element: LazyLoad("../views/ProductView")
  },
  {
    path: "/admin",
    element:  ,
    // 配置子路由
    children: [
      {
        path: "",
        element: 
      },
      {
        path: "orderlist",
        element: 
      }
    ]
  },
];
// 使用useRoutes 创建
export default function RouterView() {
  // 创建路由
  const elem = useRoutes(routes);
  // 返回接口
  return elem;
}
效果图:

React 路由react-router-dom详解,在这里插入图片描述,第19张

八,设置404错误页面:

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

import { NavLink } from "react-router-dom"
function NoMatch() {
    return (

你的页面被😽偷走了!

首页
); } export default NoMatch;

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

// 配置404页面

{

path: “*”,

element:

}

path 值为 *

// 导入路由依赖
import { useRoutes } from "react-router-dom";
// 导入所需组件,首页  关于
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";
// 导入权限组件
import Private from "./Private";
// 导入懒加载组件方法
import LazyLoad from "./LazyLoad";
// 创建路由
const routes = [
  {
    path: "/",
    element: LazyLoad("../views/HomeView")
  },
  {
    path: "/about",
    element: LazyLoad("../views/AboutView")
  },
  {
    path: "/product/:id",
    element: LazyLoad("../views/ProductView")
  },
  {
    path: "/admin",
    element: ( ),
    // 配置子路由
    children: [
      {
        path: "",
        element: 
      },
      {
        path: "orderlist",
        element: 
      }
    ]
  },
  // 配置404页面
  {
    path: "*",
    element: 
  }
];
// 使用useRoutes 创建
export default function RouterView() {
  // 创建路由
  const elem = useRoutes(routes);
  // 返回接口
  return elem;
}
效果图:

React 路由react-router-dom详解,在这里插入图片描述,第20张

总结:

路由组件与方法:

  1. 组件

    < HashRouter> 哈希路由

    < BrowserRouter> 浏览器路由

    < NavLink> 导航链接

    选中会有active 类名

    < Link>导航链接

    < OutLet>子路由容器

  2. 方法

    useRoutes使用路由配置

    useParams() 路由参数

    useSearchParams() 获取查询参数

React 路由react-router-dom详解,在这里插入图片描述,第21张

      

网友评论

搜索
最新文章
热门文章
热门标签
 
 梦见棺材盖子打开是什么征兆  女人梦见蛇咬自己预示着什么  梦见好多鱼在水里游是什么意思