千峰React:脚手架准备+JSX基础
组件化->封装性
React提供函数组件实现组件化
React和传统JS的区别就是JS需要手动管理DOM操作,React: 采用组件化开发,通过虚拟DOM提升性能。

MVC 是一种软件设计模式,全称为 Model-View-Controller(模型-视图-控制器)。它将应用程序的逻辑分为三个核心组件,以实现代码的分离和模块化



保证自己的node版本在14.18+、16+


main.jsx是主入口
vite构建的react和vue很像,但是npx构建的完全不像

可以用ESlint检测代码报错

有些错误想忽略,可以在这个位置把报的错误写上,例如:'no-empty':'off'

如果想常态化使用这个插件,可以输入这个命令下载,然后再引入
npm i vite-plugin-eslint
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
import eslintPlugin from 'vite-plugin-eslint'//引入// https://vite.dev/config/
export default defineConfig({plugins: [react(),eslintPlugin({include: ['src/*.jsx', 'src/**/*.jsx']//引入要管理的文件,src下的.jsx,*是通配符})],})
每次写完代码在浏览器刷新就会出现报错提示

格式化插件

React和React-dom模块分别起什么作用?

dom操作有两种操作方式:react-dom/client和react-dom/server,一种是对客户端,一种是对服务端,让后端进行操作

React的核心模块除了在浏览器端进行服务,也可以在其他环境使用,比如开发app
这样就不需要dom模块了👇

关于JSX的部分前一篇讲过就不赘述了,讲讲没讲过的
//main.jsx
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import App from './01_了解JSX.jsx'
//import './index.css'//注释掉这个,用上面那个
//import App from './App.jsx'createRoot(document.getElementById('root')).render(<StrictMode><App /></StrictMode>,
)//01_了解JSX.jsx
function App(){return (<div>Hello App</div>)
}
// 也可以这么写
// const App = () => {// }export default App


return后面最好加个小括号,防止后面的程序不执行
jsx的执行过程👇

JSX和HTML之间的写法区别
在 HTML 中,<label> 标签使用 for 属性来关联表单元素的 id,但是在 JSX 中,由于 for 是 JavaScript 的保留字(用于 for 循环),React 使用 htmlFor 来代替 for 属性。
htmlFor 的值 应该与目标表单元素的 id 相同。
两个单词的属性,例如tab-index必须使用驼峰式命名,写成tabIndex
function App(){return (<div>Hello App<label htmlFor="elem">用户名</label><input type="text" id="elem" tabIndex='1'/></div>)
}
export default App
![]()
但是自定义属性该怎么写就怎么写
<input type="text" id="elem" tabIndex='1' onClick={()=>{}} data-id='123'/>
//data-id不报错
大括号里可以写JavaScript,注释也是写在js里的,所以注释符号在大括号里{/*我是注释*/}
function App(){return (<div>Hello App<label htmlFor="elem">用户名</label><input type="text" id="elem" tabIndex='1' onClick={()=>{}} data-id='123'/><div>{1 + 1},{'foo'.toUpperCase()},{[1,2,3].reverse()}</div></div>)
}
export default App

也可以使用声明的变量
function App() {const username='荷叶饭'return (<div>Hello App<label htmlFor="elem">用户名</label><input type="text" id="elem" tabIndex='1' onClick={()=>{}} data-id='123'/><div>{1 + 1},{'foo'.toUpperCase()},{[1, 2, 3].reverse()}<br />{username}</div></div>)
}
export default App

对象和函数是不能直接放到JSX里的
function App() {const username = '荷叶饭'const obj = { user: '荷叶饭', age: '19' }const fn=()=>{}return (<div>Hello App<label htmlFor="elem">用户名</label><input type="text" id="elem" tabIndex='1' onClick={()=>{}} data-id='123'/><div>{1 + 1},{'foo'.toUpperCase()},{[1, 2, 3].reverse()}<br />{username}<br />{obj}//错<br />{fn}//错</div></div>)
}
export default App

属性使用大括号
![]()
唯一根元素是指最外层只能有一个div,这样可以被脚手架转为对象
如果不想用多余的div包住,可以自己写一个容器
import { Fragment } from "react"//提供的容器,渲染时不会渲染function App() {const username = '荷叶饭'const obj = { user: '荷叶饭', age: '19' }const fn=()=>{}return (<Fragment><div>Hello App<label htmlFor="elem">用户名</label><input type="text" id="elem" tabIndex='1' onClick={()=>{}} data-id='123'/><div>{1 + 1},{'foo'.toUpperCase()},{[1, 2, 3].reverse()}<br />{username}<br />{obj}<br />{fn}</div></div><div>我是多出来的div</div></Fragment>//容器)
}
export default App
Fragment是可以添加key属性的,这里不细讲
style的单位默认是px,不写也可以
![]()
说是这么说但是我打印出来的width和body一样宽了
三种样式
这是引入外部样式,效果是全局的,只要className叫box,效果都是一样的👇
import './04_全局样式.css'function App() {// const myStyle = { width: '100px', height: '100px', background: 'red' }return <div className='box'>hello App</div>
}
export default App//./04_全局样式.css
.box {width: 300px;height: 300px;background-color: rgba(94, 99, 173, 0.299);
}

局部样式这么写,名字后面加【.module.css】就是局部的写法

这个写法是错误的
局部样式应该这么写👇
import './04_全局样式.css'
import style from './05_局部样式.module.css'function App() {// const myStyle = { width: '100px', height: '100px', background: 'red' }return (<><div className='box'>hello App</div><div className={style.box2}>aaaaaa</div></>)
}
export default App

总结使用局部样式的步骤包括:写一个name.module.css命名规范的css->在其他要使用的jsx里导入,导入的时候要命名->使用对应的选择器给标签命名,例如这里是className={style.box2}
一个细节是在css里可以写短线【-】,在jsx里不能这么写,应该用中括号括起来加引号,这么写:
//03_style样式.jsx
import './04_全局样式.css'
import style from './05_局部样式.module.css'function App() {// const myStyle = { width: '100px', height: '100px', background: 'red' }return (<><div className='box'>hello App</div><div className={style.box2}>aaaaaa</div><div className={style['head-title']}>hahaha</div></>)
}
export default App//05_局部样式.module.css
.box2 {width: 300px;height: 300px;background-color: blue;
}
.head-title {width: 500px;height: 100px;background-color: chartreuse;
}

但是有的用点,有的用中括号,这很不好
react脚手架vite里提供了机制可以使用驼峰命名,这样就需要在vite.config.js修改配置
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
import eslintPlugin from 'vite-plugin-eslint'// https://vite.dev/config/
export default defineConfig({plugins: [react(),eslintPlugin({include: ['src/*.jsx', 'src/**/*.jsx'],}),],css: {modules: { localsConvention: 'camelCase' },//在这里修改配置},
})
<div className={style.headTitle}>hahaha</div>
sass的预处理
安装sass

写一个sass的文件:

引入并使用
import './06_sass.scss'//引入function App() {return (<><div className='box3'>aaa</div>//使用</>)
}
export default App
预处理器了解就好
sass也可以变成局部的,和局部style是一样的

classnames
可以管理类名
要安装
npm i classnames
导入
import classNames from 'classnames'
使用
import classNames from 'classnames'
import './04_全局样式.css'
import style from './05_局部样式.module.css'function App() {const myClass = classNames({box1: true,box2: false,[style.headTittle]: true,})return (<><div className={myClass}>hello App</div></>)
}
export default App
相关文章:
千峰React:脚手架准备+JSX基础
组件化->封装性 React提供函数组件实现组件化 React和传统JS的区别就是JS需要手动管理DOM操作,React: 采用组件化开发,通过虚拟DOM提升性能。 MVC 是一种软件设计模式,全称为 Model-View-Controller(模型-视图-控制器&#x…...
【算法】快排
题目 快排 思路 如果输入为0或1直接返回;否则取一个基准值,可以取中间位置,如果输入是有序的可以避免时间过长,然后移动指针,先让i指针右移,如果小于基准值就继续右移,j指针左移同理。如果指…...
开放签电子签章工具版 2.0 正式发布,构建全场景电子签约能力、满足复杂的签章管理场景
根据近半年开源用户和市场需求反馈,开放签团队推出电子签章工具版2.0版本,主要解决复杂的签约流程集成和电子印章授权管理场景。以API接口对外提供服务和配置一套可视化后台管理系统,可与业务系统无缝集成,用户使用起来毫无“违和…...
python和pycharm 和Anaconda的关系
好的,下面我会详细说明 Python、PyCharm 和 Anaconda 三者的关系,并逐一解释它们的功能和作用。 1. Python(编程语言) 定义:Python 是一种高级编程语言,设计简洁,易于学习,且功能强…...
DeepSeek V3和R1
DeepSeek V3 和 R1 是深度求索(DeepSeek)推出的两款大模型,基于混合专家架构(MoE),但在设计目标、训练方法和应用场景上存在显著差异。以下是两者的详细对比与补充内容: DeepSeek V3和R1 一、模…...
JavaScript数组-获取数组中的元素
在JavaScript中,数组是一种非常实用的数据结构,它允许我们将多个值存储在一个单独的变量中。无论是数字、字符串还是对象,都可以作为数组的元素。获取数组中的特定元素是操作数组的基础技能之一。本文将详细介绍如何在JavaScript中获取数组中…...
SSE:用于流式传输的协议
一.什么是SSE SSE协议是一种基于http协议的单向通信协议,服务端可以向客户端发送数据,但是客户端不能向服务器发送数据。客户端通过创建一个到服务器的单向连接来监听事件。可以将一次性返回数据包改为流式返回数据。SSE协议支持断线重连,也支…...
Aseprite详细使用教程(7)——切片工具
1.名词解释 快捷键:ShiftC 切片工具功能(了解即可): (1)优化资源加载: 将较大的图像切成多个较小的切片,可减小单个文件大小,在网页或游戏等场景中,能显著提升加载速度…...
航空公司客户价值分析
目录 1 目的 2 方法 3 源代码 4 结果 5 扩展 1 目的 ①借助航空公司客户数据,对客户进行分类; ②对不同的客户类别进行特征分析,比较不同类别的客户的价值; ③针对不同价值的客户类别制定相应的营销策略,为其提供个性…...
基于开源Odoo、SKF Phoenix API与IMAX-8数采网关的圆织机设备智慧运维实施方案 ——以某纺织集团圆织机设备管理场景为例
一、方案背景与需求分析 1.1 纺织行业设备管理痛点 以某华东地区大型纺织集团为例,其圆织机设备管理面临以下挑战: 非计划停机损失高:圆织机主轴轴承故障频发,2024年单次停机损失达12万元(停机8小时导致订单延误&am…...
LLM 架构
LLM 分类 : 自编码模型 (encoder) : 代表模型 : BERT自回归模型 (decoder) : 代表模型 : GPT序列到序列模型 (encoder-decoder) : 代表模型 : T5 自编码模型 (AutoEncoder model , AE) 代表模型 : BERT (Bidirectional Encoder Representation from Transformers)特点 : Enc…...
Word Embeddings
Count-based Approach Term-document matrix: Document vectors Two ways to extract information from the matrix: Column-wise: a document is represented by a |V|-dim vector (V: vocabulary) Widely used in information retrieval: find similar documents 查找類似…...
相机开发调中广角和焦距有什么不一样
在相机中,调整广角和调整焦距是两个不同的概念,它们的作用和实现方式也不同。以下是两者的详细对比和解释: 1. 调整广角 定义 广角是指相机的视野范围(Field of View, FOV)。调整广角实际上是调整相机的视野范围。更广的视野意味着可以捕捉到更多的场景内容(更宽的画面)…...
krpano学习笔记,端口修改,krpano二次开发文档,krpano三维div信息展示,krpano热点显示文字
一、修改krpano端口 .\tour_testingserver -port8085 ,修改端口,指定启动时的端口 二、给krpano添加div展示信息 和场景一起转动,不是layer,layer是固定的,没啥用。 主要是onloaded里面的1个方法。 <action name…...
Jenkins 给任务分配 节点(Node)、设置工作空间目录
Jenkins 给任务分配 节点(Node)、设置工作空间目录 创建 Freestyle project 类型 任务 任务配置 Node 打开任务-> Configure-> General 勾选 Restrict where this project can be run Label Expression 填写一个 Node 的 Label,输入有效的 Label名字&#x…...
深入解析iOS视频录制(二):自定义UI的实现
深入解析 iOS 视频录制(一):录制管理核心MWRecordingController 类的设计与实现 深入解析iOS视频录制(二):自定义UI的实现 深入解析 iOS 视频录制(三):完…...
跳表的C语言实现
跳表(Skip List)是一种基于链表的动态数据结构,用于实现高效的查找、插入和删除操作。它通过引入多级索引来加速查找过程,类似于多级索引的有序链表。跳表的平均时间复杂度为 O(logn),在某些场景下可以替代平衡树。 以…...
Java Web开发实战与项目——Spring Security与权限管理实现
Web应用中,权限管理是系统安全的核心部分,确保用户只能访问他们被授权的资源。Spring Security是Spring框架中的一个安全框架,它提供了强大的认证和授权功能,用于实现用户认证和权限控制。本章节将详细讲解如何使用Spring Securit…...
单元测试方法的使用
import java.util.Date; import org.junit.Test; /** java中的JUnit单元测试* * 步骤:* 1.选中当前项目工程 --》 右键:build path --》 add libraries --》 JUnit 4 --》 下一步* 2.创建一个Java类进行单元测试。* 此时的Java类要求:①此类是公共的 ②此类提供一个公共的无参…...
VScode内接入deepseek包过程(本地部署版包会)
目录 1. 首先得有vscode软件 2. 在我们的电脑本地已经部署了ollama,我将以qwen作为实验例子 3. 在vscode上的扩展商店下载continue 4. 下载完成后,依次点击添加模型 5. 在这里可以添加,各种各样的模型,选择我们的ollama 6. 选…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
