搭建React简单项目

 

一、项目构建 

目录结构:

 

安装脚手架

npm install -g create-react-app
// or
yarn add -g create-react-app
一、项目版本

1、react:"^18.3.1";

2、react-router-dom:"^6.23.1";

3、项目创建方式:create-react-app;

 安装路由

npm install react-router-dom -S
二、路由配置
1、路由-对象配置
(1)router.js

        在src/创建一个router.js文件(目录结构可以自定义)

// src/router/index.jsx
import { createBrowserRouter } from "react-router-dom";// import App from "./App";
import Home from "../views/home/index";
import Login from "../views/Login";
import ErrorPage from "../views/errorPage";
import Content from "../views/Content";
import Abouts from "../views/Abouts";
import Contact from "../views/Contact";
import Users from "../views/users/index";
const router = createBrowserRouter([{path:'/',element: <Home />,errorElement:<ErrorPage />,children: [{path: "content",element: <Content />,},],},{path:'/login/:name?/:age?',element: <Login />,errorElement:<ErrorPage />,},{path:'/Abouts',element: <Abouts />,errorElement:<ErrorPage />,},{path:'/Contact',element: <Contact />,errorElement:<ErrorPage />,},{path:'/users/:name?/:age?',element: <Users />,errorElement:<ErrorPage />,},{path:'*', // 通配符 代表除上面提到的路径,其他都会直接显示errorPage页面element:<ErrorPage />}
])export default router

安装axios

 1. 安装 Axios
在项目根目录下打开终端,执行以下命令来安装 Axios: 

npm install axios

 

 2. 创建 Axios 封装文件
在项目的 src 目录下创建一个名为 utils 的文件夹(如果不存在的话),然后在 utils 文件夹中创建一个名为 http.js 的文件,用于封装 Axios 请求。

import axios from 'axios';// 创建一个 Axios 实例
const instance = axios.create({baseURL: 'https://your-api-base-url.com', // 替换为你的 API 基础 URLtimeout: 10000, // 请求超时时间
});// 请求拦截器
instance.interceptors.request.use(config => {// 在发送请求之前做些什么,例如添加请求头// const token = localStorage.getItem('token');// if (token) {//     config.headers.Authorization = `Bearer ${token}`;// }return config;},error => {// 处理请求错误console.error('请求出错:', error);return Promise.reject(error);}
);// 响应拦截器
instance.interceptors.response.use(response => {// 对响应数据做点什么return response.data;},error => {// 处理响应错误console.error('响应出错:', error);return Promise.reject(error);}
);// 封装 GET 请求
const get = (url, params = {}) => {return instance.get(url, { params });
};// 封装 POST 请求
const post = (url, data = {}) => {return instance.post(url, data);
};// 导出封装的请求方法
export { get, post };
请求示例: 
import React, { useState, useEffect,useRef } from "react";
import { useNavigate } from "react-router-dom";
import { post } from '../../utils/http'; // 引入封装的请求
export default function Login() {const onCaptchaChange = async () => {// 在这里实现获取验证码的逻辑console.log("获取验证码");try {// 发送获取验证码请求const response = await post('/login/captcha',{company_id: '',});console.log('验证码响应:', response);// 新增:更新 captchaKey 状态if (response.data.captchaKey) {// setCaptchaData(()=>{//     return {//         captchaUrl: response.data.captchaUrl,//         captchaKey: response.data.captchaKey,//     };// });setCaptchaData((prevData) => {return {...prevData,captchaUrl: response.data.captchaUrl,captchaKey: response.data.captchaKey,};});// captchaUrls = response.data.captchaUrl;console.log(captchaData,'---{captchaData.captchaUrl}')}// post('/login/captcha', {//     company_id: '',// }).then((res) => {//     console.log(res, '---res')//     // CustomImage({ src: res.data.captchaUrl, alt: '验证码' });//     setCaptchaData(() => {//         return {//             captchaUrl: res.data.captchaUrl,//             captchaKey: res.data.captchaKey,//         };//     });// })} catch (error) {console.error('获取验证码失败:', error);}};// 使用 useEffect 在组件挂载时调用 onCaptchaChange 方法useEffect(() => {console.log(captchaUrls.current);//   onCaptchaChange(); // 调用函数以获取验证码}, []);
}

eact如何导入md5 

在 React 项目里对密码进行 MD5 加密,你可以借助 crypto-js 库,它提供了 MD5 加密功能。以下是详细步骤:

npm install crypto-js

// ... existing code ...
import CryptoJS from 'crypto-js'; // 导入 crypto-js 库export default function Login() {// ... existing code ...const onFinish = async (values) => {console.log("用户名:", values.username);// 对密码进行 MD5 加密const encryptedPassword = CryptoJS.MD5(values.password).toString(); console.log("加密后的密码:", encryptedPassword);console.log("验证码:", values.captcha);console.log("所选角色:", values.selectedRole);try {// 发送登录请求,使用加密后的密码const response = await post('/login/validate', {account: values.username,password: encryptedPassword, // 使用加密后的密码captcha: values.captcha,company_id: values.selectedRole,captchaKey: captchaData.captchaKey,});console.log('登录响应:', response);// 模拟登录成功后跳转到主页navigate("/home");} catch (error) {console.error('登录失败:', error);}};// ... existing code ...
}

 

 代码解释
- 导入 crypto-js :运用 import CryptoJS from 'crypto-js' 导入 crypto-js 库。
- 加密密码 :在 onFinish 函数里,借助 CryptoJS.MD5(values.password).toString() 对密码进行 MD5 加密,然后把加密后的密码传递给登录请求。
通过上述步骤,你就能在 React 项目里使用 MD5 对密码进行加密了。

栏目展示

首页

 

// home.jsx
import { Outlet,useNavigate } from "react-router-dom"
import Header from "../../components/Header"
import Footer from "../../components/Footer"
// src/views/Home.jsx
export default function Home(){// home.jsxconst navigate = useNavigate()const goLogin = () => {// params传参navigate('/login/csq/100')}const clickfun = () => {console.log('点击了内容区域')}function menufun() {console.log('点击了菜单')// this.setState({//   msg: '我是菜单'// })}// home.jsxreturn (<><div className="main"><Header></Header><div className="layout"><div className="menu" onClick={goLogin}>去登录</div><div className="content" onClick={clickfun}>内容</div><div className="menu" onClick={menufun}>菜单3</div>{/* <div className="menu">{msg}</div> */}</div><div className="content"><Outlet /></div><Footer></Footer></div></>)
}
 关于我们

//关于我们页面。tsx文件
import React from 'react'; //引入react 依赖
import Header from '../../components/Header';
import Footer from '../../components/Footer'; //引入底部组件const Abouts = () => {return(<><Header /><div><h1>关于我们</h1><p>我们是一个专注于提供优质服务的团队。</p><p>我们的团队成员都是经验丰富的专业人士。</p></div><Footer /></>);
};
export default Abouts;
联系我们 

 

//联系我们
import React from'react';
import { Layout } from 'antd';
import 'antd/dist/antd.css';
import Header from '../../components/Header';
// import './index.css';
const { Footer } = Layout;
export default class FooterPage extends React.Component {render() {return (<><Header /><Footer style={{ textAlign: 'center' }}><div className="footer-container"><div className="footer-content"><h3>联系我们</h3><p>地址:北京市朝阳区</p><p>电话:010-12345678</p><p>邮箱:12345678@qq.com</p><p>工作时间:周一至周五 9:00-18:00</p><p>QQ:123456789</p></div></div></Footer></>);}
}

页面仅仅展示一下效果

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知识库已上线

目录 知识库上线了加入知识库注册账号切换租户加入租户找到知识库点击申请等待管理员审核通过后&#xff0c;点击去后台可以开始创作了创建我们的第一个知识库点击详情进入创作页面&#xff0c;创建我们的第一篇知识 发布知识将我们的知识库变更为公开状态发布知识等待管理员审…

对象克隆以及BigInteger()方法,与BigDecima()方法的学习

BigInteger&#xff08;&#xff09;方法&#xff1a; ①获取一个随机的大整数&#xff1a; public class Test3 {public static void main(String[] args) {Random rnew Random();BigInteger bigIntegernew BigInteger(4,r);System.out.println(bigInteger);} } ②&#xf…

学习记录-vue2,3-vue实现tab栏

目录 vue实现tab栏功能描述实现效果vue实现tab栏实现步骤1. 概念理解2. Tab栏切换 完整实例代码 vue实现tab栏功能描述 选项卡切换选中状态 实现效果 vue实现tab栏实现步骤 1. 概念理解 了解vue的基础指令 代码含义v-on绑定事件&#xff0c;可以简写为:事件名“执行体”。…

【读书笔记】华为《从偶然到必然》

note 华为的成功并非偶然&#xff0c;而是通过IPD体系、投资组合管理、平台战略等系统性工具&#xff0c;将研发投资转化为可持续的商业竞争力。书中强调的“管理即内部因素”理念&#xff0c;揭示了企业规模扩张与管理能力匹配的深层规律&#xff0c;为高科技企业提供了可借鉴…

表达式树和编译原理【10道经典面试题】(中英对照)

表达式树&#xff08;Expression Tree&#xff09; 是一种用于表示数学表达式的二叉树结构。它在编译器设计、数学计算引擎、符号计算等领域有着广泛的应用&#xff08;《表达式树&#xff08;Expression Tree&#xff09;在编译器中的应用》&#xff09;。理解表达式树的构建、…

【redis】主从复制:单点问题、配置详解、特点详解

文章目录 单点问题什么是主从复制主从模式能解决的问题并发量有限可用性问题 配置建立复制通过配置文件来指定端口配置主从查看集群结构 断开复制 特点安全性只读传输延迟 单点问题 分布式系统中&#xff0c;涉及到一个非常关键的问题&#xff1a;单点问题 某个服务器程序&…

VSCode 生成HTML 基本骨架

在VSCode 新建html文件中敲一个英文感叹号 ! <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

STM32定时器-01定时器概述

内容概述 定时器是STM32中功能最强大、结构最复杂的一个外设&#xff0c;分为四部分&#xff1a; 一部分&#xff1a;定时中断功能 二部分&#xff1a;定时器输出比较&#xff0c;常见的用途&#xff1a;产生PWM波形&#xff0c;驱动电机&#xff08;如驱动舵机和直流电机&…

在 Ubuntu 中用 Docker 安装 RAGFlow

一、安装 1.前提条件 CPU > 4 核 RAM > 16 GB Disk > 50 GB Docker > 24.0.0 & Docker Compose > v2.26.1 安装docker&#xff1a;在Ubuntu中安装Docker并配置国内镜像 2.设置 vm.max_map_count #设置 vm.max_map_count 不小于 262144# 查看 sysctl vm.…

17153 班级活动

17153 班级活动 ⭐️难度&#xff1a;简单 &#x1f31f;考点&#xff1a;2023、思维、国赛 &#x1f4d6; &#x1f4da; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 10…

Java IO 流:从字节到字符再到Java 装饰者模式(Decorator Pattern),解析与应用掌握数据流动的艺术

在 Java 编程中&#xff0c;IO&#xff08;输入输出&#xff09;流是处理数据输入输出的核心工具。无论是读取文件、网络通信&#xff0c;还是处理用户输入&#xff0c;IO 流都扮演着重要角色。本文将深入探讨 Java IO 流的核心概念、分类、经典代码实例及其应用场景&#xff0…

HTTPS

目录 一 HTTPS是什么 二 加密 三 加密方案 四 CA机构/证书 五 最终方案(对称密钥/非对称密钥/CA证书)和总体流程 一 HTTPS是什么 在应用层存在SSL&#xff0c;TLS(HTTP之下&#xff0c;传输层之上)加密/解密安全协议&#xff0c;如果HTTP经过这个协议&#xff0c;对端也走…

StarRocks 主键(Primary Key)深度解析

一、StarRocks 产品简介 StarRocks 是一款高性能分析型数据库&#xff0c;专为海量数据的实时分析而设计。作为新一代湖仓&#xff08;Lakehouse&#xff09;加速引擎&#xff0c;StarRocks 融合了 MPP 架构和列式存储引擎的优势&#xff0c;能够支持亿级数据秒级查询响应。 …

(学习总结30)Linux 进程优先级、进程切换和环境变量

Linux 进程优先级、进程切换和环境变量 进程优先级基本概念查看系统进程PRI 和 NI 解释进程优先级调整命令行调整进程优先级调整新进程调度优先级命令 nice调整已运行进程调度优先级命令 renice 使用 top 调整进程优先级使用系统调用调整进程优先级 进程的竞争、独立、并行、并…

《Manus学习手册》.pdf(文末附完整版下载地址)

大家好&#xff0c;我是吾鳴。 吾鳴今天要给大家分享的一份比较全面详细的Manus学习手册&#xff0c;该学习手册主要包含Manus产品概述与核心理念、Manus功能与使用场景、Manus技术架构与工作流、Manus案例库与用户实践、邀请码获取与内测信息、Manus与传统AI对比与优势、用户评…

【MySQL】从零开始:掌握MySQL数据库的核心概念(三)

人生碌碌&#xff0c;竞短论长&#xff0c;却不道枯荣有数&#xff0c;得失难量。 前言 这是我自己学习MySQL数据库的第二篇博客总结。后期我会继续把MySQL数据库学习笔记开源至博客上。 上一期笔记是关于MySQL数据库的数据类型&#xff0c;没看的同学可以过去看看&#xff1a…

Web3智能合约与数据交互安全性探讨

Web3智能合约与数据交互安全性探讨 随着区块链技术的飞速发展&#xff0c;Web3的概念已经成为技术圈的热门话题。Web3不仅仅是技术迭代&#xff0c;它代表了一种全新的互联网交互方式&#xff0c;其中智能合约扮演着核心角色。智能合约是自动执行、控制或文档化法律事件和行动…

人工智能赋能山西乡村振兴:智能空间规划与可持续发展

摘要&#xff1a;随着人工智能技术的快速发展&#xff0c;山西乡村振兴面临着从传统农业到智能化现代化转型的重大机遇。本文探讨了人工智能在山西乡村振兴中的具体应用&#xff0c;重点分析了智能空间规划、生态保护与环境治理、产业转型以及基础设施升级的可能路径。文章从数…

QT三 自定义控件

一 自定义控件 现在的需求是这样&#xff1a; 假设我们要在QWidget 上做定制&#xff0c;这个定制包括了关于 一些事件处理&#xff0c;意味着要重写QWidget的一些代码&#xff0c;这是不实际的&#xff0c;因此我们需要自己写一个MyWidget继承QWidget&#xff0c;然后再MyWi…

【C++ 进阶】语句:从基础到实践

目录 一、输入输出体系的范式革命 1.1 C语言的格式化 1.2 C的流抽象革命 二、字符串处理的抽象跃迁 2.1 C语言的字符指针 2.2 C的string类革命 三、结构体到类的类型系统进化 3.1 C语言的结构体局限 3.2 C类的革命性演进 四、基础控制语句差异 4.1 条件语句&#xf…