react项目规范新手教程

简介

React是一种流行的JavaScript库,用于构建用户界面。搭建一个React项目并不难,但确保项目的结构和配置正确可以帮助你更有效地开发和维护应用程序。以下是搭建React项目的一些步骤:

项目规范:项目中有一些开发规范和代码风格

  1. 文件夹、文件名称统一小写、多个单词以连接符(-)连接;
  2. JavaScript变量名称采用小驼峰标识,常量全部使用大写字母,组件采用大驼峰;
  3. CSS采用普通CSS和styled-component结合来编写(全局采用普通CSS、局部采用styled-component);
  4. 整个项目不再使用class组件,统一使用函数式组件,并且全面拥抱Hooks;
  5. 所有的函数式组件,为了避免不必要的渲染,全部使用memo进行包裹;
  6. 组件内部的状态,使用useState、useReducer;业务数据全部放在redux中管理;
  7. 函数组件内部基本按照如下顺序编写代码:
  • 组件内部state管理;
  • redux的hooks代码;
  • 其他hooks相关代码(比如自定义hooks);
  • 其他逻辑代码;
  • 返回JSX代码;
  1. redux代码规范如下:
  • redux目前我们学习了两种模式,在项目实战中尽量两个都用起来,都需要掌握;
  • 每个模块有自己独立的reducer或者slice,之后合并在一起;
  • redux中会存在共享的状态、从服务器获取到的数据状态;
  1. 网络请求采用axios
  • 对axios进行二次封装;
  • 所有的模块请求会放到一个请求文件中单独管理;
  1. 项目使用AntDesign、MUI(Material UI)
  • 爱彼迎本身的设计风格更多偏向于Material UI,但是课程中也会尽量讲到AntDesign的使用方法;
  • 项目中某些AntDesign、MUI中的组件会被拿过来使用;
  • 但是多部分组件还是自己进行编写、封装、实现;
  1. 其他规范在项目中根据实际情况决定和编写;

创建项目

◼ 创建项目的方式:create-react-app
◼ 项目配置:
 配置项目的icon
 配置项目的标题
 配置jsconfig.json
◼ 通过craco配置别名和less文件:

jsconfig.json

{"compilerOptions": {"target": "es5","module": "esnext","baseUrl": "./","moduleResolution": "node","paths": {"@/*": ["src/*"]},"jsx": "preserve","lib": ["esnext","dom","dom.iterable","scripthost"]}
}

项目目录结构划分

在一个React项目中,保持代码规范和结构清晰有助于提高可维护性和可读性。以下是一些新手可以遵循的规范和最佳实践来创建React项目:

项目结构

  1. 目录结构

    • src/: 源代码目录,存放组件、页面、样式等。
    • public/: 存放静态资源,如图片、字体等。
    • assets/: 可存放项目中使用的资源文件,例如图片、字体、图标等。
    • components/: 存放可复用的组件。
    • pages/: 存放页面级组件。
    • styles/: 存放全局样式文件。
    • utils/: 存放通用函数。
    • services/: 存放API调用相关代码。
    • hooks/: 存放自定义Hook。
    • tests/: 存放测试文件。
  2. 组件划分

    • 函数式组件:优先使用函数式组件,配合React Hooks使用。
    • 逻辑与展示分离:在组件内部,将逻辑代码和展示代码分开,便于理解和维护。
  3. 文件命名

    • 文件命名采用驼峰式或帕斯卡命名法(例如:MyComponent.js)。
    • 文件扩展名为.js.jsx,具体视项目的配置而定。
  4. 样式

    • 使用模块化CSS或CSS-in-JS来管理组件的样式,避免样式冲突。
    • 使用命名空间或特定命名规则(如BEM)来规范样式类名。

在这里插入图片描述

别名配置 @

index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from '@/App';// @ => src:webpack  (采用第二种方法)
// 问题 react脚手架隐藏webpack
// 解决一 npm run reject
// 解决二 craco =>create-react-app config const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<React.StrictMode><App /></React.StrictMode>
);

在这里插入图片描述

安装依赖

npm i @craco/craco@alpha -D

修改配置
创建文件夹craco.config.js

const path = require('path')const resolve = (pathName) => path.resolve(__dirname, pathName)
module.exports = {// less// webpackwebpack: {alias: {'@': resolve('src'),'components': resolve('src/components'),'utils': resolve('src/utils'),},},
}

在修改package.json

  "scripts": {"start": "craco start","build": "craco build","test": "craco test","eject": "craco eject"},

启动

npm run start

配置less

在这里插入图片描述

安装

npm i craco-less@2.1.0-alpha.0 -D

配置
在这里插入图片描述
craco.config.js

const path = require('path')
const CracoLessPlugin = require('craco-less');const resolve = pathname => path.resolve(__dirname, pathname)module.exports = {// lessplugins: [{plugin: CracoLessPlugin},],// webpackwebpack: {alias: {"@": resolve("src"),"components": resolve("src/components"),"utils": resolve("src/utils")}}
}

CSS样式的重置

  1. 对默认CSS样式进行重置:
  • normalize.css
    安装
npm i normalize.css
  • reset.less

@import "./variables.less";body, button, dd, dl, dt, form, h1, h2, h3, h4, h5, h6, hr, input, li, ol, p, pre, td, textarea, th, ul {padding: 0;margin: 0;
}a {color: @textColor;text-decoration: none;
}img {vertical-align: top;
}ul, li {list-style: none;
}

variables.less定义变量

@textColor: #484848;
@textColorSecondary: #222;

在这里插入图片描述
index.js中配置

import "normalize.css";
import './assets/css/index.less';

全家桶 – Router配置

安装

npm i react-router-dom

index.js 配置

import React, { Suspense } from 'react'
import ReactDOM from 'react-dom/client'
import { HashRouter } from "react-router-dom"const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<React.StrictMode><Suspense fallback="loading"><HashRouter><App /></HashRouter></Suspense></React.StrictMode>
)

router/index.js

import React from 'react'import { Navigate } from "react-router-dom"const Home = React.lazy(() => import("@/views/home"))
const Entire = React.lazy(() => import("@/views/entire"))
const Detail = React.lazy(() => import("@/views/detail"))const routes = [{path: "/",element: <Navigate to="/home"/>},{path: "/home",element: <Home/>},{path: "/entire",element: <Entire/>},{path: "/detail",element: <Detail/>}
]export default routes

在这里插入图片描述
App.jsx

import React, { memo } from 'react'
import { useRoutes } from 'react-router-dom'
import routes from './router'const App = memo(() => {return (<div className='app'><div className='header'>header</div><div className='page'>{useRoutes(routes)}</div><div className='footer'>footer</div></div>)
})export default App

全家桶 – Redux状态管理

安装

npm i @reduxjs/toolkit react-redux

开始配置

  1. 创建文件 sotre
    在这里插入图片描述
  2. store/index.js

import { configureStore } from '@reduxjs/toolkit'
import homeReducer from './modules/home'
import entireReducer from './modules/entire'// 两种方式配置 reducer
const store = configureStore({reducer: {},
})export default store
  1. 入口 修改index.js
import { Provider } from 'react-redux'
import store from './store'// 使用 Redux Provider 包裹应用
root.render(<React.StrictMode><Suspense fallback="loading"><Provider store={store}><HashRouter><App /></HashRouter></Provider></Suspense></React.StrictMode>
)
  1. 在 Store 中注册 State Slice
    在这里插入图片描述
    home.js
import { createSlice } from '@reduxjs/toolkit'const homeSlice = createSlice({name: 'home',initialState: {productList:[]},reducers: {}
})
// 注册到store中
export default homeSlice.reducer

如果我们将所有的逻辑代码写到一起,那么当redux变得复杂时代码就难以维护。

  • 接下来,我会对代码进行拆分,将store、reducer、action、constants拆分成一个个文件。
  • 创建store/index.js文件:
  • 创建store/reducer.js文件:
  • 创建store/actionCreators.js文件:
  • 创建store/constants.js文件:

reducer.sj

const initialState = {currentPage: 3,
}function reducer(state = initialState, action) {switch (action.type) {default:return state}
}export default reducer

index.js

import reducer from './reducer'export default reducer

store/index.js


import { configureStore } from '@reduxjs/toolkit'
import homeReducer from './modules/home'
import entireReducer from './modules/entire'// 两种方式配置 reducer
const store = configureStore({reducer: {home: homeReducer, // 注册reducerentire: entireReducer, // 注册reducer},
})export default store

运行项目
在这里插入图片描述

网络请求 - axios

安装

npm i axios

目录
在这里插入图片描述
配置
request/config.js

export const BASE_URL = 'http://codercba.com'
export const TIMEOUT = 10000

request/index.js


import axios from 'axios'
import { BASE_URL, TIMEOUT } from './config'
// 创建实例
class CRequest {constructor(baseURL, timeout) {this.instance = axios.create({baseURL,timeout,})this.instance.interceptors.response.use((res) => {return res.data},(err) => {return err})}request(config) {return this.instance.request(config)}get(config) {return this.request({ ...config, method: 'get' })}post(config) {return this.request({ ...config, method: 'post' })}
}export default new CRequest(BASE_URL, TIMEOUT)

services/index.js

import hRequest from './request';export default hRequest

组件中测试

import React, { memo, useEffect } from 'react'
import hRequest from '@/services'
const index = memo(() => {// 网络请求useEffect(() => {hRequest.get({ rul: '/home/highscore' }).then(res => {console.log(res);})},[])return (<div>Home</div>)
})export default index

以上配置是基础版本,后续会随着项目的深入而继续完善

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

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

相关文章

OpenAI现已普遍提供带有视觉应用程序接口的GPT-4 Turbo

OpenAI宣布&#xff0c;其功能强大的GPT-4 Turbo with Vision模型现已通过公司的API全面推出&#xff0c;为企业和开发人员将高级语言和视觉功能集成到其应用程序中开辟了新的机会。 PS&#xff1a;使用Wildcard享受不受网络限制的API调用&#xff0c;详情查看教程 继去年 9 月…

【论文速读】| CovRL:基于覆盖引导的强化学习对LLM基础变异进行JavaScript引擎模糊测试

本次分享论文为&#xff1a;CovRL: Fuzzing JavaScript Engines with Coverage-Guided Reinforcement Learning for LLM-based Mutation 基本信息 原文作者&#xff1a;Jueon Eom, Seyeon Jeong, Taekyoung Kwon 作者单位&#xff1a;延世大学、苏瑞软科技公司 关键词&#…

Windows中通过cmd查看以保存的WiFi密码

#要以管理员身份运行CMD# 指令命令&#xff1a; netsh wlan show profiles 然后会列出所有保存的wifi。 #再执行netsh wlan show profile name"你想查看的WiFi名称" keyclear并回车# 命令中keyclear代表以明文显示密码 关键内容即为密码。

异地组网怎么安装?

异地组网安装是指在不同地域的多个设备之间建立网络连接&#xff0c;以便实现数据传输和协同工作的过程。在如今的数字化时代&#xff0c;异地组网安装已经成为了许多企业和组织所必需的一项技术。 天联的使用场景 在异地组网安装中&#xff0c;天联是一种常用的工具。它具有以…

LiveNVR监控流媒体Onvif/RTSP功能-概览负载统计展示取流中、播放中、录像中点击柱状图快速定位相关会话

LiveNVR概览负载统计展示取流中、播放中、录像中点击柱状图快速定位相关会话 1、负载信息说明2、快速定位会话3、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、负载信息说明 实时展示取流中、播放中、录像中等使用数目 取流中&#xff1a;当前拉流到平台的实时通道数目播放中&am…

IPA第九届明星盛典 全球人气总冠军 梁悦源 循梦而来 荣耀加冕

2024年1月 30 日-2月1日&#xff0c;魔都上海迎来了龙年第一场“少儿形体行业美育春晚”!由 IPA模特委员会主办的第九届少儿模特明星盛典全球总决赛圆满收官!近 2000 名少儿模特选手从五湖四海而来&#xff0c;决战寒假这场高水准&#xff0c;高人气&#xff0c;高荣誉的时尚竞…

语音智能客服机器人有什么优势?ai机器人部署

人工智能技术的进步&#xff0c;在不断的革新我们的工作和生活&#xff0c;同时&#xff0c;拥有人工智能技术的语音智能客服机器人在销售行业的工作熟悉程度也越来越好&#xff0c;那语音智能客服机器人有什么优势&#xff1f;我们一起来看看。 1、ASR语音文本转换 客户可通过…

flutter material中的Icon组件的IconData 查阅

查阅 https://fonts.google.com/icons?selectedMaterialSymbolsOutlined:expand_less:FILL0;wght300;GRAD0;opsz24&icon.platformandroidhttps://fonts.google.com/icons?selectedMaterialSymbolsOutlined:expand_less:FILL0;wght300;GRAD0;opsz24&icon.platformand…

监控平台zabbix的认识与搭建

一. 监控系统的相关知识 1. 监控系统运用的原因 当我们需要实时关注与其相关的各项指标是否正常&#xff0c;往往存在着很多的服务器、网络设备等硬件资源&#xff0c;如果我们想要能够更加方便的、集中的监控他们&#xff0c;zabbix 可以实现集中监控管理的应用程序。 监控的…

海外代理IP是什么,如何使用?

海外代理IP是一种网络工具&#xff0c;它允许用户通过位于海外的服务器来访问互联网。这种技术的主要作用是帮助用户突破地域限制&#xff0c;解锁全球视野&#xff0c;并保护用户的隐私和安全。 具体来说&#xff0c;海外代理IP的工作原理是&#xff1a;用户的请求首先被发送…

9个应知应会的单行Python代码

当我们开始学习 Python 时&#xff0c;我们通常会优先编写能够完成工作的代码&#xff0c;而不会关注代码的可读性以及代码的简洁性和效率。 确切来说&#xff0c;这是完全没有问题的&#xff0c;但是有一些方法可以在不忽略可读性的情况下缩短我们的 Python 代码。单行 Pytho…

可视化报表Superset

文章目录 一、Superset入门与安装1、Superset概述2、安装Python环境2.1 安装Miniconda2.2 创建Python3.7环境 3、Superset部署3.1 安装Superset3.2 启动Supterset3.3 superset启停脚本 4、docker部署 二、Superset使用与实战1、对接MySQL数据源2、制作仪表盘与图表 一、Superse…

游戏测试审表流程

备注:本文为博主原创文章,未经博主允许禁止转载。如有问题,欢迎指正。 个人笔记(整理不易,有帮助,收藏+点赞+评论,爱你们!!!你的支持是我写作的动力) 笔记目录:笔记本~笔记目录_airtest和selenium那个好用-CSDN博客 个人随笔:工作总结随笔_8、以前工作中都接触过哪…

python接口测试之测试报告

在本文章中&#xff0c;主要使用jenkins和编写的自动化测试代码&#xff0c;来生成漂亮的测试报告&#xff0c;关于什么是CI这些我就不详细的介绍了&#xff0c;这里我们主要是实战为主。 首先搭建java的环境&#xff0c;这个这里不做介绍。搭建好java的环境后&#xff0c;在h…

【已测 非网上加密版】全新UI彩虹站长在线工具箱系统源码下载 全开源版本

支持高达72种站长工具、开发工具、娱乐工具等功能。本地调用API、自带免费API接口&#xff0c;是一个多功能性工具程序支持后台管理、上传插件、添加增减删功能。 环境要求 * PHP > 7.3 * MySQL > 5.6 * fileinfo扩展 * 使用Redis缓存需安装Redis扩展 部署 * 下载源代码 …

智慧用电安全管理系统

智慧用电安全管理系统 智慧用电安全管理系统是智能电网中客户侧关键的构成部分&#xff0c;是基本建设新型智慧城市的基本&#xff0c;将完成地区内各种各样用电设备的智能化系统监管&#xff0c;完成地区内日常生活与工作中安全性、舒服。 一、智慧用电安全管理系统介绍 …

JAVA-贪吃蛇(源代码)

游戏界面: 图片素材: 背景图片 蛇身 食物 蛇头 标题 源代码: 运行界面 package com.snake.game;public class snakeApp {public static void main(String[] args) {//添加界面new snakeJFrame();} }游戏界面类JFrame package com.snake.game;import javax.swing.*; import …

机器学习——模型融合:Stacking算法

机器学习——模型融合&#xff1a;Stacking算法 在机器学习中&#xff0c;模型融合是一种常用的方法&#xff0c;它可以提高模型的泛化能力和预测性能。Stacking算法&#xff08;又称为堆叠泛化&#xff09;是一种强大的模型融合技术&#xff0c;它通过组合多个基本分类器的预…

如何正确使用数字化仪前端信号调理?(二)

在上期文章如何正确使用数字化仪前端信号调理&#xff1f;&#xff08;一&#xff09;中&#xff0c;我们为大家介绍了数字化仪前端电路所需的特性以及使用过程中需要的输入抗阻和输入耦合&#xff0c;本期文章将为您介绍数字化仪前端信号调理的使用过程中所需的输入电压范围&a…

C# 关于进程回收管理的一款工具设计与分享

目录 设计初衷 开发运行环境 Craneoffice ProcessGC 运行主界面 管理任务与策略 其它设置 移动存储设备管理 核心代码-计时器监控 小结 设计初衷 在使用 COM 模式操作 OFFICE 组件的开发过程中&#xff0c;当操作完相关文档后&#xff0c;在某些情况下仍然无法释放掉…