当前位置: 首页 > news >正文

React基础知识

说明:react版本为 18.3.1

React是什么

React由Meta公司研发,是一个用于构建Web和原生交互界面的库。(开发基于浏览器的web应用和基于mac和android的移动应用)

React的优势

1.相较于传统基于DOM开发的优势:组件化的开发方式、不错的性能。
2.相较于其他前端框架的优势:丰富的生态、跨平台支持。

开发环境搭建: 使用create-react-app快速搭建开发环境

create-react-app是一个快速创建React开发环境的工具,底层由Webpack构建,封装了配置细节,开箱即用。
执行命令:`npx create-react-app react-basic`
1. npx: Node.js工具命令,查找并执行后续的包命令
2. create-react-app 核心包(固定写法),用于创建React项目
3. react-basic React项目的名称(可以自定义)

其他创建方式:https://zh-hans.react.dev/learn/start-a-new-react-project

JSX

什么是JSX

概念:JSX是JavaScript和XML(HTML)的缩写,表示在js代码中编写HTML模板结构,它是React中编写UI模板的方式。
优势:1.HTML的声明式模板写法2.JS的可编程能力

JSX的本质

JSX并不是标准的JS语法,他是JS的语法扩展,浏览器本身不能识别,需要通过`解析工具`做解析后才能在浏览器中运行。

JSX中使用JS表达式

在JSX中可以通过大括号语法`{}`识别JavaScript中的表达式,比如常见的变量、函数调用、方法调用等。
1. 使用引号传递字符串
2. 使用JavaScript变量
3. 函数调用和方法调用
4. 使用JavaScript对象
const name = 'macy'function getName () {return name;
}function App() {return (<div>hello react{/*使用引号传递字符串*/}{'======'}{/*识别js变量*/}{name}{/*函数调用*/}{getName()}{/*方法调用*/}{new Date().getFullYear()}{/*使用js对象*/}<div style={{color: 'red'}}>看看</div></div>);
}

JSX实现列表渲染

const list = [{id: 1, name: '张三', age: 32},{id: 2, name: '李四', age: 30},{id: 3, name: '王五', age: 28},
]function App() {return (<div>{/*列表渲染*/}<ul>{list.map(item => <li key={item.id}>{item.name}</li>)}</ul></div>);
}

JSX实现条件渲染

语法:在React中,可以通过`逻辑与运算符&&`、`三元表达式(?:)`实现基础的条件渲染。
1. `逻辑与运算符&&`:{flag && <span>xxx</span>}
2. `三元表达式(?:)`:{flag ? <span>xxx</span> : <div>yyy</div>}
const loading = true;function App() {return (<div>{/* 条件渲染*/}{loading && <span>加载中</span>}{loading ? <span>加载中</span> : <span>加载成功!</span>}</div>);
}

JSX实现复杂的条件渲染

多if语句
const type = 1; // 类型 0, 1 ,2function getTempByType(type){if(type === 0){return <div>天气:晴🌤</div>}else if(type === 1){return <div>天气:雨🌧</div>}else if(type === 2){return <div>天气:雪🌨</div>}
}function App() {return (<div>{/* 复杂的条件渲染*/}{getTempByType(type)}</div>);
}

React中的事件绑定

语法:on + 事件名称 = {事件处理程序},整体上遵循驼峰命名法,如onClick、onMouseOver。
function App() {const change = () =>{console.log('---点击按钮' )}return (<div><button onClick={change}>按钮</button></div>);
}
1.使用事件对象参数,语法:在事件回调函数中设置形参e
function App() {const change = (e) =>{console.log('---点击按钮',e )}return (<div><button onClick={change}>按钮</button></div>);
}
2.传递自定义参数,语法:事件绑定的位置改造成箭头函数的写法,在执行实际处理业务函数的时候传递实参(注意:不能直接写成函数调用,这里事件绑定需要一个函数引用)
function App() {const change = (name) => {console.log('---传递的参数:',name)}return (<div><button onClick={() => change('macy')}>按钮</button></div>);
}
3.同时传递事件对象和自定义参数,语法:在事件绑定的位置传递实参e和自定义参数,在处理函数中声明形参,注意顺序对应
function App() {const change = (name,e) => {console.log('---传递的参数:',name,e)}return (<div><button onClick={(e) => change('macy',e)}>按钮</button></div>);
}

React组件

组件是什么(组件化开发可以让开发者像搭积木一样构建一个完整的庞大的应用)
概念:一个组件就是用户界面的一部分,它可以有自己的逻辑和外观,组件之间可以互相嵌套,也可以复用多次
在react中,一个组件就是首字母大写的函数,内部存放了组件的逻辑和视图UI,渲染组件只需要把组件当成标签书写即可
//1.定义组件
// function MyComponent() {
//     return <div>这是自定义组件内容</div>
// }
// 或者箭头函数方式
const MyComponent = () => {return <div>这是自定义组件内容</div>
}
function App() {return (<div>{/* 2.使用组件/渲染组件*/}{/*自闭和*/}<MyComponent />{/*    成对标签*/}<MyComponent></MyComponent></div>);
}

useState

useState基础使用

useState是一个React Hook(函数),它允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果
本质:和普通JS变量不同的是,状态变量一旦发生变化,组件的视图UI也会跟着变化(数据驱动视图)
语法:const [状态变量, 设置状态的函数] = useState(初始值)
例如:cosnt [count, setCount] = useState(0);1.useState是一个函数,返回值是一个数组2.数组中第一个参数是状态变量,第二个参数是set函数用来修改状态变量3.useState的参数将作为初始值
// useState实现一个计数器按钮
import { useState } from "react";
function App() {// 1.调用useState添加一个状态变量// count: 状态变量// setCount: 更新状态变量的函数const [count, setCount] = useState(0);// 2.点击事件回调const handleClick = () => {// 作用:1.用传入的新值修改count 2.重新使用新的count值渲染UIsetCount(count + 1);}return (<div><button onClick={handleClick}>{count}</button></div>);
}

修改状态的规则

状态不可变:在react中,状态被认为是只读的,我们应该始终替换它而不是修改它,直接修改状态不能引发视图更新
const handleClick = () => {// 1.不能触发视图更新// count ++// 2.可以触发视图更新setCount(count + 1);
}
修改对象状态
规则:对于对象类型的状态变量,应该始终传给set方法一个全新的对象来进行修改
import { useState } from "react";
function App() {// 1.调用useState添加一个状态变量const [user, setUser] = useState({name: 'macy', gender: '男'});// 2.点击事件回调const handleClick = (gender) => {// 1.错误写法// user.gender = gender// 2.正确写法setUser({...user,gender,})}return (<div><div>{user.name} --- {user.gender}</div><button onClick={() => handleClick('女')}>点击</button></div>);
}

组件的样式处理

组件基础样式方式

react组件基础的样式控制有两种方式:1.行内样式(不推荐)  2. css类名控制
/*index.css文件内容:*/
.my-style{color: green;font-size: 50px;
}
.new-style{color: pink;
}
.foo{font-weight: bold;
}
//导入样式
import './index.css'const style = {color: 'blue',fontSize: '28px'
}
const flag = true
function App() {return (<div>{/* 行内样式控制 */}<div style={{color: 'red',fontSize: '18px'}}>hello react</div><div style={style}>hello react!!!</div>{/* 通过class类名控制*/}<div className="my-style">hello world</div>{/* 通过条件控制类名*/}<div className={`my-style ${flag && 'new-style'}`}>hello world</div></div>);
}

引入classnames库

地址:https://github.com/JedWatson/classnames
代码片段:

    {/*引入classnames库*/}<div className={classNames('my-style', {'new-style':flag, 'foo': flag})}>hello world</div>

受控表单绑定

概念:使用React组件的状态(useState)控制表单的状态React(state) <====> <input/> (value)    1.state绑定到input的value属性2.把input最新的value值设置给state
  1. 准备一个react状态值
    const [value, setValue] = useState('')
  2. 通过value属性绑定状态,通过onChange属性绑定状态同步的函数
<input type="text" value={value} onChange={(e) => setValue(e.target.value)}/>

demo:

import {useState} from "react";function App() {// 通过value属性绑定react状态const [value, setValue] = useState('');return (<div><p> 状态值:{value}</p>{/*绑定onChange事件,通过参数e拿到输入框最新的值,反向修改到react状态*/}<input type="text" value={value} onChange={(e) => setValue(e.target.value)}/></div>);
}

React中获取DOM

在React组件中获取/操作DOM,需要使用useRef钩子函数,分为两步:

  1. 使用useRef创建ref对象,并于jsx绑定
    const inputRef = useRef(null)
  2. 在DOM可用时,通过inputRef.current拿到DOM对象
    console.log(inputRef.current)
import {useRef} from "react";function App() {// useRef生成ref对象,并绑定到dom标签上const inputRef = useRef(null)// dom可用时,ref.current获取dom// 渲染完毕之后dom生成之后才可用const handleClick = () => {console.dir(inputRef.current)}return (<div><input type="text" ref={inputRef}/><button onClick={handleClick}>点击</button></div>);
}

相关文章:

React基础知识

说明&#xff1a;react版本为 18.3.1 React是什么 React由Meta公司研发&#xff0c;是一个用于构建Web和原生交互界面的库。&#xff08;开发基于浏览器的web应用和基于mac和android的移动应用&#xff09;React的优势 1.相较于传统基于DOM开发的优势&#xff1a;组件化的开…...

Java基础:面向对象编程3

1 Java可变长参数 1.1 概述 Java 的可变长参数&#xff08;Varargs&#xff09;是在 Java 1.5 中引入的功能&#xff0c;允许方法接受任意数量的相同类型的参数。可变参数的语法是在参数类型后面加上三个点&#xff08;...&#xff09;&#xff0c;例如 int... numbers。 1.…...

实验kubernetes的CPU绑定策略

CPU 管理配置 CPU 管理策略通过 kubelet 参数 --cpu-manager-policy 或 KubeletConfiguration 中的 cpuManagerPolicy 字段来指定。 支持两种策略&#xff1a; none&#xff1a;默认策略。static&#xff1a;允许为节点上具有某些资源特征的 Pod 赋予增强的 CPU 亲和性和独占…...

Zsh 安装与配置

目录 1 环境配置 1.1 基本工具安装 1.2 安装 oh-my-zsh 1.3 从.bashrc中迁移配置&#xff08;可选&#xff09; 2 主题配置 2.1 内置主题 2.2 自定义主题 2.2.1 推荐主题 3 插件安装 3.1 推荐插件 3.1.1 zsh -autosuggestions 3.1.2 zsh-syntax-highlighting 3.2 启…...

Redis可视化工具Redis Desktop Manager(附安装包)

前言 redis工具&#xff0c;我相信每个开发都需要&#xff0c;如果每次查都去client执行指令&#xff0c;我怕查完之后&#xff0c;老大就要发版咯。我之前一直用的Redis可视化工具RedisDesktopManager&#xff0c;总觉得差点意思&#xff0c;直到同事推荐了个新的&#xff0c…...

sql server删除过期备份文件脚本

一、通过脚本查看过期文件&#xff0c;时间可以自己设定 for /f "delims" %i in (dir /b /a-d "E:\mybak_file\*.bak" ^| findstr /i "backup" ^| findstr /v /i "no_backup") do if "%~ti" LSS "2024/09/29 16:50&qu…...

【Docker系列】Docker查看镜像架构

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Python案例 | 测试网络的下载速度上传速度和 ping 延迟

使用了 speedtest 库来测试网络的下载速度上传速度和 ping 延迟 注意&#xff0c;这里需要先卸载speedtest&#xff0c;再安装speedtest-cli pip uninstall speedtest pip install speedtest-cli其次运行代码&#xff1a; # 使用了 speedtest 库来测试网络的下载速度上传速度…...

一键找回,2024四大固态硬盘数据恢复工具推荐!

虽然固态硬盘&#xff08;SSD&#xff09;因其读写速度快、功耗低等特点受到广泛欢迎&#xff0c;但它并非无懈可击&#xff0c;数据丢失的问题依然存在。如果你也遇到了固态硬盘数据丢失的问题&#xff0c;那么一下的这几款软件可以一试&#xff01; 福昕数据恢复 直达链接&…...

数据结构~AVL树

文章目录 一、AVL树的概念二、AVL树的定义三、AVL树的插入四、AVL树的平衡五、AVL树的验证六、AVL树的删除七、完整代码八、总结 一、AVL树的概念 AVL树是最先发明的自平衡二叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性质的二叉搜索树&#xff1a;它的左右子…...

ffmpeg面向对象——rtsp拉流探索(1)

目录 0.avformat_open_input的rtsp流程程纯净版1.rtsp拉流流程图2.rtsp拉流对象图 标准rtsp协议的基石是tcp&#xff0c;本节探索下ffmpeg的rtsp拉流协议tcp的创建及rtsp协商过程。 0.avformat_open_input的rtsp流程程纯净版 ffmpeg拉流&#xff0c;从avformat_open_input接口…...

【启明智显分享】ZX7981PM WIFI6 5G-CPE:2.5G WAN口,2.4G/5G双频段自动调速

昨天&#xff0c;我们向大家展现了ZX7981PG WIFI6 5G-CPE&#xff0c;它强大的性能也引起了一波关注&#xff0c;与此同时&#xff0c;我们了解到部分用户对更高容量与更高速网口的需求。没关系&#xff01;启明智显早就预料到了&#xff01;ZX7981PM满足你的需求&#xff01; …...

openresty“热部署“lua

一、前言 频繁reload 或者restart影响测试使用nginx&#xff0c;修改lua脚本后要实际查看效果值&#xff0c;使用关闭lua代码缓存&#xff0c;可以实现实时查看代码效果。 每次请求都会从磁盘中加载lua脚本&#xff0c;生产上面不要开启&#xff0c;影响响应速度 二、修改ngin…...

基于SpringBoot+Vue+MySQL的企业招聘管理系统

系统展示 用户前台界面 管理员后台界面 企业后台界面 系统背景 在当今数字化转型的大潮中&#xff0c;企业对于高效、智能化的人力资源管理系统的需求日益增长。招聘作为人力资源管理的首要环节&#xff0c;其效率与效果直接影响到企业的人才储备与竞争力。传统的招聘方式不仅耗…...

vue3之defineComponent

defineComponent 是 Vue 3 中提供的一个辅助函数&#xff0c;用于定义组件。它可以帮助你更好地利用 TypeScript 的类型推断和 IDE 的自动补全功能。defineComponent 主要用于组合式 API&#xff08;Composition API&#xff09;和单文件组件&#xff08;SFC&#xff09;。 使…...

springboot+vue家政服务管理平台

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…...

python pip安装requirements.txt依赖与国内镜像

python pip安装requirements.txt依赖与国内镜像 如果网络通畅&#xff0c;直接pip安装依赖&#xff1a; pip install -r requirements.txt 如果需要国内的镜像&#xff0c;可以考虑使用阿里的&#xff0c;在后面加上&#xff1a; -i http://mirrors.aliyun.com/pypi/simple --…...

解决Qt的QWidget设计师编辑UI后和软件运行显示不一致

解决方法&#xff0c;只需要在main.cpp中加入下面一段代码 if (QT_VERSION > QT_VERSION_CHECK(5, 6, 0))QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling,true); 完整的代码如下 int main(int argc, char *argv[]) { if (QT_VERSION > QT_VERSION_C…...

交易所开发:构建安全、高效、可靠的数字资产交易平台

数字资产交易平台是加密市场中连接用户与数字货币的重要枢纽。开发一个安全、高效、可靠的交易所&#xff0c;不仅需要综合考虑技术架构、安全策略、用户体验等方面&#xff0c;还需严格遵循法规要求以确保合规性。本文总结了交易所开发的关键要素&#xff0c;包括其类型、核心…...

【Next.js 入门教程系列】09-优化技巧

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c; 给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 入门教程系列】08-发送邮件 优化技巧 本篇包括以下内容: Optimizing imagesUsing third-party JS…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...