react【六】 React-Router

1、Router

1.1 路由

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 认识React-Router

npm install react-router-dom

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 Link和NavLink

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.4 Navigate

在这里插入图片描述

import React, {
    PureComponent } from "react";
import {
    Navigate } from "react-router-dom";

export class Login extends PureComponent {
   
  constructor(props) {
   
    super(props);

    this.state = {
   
      isLogin: false,
    };
  }

  login() {
   
    this.setState({
    isLogin: true });
  }

  render() {
   
    const {
    isLogin } = this.state;

    return (
      <div>
        <h1>Login Page</h1>
        {
   /* 如果没有登录的话显示登录按钮
            已经登录则跳转到/home页面 */}
        {
   !isLogin ? (
          <button onClick={
   (e) => this.login()}>登录</button>
        ) : (
          <Navigate to="/home" />
        )}
      </div>
    );
  }
}

export default Login;

1.5 Not Found页面配置

在这里插入图片描述

      <Routes>
         <Route path="*" element={
   <NotFound />} />
      </Routes>

1.6 路由的嵌套

在这里插入图片描述

1.7 手动路由的跳转

在这里插入图片描述

1.7.1 在函数式组件中使用hook

在这里插入图片描述

1.7.2 在类组件中封装高阶组件

在这里插入图片描述
在这里插入图片描述

1.8 动态路由传递参数

在这里插入图片描述

  • hoc
import {
   
  useLocation,
  useNavigate,
  useParams,
  useSearchParams,
} from "react-router-dom";

const withRouter = (WrapperComponent) => {
   
  return (props) => {
   
    // 1.导航
    const navigate = useNavigate();

    // 2.动态路由的参数 :/detail/:id
    const params = useParams();

    // 3.查询字符串的参数: /user?name=why&age=18
    const location = useLocation();

    const [searchParams] = useSearchParams();
    const query = Object.fromEntries(searchParams);

    // Object.fromEntries([
    //   ["a", "b"],
    //   ["c", "d"],
    // ]);
    //Object{a:"b", c:"d"}

    const router = {
    navigate, params, location, query };

    return <WrapperComponent {
   ...props} router={
   router} />;
  };
};

export default withRouter;

在这里插入图片描述

import React, {
    PureComponent } from 'react'
import {
    withRouter } from '../hoc'

export class Detail extends PureComponent {
   
  render() {
   
    const {
    router } = this.props
    const {
    params } = router

    return (
      <div>
        <h1>Detail Page</h1>
        <h2>id: {
   params.id}</h2>
      </div>
    )
  }
}

export default withRouter(Detail)

在这里插入图片描述

import React, {
    PureComponent } from 'react'
import {
    withRouter } from '../hoc'

export class User extends PureComponent {
   
  render() {
   
    const {
    router } = this.props
    const {
    query } = router

    return (
      <div>
        <h1>User: {
   query.name}-{
   query.age}</h1>
      </div>
    )
  }
}

export default withRouter(User)

1.9 路由的配置文件以及懒加载

在这里插入图片描述

import Home from "../pages/Home";
import HomeRecommend from "../pages/HomeRecommend";
import HomeRanking from "../pages/HomeRanking";
import HomeSongMenu from "../pages/HomeSongMenu";
// import About from "../pages/About"
// import Login from "../pages/Login"
import Category from "../pages/Category";
import Order from "../pages/Order";
import NotFound from "../pages/NotFound";
import Detail from "../pages/Detail";
import User from "../pages/User";
import {
    Navigate } from "react-router-dom";
import React from "react";

// import 返回的是一个Promise
const About = React.lazy(() => import("../pages/About"));
const Login = React.lazy(() => import("../pages/Login"));

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: "/home/ranking",
        element: <HomeRanking />,
      },
      {
   
        path: "/home/songmenu",
        element: <HomeSongMenu />,
      },
    ],
  },
  {
   
    path: "/about",
    element: <About />,
  },
  {
   
    path: "/login",
    element: <Login />,
  },
  {
   
    path: "/category",
    element: <Category />,
  },
  {
   
    path: "/order",
    element: <Order />,
  },
  {
   
    path: "/detail/:id",
    element: <Detail />,
  },
  {
   
    path: "/user",
    element: <User />,
  },
  {
   
    path: "*",
    element: <NotFound />,
  },
];

export default routes;

在这里插入图片描述

// import { StrictMode } from "react"
import ReactDOM from "react-dom/client";
import App from "./App";
import {
    HashRouter } from "react-router-dom";
import {
    Suspense } from "react";

const root = ReactDOM.createRoot(document.querySelector("#root"));
root.render(
  // <StrictMode>
  <HashRouter>
    // 需要加上Suspense 如果数据js 和 css文件还没请求回来就显示这里的内容
    <Suspense fallback={
   <h3>Loading...</h3>}>
      <App />
    </Suspense>
  </HashRouter>
  // </StrictMode>
);

相关推荐

  1. React-router

    2024-02-14 05:56:01       34 阅读
  2. React router

    2024-02-14 05:56:01       41 阅读
  3. React Router(用法介绍)

    2024-02-14 05:56:01       36 阅读
  4. React Router】快速使用

    2024-02-14 05:56:01       14 阅读
  5. 怎么理解React Router

    2024-02-14 05:56:01       14 阅读
  6. React Router DOM BrowserRouter

    2024-02-14 05:56:01       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-14 05:56:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-14 05:56:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-14 05:56:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-14 05:56:01       20 阅读

热门阅读

  1. EKF与UKF对比,三维状态量滤波

    2024-02-14 05:56:01       28 阅读
  2. 漫画sql数据分析

    2024-02-14 05:56:01       31 阅读
  3. sklearn:机器学习 分类特征编码category_encoders

    2024-02-14 05:56:01       28 阅读
  4. MongoDB聚合:$listSearchIndexes

    2024-02-14 05:56:01       26 阅读
  5. 大模型提示学习、Prompting微调知识

    2024-02-14 05:56:01       30 阅读
  6. 作业2024/2/13

    2024-02-14 05:56:01       25 阅读
  7. gorm day4

    2024-02-14 05:56:01       25 阅读
  8. 如何使用 Python 创建 Twitter 应用程序

    2024-02-14 05:56:01       28 阅读
  9. 算法刷题day11

    2024-02-14 05:56:01       27 阅读
  10. ajax函数库axios基本使用

    2024-02-14 05:56:01       31 阅读
  11. SpringBoot 动态加载jar包,动态配置

    2024-02-14 05:56:01       33 阅读