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

news2024/11/17 11:35:29

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

    • 效果示例图
    • README.md
      • 学习网站
      • 创建项目
      • 安装react-router-dom v6依赖
      • 安装scss
    • 项目目录
    • 路由router/index.js
    • App.js
    • index.js
    • 路由地址错误,打开404页面
    • 页面docs/index.jsx
    • 页面tutorial/index.jsx

效果示例图

在这里插入图片描述

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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/636904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

fio下发的请求大小不确定

fio下发的请求大小不确定 问题描述调用栈回顾nvme_set_queue_limits函数研究内核调用栈 问题描述 fio --filename/dev/xxx_dev --direct1 --rwwrite --bs1M --ioenginelibaio --iodepth1 --runtime60 --numjobs1 --time_based --group_reporting --name"test xxx" -…

第一课 django后端框架初始和安装

这里写目录标题 django是什么django 发展历史:django主要组件django的应用场景django的官网如下django的安装 django是什么 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 django 发展历史: Django 是从真实世界的应用中成长起来的&#xff0c;它是由堪萨斯…

你知道微信的转账是可以退回的吗

微信作为当今最受欢迎的即时通讯软件之一&#xff0c;其转账功能得到了广泛的应用。在使用微信转账时&#xff0c;我们可能会遇到一些问题&#xff0c;例如误操作、支付失败或者需要退款等等。 首先需要注意的是&#xff0c;微信转账退回的操作只能在“一天内未确认”时进行。如…

亚马逊美国站 幼儿床CPC认证 亚马逊审核标准ASTM F1821检测报告

婴儿床的作用 1、孩子单独睡觉可以锻炼他的独立能力&#xff1b; 2、与父母分开睡对孩子的呼吸好&#xff0c;空气流通的好&#xff0c;比较清新&#xff1b; 3、晚上睡觉时大人会压到宝宝&#xff0c;或者大人盖被子时可能不小心蒙住孩子的头&#xff0c;这都是非常危险的&…

数据存储:MySQL之MVCC

MVCC(Mutil-Version Concurrency Control)&#xff0c;中文翻译为多版本并发控制。 MVCC只在repeatable read和read committed两个隔离级别下工作。其他两个隔离级别和MVCC不兼容。因为READ UNCOMMITTED 总是读取最新版本的数据&#xff0c;而不是符合当前事务版本的数据快照。…

势不可挡!实景三维新技术“踏足”新疆热土!

6月6日&#xff0c;众所瞩目的“全自主、全流程、全覆盖”2023实景三维新技术报告会乌鲁木齐站重磅召开。来自传统测绘、应急管理、水利、建筑工程等行业200多位专家、同仁、行业精英齐聚祖国西北边陲热土&#xff0c;共同交流实景三维新技术发展新趋势。 新疆维吾尔自治区测绘…

【Android开发基础】SQLite开发复刻通讯录、记事本、计算机

文章目录 一、引言二、设计1、通讯录&#xff08;1&#xff09;效果&#xff08;2&#xff09;思路&#xff08;3&#xff09;实现 2、记事本&#xff08;1&#xff09;效果&#xff08;2&#xff09;思路&#xff08;3&#xff09;实现 三、附件1、计算器UI界面设计2、源代码 …

这是国内“颜值最高”的大学生知识交流社区

【WRITE-BUG数字空间】要“颜值”有“颜值”&#xff0c;要“内涵”有“内涵”&#x1f60e; 界面UI紧随潮流、符合大学生的审美&#xff0c;功能更是完备&#xff1a; &#x1f449; 提供聊天大厅&#xff0c;即时群聊、畅所欲言 &#x1f449; 提供协同编辑的云文档&#xff…

代码随想录| day11|栈与队列part02 ● 20. 有效的括号● 1047. 删除字符串中的所有相邻重复项● 150. 逆波兰表达式求值

20. 有效的括号 链接&#xff1a;代码随想录 阅读答案并二刷。 class Solution { public:bool isValid(string s) {int ns.size();int i0;//建立括号栈stack<char>sta;while(i<n){char temps[i];if(temp(||s[i]{||s[i][){sta.push(temp);}else{if(sta.empty()){return…

Halcon 光盘一维码识别 曲面一维码识别 识别光盘上的条形码(极坐标变换,将曲面的一维码转成矩形的一维条码)

文章目录 1 问题描述2 关键代码演示2.1 分割CD上包含条形码的环2.2 极坐标变换 将环状条码转成矩形条码3 完整代码1 问题描述 如图 识别光盘上的条形码 图片路径 C:\Users\hp\AppData\Roaming\MVTec\HALCON-22.11-Steady\examples\images2 关键代码演示 2.1 分割CD上包含条形…

项目管理专业人员能力等级评价CSPM(国标评级)你想知道的这都有

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…

Vue中如何进行文件预览与打印?

Vue中如何进行文件预览与打印&#xff1f; 在Vue应用中&#xff0c;有时我们需要实现文件预览和打印的功能。比如&#xff0c;我们可能需要预览并打印PDF文件、图片文件等。本文将介绍如何在Vue中实现文件预览和打印的功能&#xff0c;并提供相应的代码示例。 文件预览 PDF文…

“混战”大模型,知乎、小红书、快手各有所长

配图来自Canva可画 一直以来&#xff0c;追逐风口都是互联网企业的天性。因此&#xff0c;继元宇宙风口之后&#xff0c;横空出世并火遍全国的AIGC和ChatGPT&#xff0c;便又成为了各行业企业追逐的焦点。在此背景下&#xff0c;无论是国内互联网大厂&#xff0c;还是科技公司…

力扣笔记(每日随机一题)—— 打强整数

问题&#xff08;中等&#xff09; 给定三个整数x 、 y 和 bound &#xff0c;返回 值小于或等于 bound 的所有 强整数 组成的列表 。 如果某一整数可以表示为 x i y j x^i y^j xiyj &#xff0c;其中整数 i > 0 且 j > 0 i > 0 且 j > 0 i>0且j>0&a…

jmeter009:用户自定义变量

添加路径&#xff1a;线程组>配置元件>用户自定义变量 (用户自定义变量)元件的使用&#xff1a;

vue 打开重复页签

先上图 这两个红色框线实际都是产品详情页面&#xff0c;用产品名称替代了页面的title 1、首先在router/index.js配置路由 {path: /productDetail,component: Layout,hidden: true,children: [{path: productDetail/:productId(\\d), //必须该种方法传递参数component: () &…

超高频工业rfid读头对比高频读头有哪些优势?

超高频的工作频段主要在860MHz~960MHz之间&#xff0c;对比高频RFID来说&#xff0c;超高频技术的传输速度更快&#xff0c;读取距离也更远&#xff0c;批量群读的性能也更好&#xff0c;因此在工业、物流与供应链等领域都有非常广泛的应用。 超高频工业rfid读头对比高频读头有…

Java通过jni调用C语言函数,IntelliJ IDEA,CLion,动态链接库dll,本地方法,native

Java通过jni调用C语言函数 使用的工具 IntelliJ IDEACLion 开始之前的注意事项 确保安装了mingw并配置了环境变量&#xff08;下载地址&#xff1a;https://udomain.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds…

【2023】华为OD机试真题Java CC++ Python JS Go-题目0245-信号发射和接收

题目0245-信号发射和接收 题目描述 有一个二维的天线矩阵,每根天线可以向其他天线发射信号,也能接收其他天线的信号,为了简化起见,我们约定每根天线只能向东和向南发射信号,换言之,每根天线只能接收东向或南向的信号。 每根天线有自己的高度anth,每根天线的高度存储在…

软件之禅(五)Input 出场

黄国强 2023/06/12 这篇文章我们引入新的概念&#xff0c;即输入&#xff08;Input&#xff09;。类似 Output &#xff0c;Input 也有多种输入形式。同样我们也需要做个设计&#xff0c;封装后续的变化。继续上代码。 / // 输入类class Input; using InputPtr std::shared_p…