基于react18.x和router v6创建一个简单的静态页面

本文详细介绍了如何基于React18.x和ReactRouterv6创建一个简单的静态页面,包括项目创建、依赖安装、路由配置、按需加载优化以及404错误页面的设置。同时,提到了使用SCSS进行样式管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果示例图

在这里插入图片描述

README.md

学习网站

1.React官网:https://react.dev/
2.https://books.sangniao.com/manual/2512864574/848656128

创建项目

npx create-react-app <folder-name> -->没有react环境时
create-react-app <folder-name>

安装react-router-dom v6依赖

npm install react-router-dom --save

安装scss

npm install node-sass sass-loader --save-dev

项目目录

在这里插入图片描述

路由router/index.js

import { createBrowserRouter } from "react-router-dom";

import App from "../App";

import Docs from "../views/docs";
import Tutorial from "../views/tutorial";
import Blog from "../views/blog";
import Community from "../views/community";

import NotFound from "../views/error/404";

/**
 * loader 是 createBrowserRouter() 函数中一个可选的配置选项,用于异步加载路由组件。
 * 如果你的应用程序包含大量路由,并且这些路由对应的组件很大,则可以使用 loader 选项来实现按需加载,从而提高应用程序的性能和加载速度
 *
 * loader方法在渲染页面前执行,这个方法有一个对象参数,里面常用的有两个属性params和request
 * **/

/**
 * 通过 createBrowserRouter() 函数创建了一个基于浏览器的路由器
 * **/
const BrowserRouter = createBrowserRouter([
  {
    path: "/",
    element: <App />,
    errorElement: <NotFound />,
    loader: ({ params, request }) => {
      console.log("[params]", params);
      console.log("[request]", request);
      return {};
    },
    children: [
      {
        path: "docs",
        element: <Docs />,
      },
      {
        path: "tutorial",
        element: <Tutorial />,
      },
      {
        path: "blog",
        element: <Blog />,
      },
      {
        path: "community",
        element: <Community />,
      },
    ],
  },
]);

export default BrowserRouter;

App.js

import { useEffect } from "react";
import { Link, Outlet, useLocation, useNavigate } from "react-router-dom";

function App() {
  const location = useLocation();
  const navigate = useNavigate();

  useEffect(() => {
    console.log("[App]", location);
    if (location.pathname === "/") {
      navigate("/docs");
    }
  }, [location, navigate]);

  return (
    <>
      <div className="app-container">
        {/* 侧边菜单 */}
        <div className="sidebar-container">
          <ul className="sidebar-menu">
            {/* 使用ES6 模板字符串:动态添加className */}
            <li
              className={`sideBar-item ${
                location.pathname === "/docs" ? "sideBar-item-current" : ""
              }`}
            >
              <Link to={`docs`}>Docs</Link>
            </li>
            <li
              className={[
                "sideBar-item",
                location.pathname === "/tutorial" ? "sideBar-item-current" : "",
              ].join(" ")}
            >
              <Link to={`tutorial`}>Tutorial</Link>
            </li>
            <li
              className={`sideBar-item ${
                location.pathname === "/blog" ? "sideBar-item-current" : ""
              }`}
            >
              <Link to={`blog`}>Blog</Link>
            </li>
            <li
              className={`sideBar-item ${
                location.pathname === "/community" ? "sideBar-item-current" : ""
              }`}
            >
              <Link to={`community`}>Community</Link>
            </li>
          </ul>
        </div>
        {/* 内容 */}
        <div className="main-container">
          <Outlet />
        </div>
      </div>
    </>
  );
}

export default App;

index.js

import React from "react";
import ReactDOM from "react-dom/client";
import { RouterProvider } from "react-router-dom";
import BrowserRouter from "./router";

import "./assets/css/style.css";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <RouterProvider router={BrowserRouter} />
  </React.StrictMode>
);

路由地址错误,打开404页面

error/404.jsx

import { useNavigate } from "react-router-dom";
import errorImg from "../../assets/images/404.jpg";
import "./404.scss";


let errorWrap = {
  width: "100%",
  height: "100vh",
  display: "flex",
  flexDirection: "column",
  overflow: "hidden",
  position: "relative",
};

function NotFound() {
  const navigate = useNavigate();

  function goHome() {
    navigate("/");
  }

  return (
    <>
      <div style={errorWrap}>
        <img style={{ width: "100%", height: "100vh" }} alt="" src={errorImg} />
        <div className="errorContent btnStyle" onClick={goHome}>
          返回首页
        </div>
        <div className={`tipsTxt tipsStyle`}>你的路径是不是有误?</div>
      </div>
    </>
  );
}

export default NotFound;

error/404.scss

.errorContent {
  position: absolute;
  top: 300px;
  left: 50%;
  transform: translateX(-50%);
  font-size: 32px;
  font-weight: bold;
  color: #00a2ef;
  cursor: pointer;
}
.btnStyle {
  padding: 12px 16px;
  border: 2px dashed #00a2ef;
  border-radius: 8px;
}
.tipsTxt {
  position: absolute;
  top: 400px;
  left: 50%;
  transform: translateX(-50%);
}
.tipsStyle {
  font-size: 16px;
  color: #999;
}

页面docs/index.jsx

import { useEffect } from "react";

function Docs() {
  useEffect(() => {
    console.log("[Doms]");
  }, []);

  return (
    <>
      <div>Docs</div>
    </>
  );
}

export default Docs;

页面tutorial/index.jsx

import { useEffect } from "react";

function Tutorial() {
  useEffect(() => {
    console.log("[Tutorial]");
  }, []);

  return (
    <>
      <div>Tutorial</div>
    </>
  );
}

export default Tutorial;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值