React路由

114 阅读2分钟

1.react 路由

1. 认识React-Router

2. Router的基本使用

2.1安装

npm i react-router-dom

BrowserRouter: 基于HTML5 history API的路由器,可以处理浏览器的前进、后退按钮。 HashRouter: 基于hash的路由器,可以处理URL中的hash部分。

2.2 导入

import { BrowserRouter as Router, Switch, Route } from "react-router-dom";

2.3 基本使用

1.引入 index.js

import { HashRouter } from "react-router-dom";
root.render(
    <React.StrictMode>
        <HashRouter>
            <App />
        </HashRouter>
    </React.StrictMode>
);

2.使用路由

  • path: 路由的路径,可以是字符串或者正则表达式。
  • element: 路由渲染的组件。
  • Router5.x 中使用component属性,6.x不支持该属性。
  • to 属性:路由跳转的目标地址。
  • 会被渲染成a元素。
  • NavLink组件:可以用来渲染一个激活状态的链接,当路由匹配成功时,NavLink组件会自动添加active类名。
import { Route, Routes, Link, NavLink } from "react-router-dom";
import Home from "./pages/Home";
import Profile from "./pages/Profile";

<div className="app">
  <div className="app-header">
    <NavLink to="/home">Home</NavLink>
    <Link to="/profile">profile</Link>
  </div>
  <div className="app-content">
    <Routes>
      <Route path="/" element={<Home></Home>} />
      <Route path="/home" element={<Home></Home>} />
      <Route path="/profile" element={<Profile></Profile>} />
    </Routes>
  </div>
  <div className="app-footer">app-footer</div>
</div>
  • Navigate组件:可以用来实现路由跳转。实现路由重定向、参数传递等功能, to属性:路由跳转的目标地址。
  • 配置notFont页面:配置notFound页面,当路由匹配不到时,渲染该页面。
import { Navigate, Route } from "react-router-dom";
<Route path="/" element={<Navigate to={"/home"} />} />
<Route path="*" element={<NotFont></NotFont>} />

3. 路由的嵌套

在Home组件中,嵌套了HomeRecommend、HomeRanking组件。

<Route path="/home" element={<Home></Home>}>
  <Route path="/home" element={<Navigate to={"/home/recommend"} />} />
  <Route path="/home/recommend" element={<HomeRecommend></HomeRecommend>} />
  <Route path="/home/ranking" element={<HomeRanking></HomeRanking>} />
</Route>

在Home组件中设置路径,使用了Outlet组件,用来渲染子路由。

<Link to={"/home/recommend"}>推荐</Link>
<Link to={"/home/ranking"}>歌单</Link>
<Outlet></Outlet>

4. 路由的代码跳转

  • 在类组件中
  1. with_router.js 封装函数,将路由器对象作为道具注入到封装的组件中
import { useNavigate } from "react-router-dom";
function withRouter(WrappedComponent) {
    return function (props) {
        const navigate = useNavigate();
        const router = { navigate };

        // 将路由器对象注入到 props 中
        return <WrappedComponent {...props} router={router} />;
    };
}
export default withRouter;

集体导出

import withRouter from "./with_router";
export { withRouter };

2.使用 Home.jsx

// 引入
import { withRouter } from "../hoc/index";
// 绑定函数
navigateTo(path) {
	const { navigate } = this.props.router;
	navigate(path);
}
<button onClick={() => this.navigateTo("/home/ranking")}>home-ranking组件</button>
// 高阶函数进行包裹
export default withRouter(Home);

5. 路由的参数传递

  • 第一种方式:通过useParams传递参数
// 1. with_router.js
import { useNavigate, useParams } from "react-router-dom";
const params = useParams(); // 路由参数对象
const router = { navigate, params };
// 2. 页面中跳转并传参
// 动态路由配置
<Route path="/detail/:id" element={<Detail></Detail>} />
navigateTo(id) {
  const { navigate } = this.props.router;、
  navigate(`/detail/${id}`);
}
// 3. 获取参数 withRouter
const { router } = this.props;
const { id } = router.params;
  • 第二种方式:通过useLocation或useSearchParams传递参数
import { useLocation, useNavigate, useParams, useSearchParams } from "react-router-dom";

// 将路由器对象作为道具注入到封装的组件中
function withRouter(WrappedComponent) {
  return function (props) {
  // 导航
  const navigate = useNavigate();
  
  // 动态路由的参数 /detail/:id
  const params = useParams();
  
  // 查询字符串参数 /users?name=tom&age=20
  const location = useLocation();
  const [searchParams] = useSearchParams();
  const query = Object.fromEntries(searchParams);
  
  // 路由器对象
  const router = { navigate, params, location, query };
  
  // 将路由器对象注入到 props 中
  return <WrappedComponent {...props} router={router} />;
  };
}
export default withRouter;

01.png

6. 路由的配置

  • 拆分路由配置及懒加载
  1. 配置路由 src\router\index.js
import React from "react";
import { Navigate } from "react-router-dom";
// 懒加载
const Home = React.lazy(() => import("../pages/Home"));
const HomeRecommend = React.lazy(() => import("../pages/HomePage/Recommend"));
const HomeRanking = React.lazy(() => import("../pages/HomePage/Ranking"));
const NotFont = React.lazy(() => import("../pages/NotFont"));
const routes = [
  {
    path: "/",
    element: <Navigate to={"/home"} />
  },
  {
    path: "/home",
    element: <Home />,
    children: [
      {
        path: "/home",
        element: <Navigate to={"/home/recommend"} />
      },
      {
        path: "/home/recommend",
        element: <HomeRecommend />
      }
    ]
 },
 {
   path: "*",
   element: <NotFont />
 }
];
export default routes;
  1. 懒加载要配合Suspense组件使用
import React, { Suspense } from "react";
<Suspense fallback={<div>Loading...</div>}>
    <App />
</Suspense>