【react】基础知识点学习
1. 创建项目
npm install -g create-react-app
npx create-react-app my-app
cd my-app
npm start
index.js为入口文件,App.js为根组件。
如何将react应用挂载在页面上? 将App组件渲染到id为root的DOM元素中
2. JSX
JSX是|avaScript和XML(HTML)的缩写,表示在|S代码中编写HTML模版结构,它是React中编写UI模版的方式。
JSX并不是标准的S语法,它是JS的语法扩展,浏览器本身不能识别,需要通过解析工具(babel) 做解析之后才能在浏览器中运行。
左边是我们编写的代码,右边是在浏览器中运行的代码。
👻https://babeljs.io/ 这个网址中可以查看babel预览后的结果: 点击try it out --> 左侧勾选react
✨ babel的作用有哪些?【扩展】
Babel 是一个 JavaScript 编译器,主要用于将 ECMAScript 2015+(ES6+)的代码转换为向后兼容的 JavaScript,使其能够在较老的浏览器或 JavaScript 运行环境中运行。Babel 具备以下主要作用:
- 语法转换:将现代 JavaScript 语法(如箭头函数、模板字符串、解构赋值等)转换为 ES5 或更低版本的代码,确保兼容性。
- Polyfill 提供:Babel 可以引入新的 JavaScript API(例如 Promise、Set 等)的 polyfill,从而在不支持这些 API 的环境中正常运行。(Polyfill 是一种代码或插件,用于在旧版本浏览器或不支持某些新功能的环境中“填补”缺失的功能。)
- 插件扩展:Babel 拥有丰富的插件系统,支持根据需要定制转换规则,如支持 TypeScript、React JSX 语法转换等。
- 代码优化:一些 Babel 插件可以帮助优化代码结构和性能,例如 Tree Shaking 以删除无用代码。
- 跨平台兼容:通过预设和插件的配置,Babel 可以根据不同的目标环境(如不同版本的浏览器或 Node.js)生成适用的代码。
- 工具集成:Babel 支持与许多前端构建工具集成,如 Webpack、Rollup,使得编译、打包和构建过程更加流畅。
JSX 规则
- 只能返回一个根元素 (可以用
<div></div>
或<></>
包裹)
👻<></>内不能添加 key,可以使用内置组件 Fragment - 标签必须闭合
- 大部分属性命名使用驼峰式命名法
JSX的使用
1. 基础用法
function App() {const title = "你好";const getName = () => {return "张三";};return (<div className="App">{/*使用引号传递字符串 */}{"hello react"}{/* js变量 */}{title}{/* 函数调用 */}{getName()}{/* 方法调用 */}{new Date().toDateString()}{/* 使用js对象 */}<div style={{ color: "red" }}>123</div></div>);
}
2. 列表渲染
使用map进行遍历
function App() {const fruits = [{ id: 1, name: "Apple" },{ id: 2, name: "Banana" },{ id: 3, name: "Orange" },];return (<ul>{fruits.map((fruit) => (<li key={fruit.id}>{fruit.name}</li>))}</ul>);
}
✨key 需要满足的条件 【扩展】
- key 值在兄弟节点之间必须是唯一的 (同级节点中) ,但不用要求全局唯一,在不同的数组中可以使用相同的 key。
- key 值不能改变,否则就失去了使用 key 的意义!所以千万不要在渲染时动态地生成 key。
注意:组件不会把 key 当作 props 的一部分。Key 的存在只对 React 本身起到提示,实际元素上并不会被渲染。
注意:不要使用 index 作为 key,除非列表是静态的或者元素不会发生变化。因为 index 是可变的,删除、添加元素时可能导致 React 错误匹配和重渲染问题。
3. 条件渲染
逻辑与 &&: 前面值为true时,后面内容才会被渲染
三元运算: 用于两种情况的不同显示
function App() {const isLogin = true;return (<div>{/* 逻辑与 && */}{isLogin && <h1>hello</h1>}{/* 三元运算 */}{isLogin ? <h1>欢迎回来</h1> : <h1>请先登录</h1>}</div>);
}
注意: && 表达式 的左侧为 true 时,它则返回其右侧的值。但条件的结果是 false,则整个表达式会变成 false。在 JSX 里,React 会将 false 视为一个“空值”,不会进行任何渲染。但是在 vue中false会显示在页面上!
复杂条件渲染: 根据不同条件进行渲染
function App() {const getResult = (type) => {if (type === 0) {return <h1>hello</h1>;} else if (type === 1) {return <strong>hello</strong>;} else {return <i>hello</i>;}};return <div>{getResult(1)}</div>;
}
3. 绑定事件处理函数
绑定事件:使用onClick
, 传入函数引用
function App() {const handleClick = () => {console.log("clicked");};return (<div><button onClick={handleClick}>click me</button></div>);
}
自定义传参:
function App() {const handleClick = (msg) => {console.log(msg);}return (<div><button onClick={() =>handleClick('hi')}>click me</button></div>);
}
✨注意:不能直接写函数调用,这里事件绑定需要一个函数引用。 如果写的是函数调用,会在页面渲染时就会被立即触发!!
同时传递事件对象和自定义参数: 事件对象放在最后
function App() {const handleClick = (msg,e) => {console.log(msg,e);};return (<div><button onClick={(e) => handleClick("hi",e)}>click me</button></div>);
}
4. 自定义组件
// 定义组件
function MyButton() {const handleClick = (msg, e) => {console.log(msg, e);};return (<div><button onClick={(e) => handleClick("hi", e)}>click me</button></div>);
}
function App() {return (<div>{/* 使用组件 */}<MyButton /></div>);
}export default App;
5. useState
useState
是一个 React Hook(函数),它允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果。
也就是当数据发生变化时,页面也会跟着变化。(数据驱动视图)
const [state, setState] = useState(initialState)
1.useState是一个函数,返回值是一个数组
2.数组中的第一个参数是状态变量,第二个参数是set函数用来修改状态变量(直接传递新状态,也可以传递一个根据先前状态来计算新状态的函数)
3.usestate中传入初始值
import { useState } from "react";function App() {const [count, setCount] = useState(0);const handleClick = () => {// 传入更新的值setCount(count + 1);};return (<div><button onClick={handleClick}>count:{count}</button></div>);
}export default App;
如果直接更改值,ui界面不会重新更新,所以更改值要通过setXXX()来进行更新。
import { useState } from "react";function App() {let [count, setCount] = useState(0);const handleClick = () => {count++;console.log(count);// 控制台中值会更新};return (<div><button onClick={handleClick}>count:{count}</button></div>);
}export default App;
修改对象状态:
import { useState } from "react";function App() {const [data, setData] = useState({ name: "jack", age: 18 });const handleChange = () => {setData({...data,name: "jill",});// 或者传递一个根据先前状态来计算新状态的函数// setData((data) => {// return {// ...data,// name: "jill",// };// });};return (<div><div>{data.name},{data.age}</div><button onClick={handleChange}>change name</button></div>);
}export default App;
注意:如果 state 变量是一个对象时,不能只更新其中的一个字段,这样会直接替换原来的对象,导致其他属性丢失,如下错误写法:
const handleChange = () => {setData({name: "jill",});};
👻react-useState介绍
注意: 调用 set 函数 不会 改变已经执行的代码中当前的 state,它只影响 下一次 渲染中 useState 返回的内容。
const handleChange = () => {setData({...data,name: "jill",});console.log(data.name);// 输出的还是jack};
6. 样式设置
import './index.css';
function App() {return (<div>{/* 行内样式 */}<div style={{color: "red",fontWeight:'600'}}>hello</div>{/* 写在类名中 */}<div className="title">hello</div></div>);
}export default App;
/* index.css */
.title {font-size : 30px;font-weight: bold;
}
行内样式也写到一个对象中:
function App() {const titleStyle = {color: "red",fontWeight: "600",};return (<div>{/* 行内样式 */}<div style={titleStyle}>hello</div> </div>);
}export default App;
条件渲染样式:
import { useState } from "react";
import "./index.css";function App() {const [flag, setFlag] = useState(true);return (<div>{/* 写在类名中 */}<div className={`origin-class ${flag && "title"}`} onClick={() => setFlag(!flag)}>hello</div></div>);
}export default App;
使用classnames 优化类名设置:
npm i classnames
👻https://github.com/JedWatson/classnames
import classNames from "classnames";
import { useState } from "react";
import "./index.css";
function App() {const titleStyle = {color: "red",fontWeight: "600",};const [flag, setFlag] = useState(true);return (<div>{/* 行内样式 */}<div style={titleStyle}>hello</div>{/* 写在类名中 */}<div className={classNames('origin-class',{'title': flag})} onClick={() => setFlag(!flag)}>hello</div></div>);
}export default App;
7. 表单受控绑定
通过value绑定react状态,再在onChange事件中反向修改react状态。
import { useState } from "react";function App() {const [value, setValue] = useState("");return (<div><input type="text" value={value} onChange={(e) => setValue(e.target.value)}></input></div>);
}export default App;
✨ react调式工具的使用:
👻React 开发者工具
安装 React Developer Tools
在 Chrome、Firefox 等浏览器的扩展商店中搜索 “React Developer Tools” 并安装。
安装后,浏览器开发者工具(通常按 F12 或 Ctrl + Shift + I 打开)中会出现新的 “⚛️ React” 选项卡。
所以应该在生产环境下使用React 开发者工具 :
npm run build
npm install -g serve
serve -s build
显示为这种图标为可用:
8. React中获取DOM
使用useRef钩子函数引用DOM元素,获取时使用useRef 返回对象的current属性。
import { useRef, useState } from "react";function App() {const [value, setValue] = useState("");const inputRef = useRef(null);return (<div><inputtype="text"value={value}onChange={(e) => setValue(e.target.value)}ref={inputRef}></input><button onClick={() => inputRef.current.focus()}>focus</button></div>);
}export default App;
9. props父子组件传值
1.props可传递任意的数据类型:数字、字符串、布尔值、数组、对象、函数、JSX。
2.props是只读对象:子组件只能读取props中的数据,不能直接进行修改,父组件的数据只能由父组件修改。
传递单个值:
function Son(props) {return (<div><div>this is son</div><div>name:{props.name} age:{props.age}</div></div>);
}
function App() {return (<div><Son name="jack" age="18"></Son></div>);
}export default App;
传递对象:
// props中的值可以解构出来
function Son({info}) {return (<div><div>this is son</div><div>name:{info.name} age:{info.age}</div></div>);
}
function App() {const info = {name: "jack",age: "18",}return (<div><Son info={info}></Son></div>);
}export default App;
使用 children
进行插槽传值:
function Son({info,children}) {return (<div>{children}<div>this is son</div><div>name:{info.name} age:{info.age}</div></div>);
}
function App() {const info = {name: "jack",age: "18",}return (<div><Son info={info}><h2>hello</h2></Son></div>);
}export default App;
**子传父实现:**在子组件中调用父组件props传递过来的方法,将数据以参数方式传递过去。
import { useState } from "react";function Son({onGetMsg}) {return (<div><div>this is son</div><button onClick={() =>onGetMsg('world')}>sendMsg</button></div>);
}
function App() {const [msg,setMsg] = useState('hello')const getMsg = (msg) =>{setMsg(msg)}return (<div>msg:{msg}<Son onGetMsg={getMsg}></Son></div>);
}export default App;
注意:绑定事件处理函数时一定是函数的引用!!
同级组件通信: 使用状态提升,一个子组件中使用子传父方法,一个子组件中使用父传子方法将数据传递给另一个子组件。
import { useState } from "react";function A({ onGetName }) {return (<div><div>Component A</div><button onClick={() => onGetName("react")}>send to B</button></div>);
}
function B({ name }) {return (<div><div>Component B</div><h2>{name}</h2></div>);
}
// A与B之间的通信
function App() {const [name, setName] = useState("");const getName = (name) => {setName(name);};return (<div>{/*子传父*/}<A onGetName={getName}></A>{/* 父传子 */}<B name={name}></B></div>);
}export default App;
跨层级组件通信:
1.使用createContext
方法创建一个上下文对象Ctx
2.在顶层组件(App)中通过 Ctx.Provider
组件提供数据,以<Ctx.Provider value={...}>
形式。
3.在最底层组件(B)中通过 usecontext
钩子函数获取使用数据
import { createContext, useContext } from "react";// App->A->B
// 创建一个上下文对象
const MsgContent = createContext()
function A() {return (<div><B /></div>);
}
function B() {// 使用数据const msg =useContext(MsgContent)return (<div><h1>{msg}</h1></div>);
}
function App() {const msg="hello"return (<div>{/* 提供数据 */}<MsgContent.Provider value={msg}><A /></MsgContent.Provider></div>);
}export default App;
10. useEffect
useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作,比如发送AJAX请求,更改DOM,监听某一属性发生变化而进行其他操作等等。
● 与事件不同,Effect 是由渲染本身,而非特定交互引起的。
● 默认情况下,Effect 在每次渲染(包括初始渲染)后运行。
● 如果 React 的所有依赖项都与上次渲染时的值相同,则将跳过本次 Effect。
注意: 在 严格模式 下,React 在开发模式中,每个组件都会重复挂载一次。(所以这边控制台会输出2次)
import { useEffect } from "react";function App() {useEffect(() =>{console.log('渲染加载完毕!');},[])return (<div>hello</div>);
}
export default App;
清除副作用:useEffect 返回的这个回调函数,每次被卸载时会调用
import { useEffect, useState } from "react";
function A() {useEffect(() => {const timer = setInterval(() => {console.log("111");}, 2000);return () => {clearInterval(timer)}}, []);return <div>A</div>;
}
function App() {const [show, setShow] = useState(true);return (<div>{show && <A />}<button onClick={() => setShow(false)}>卸载A</button></div>);
}export default App;
11. 自定义Hook函数
自定义Hook是以 use 打头的函数,通过自定义Hook函数可以用来实现逻辑的封装和复用
import { useState } from "react";function useToggle() {const [value, setShow] = useState(true);const toggle = () => setShow(!value);return {value,toggle};
}
function App() {const {value, toggle} = useToggle();return (<div>{value && <div>hello</div>}<button onClick={toggle}>toggle</button></div>);
}export default App;
- 声明一个以use打头的函数
- 在函数体内封装可复用的逻辑(只要是可复用的逻辑)
- 把组件中用到的状态或者回调return出去(以对象或者数组)
- 在哪个组件中要用到这个逻辑,就执行这个函数,解构出来状态和回调进行使用
✨ ReactHooks使用规则:
- 只能在组件中或者其他自定义Hook函数中调用,不可以在外层调用
- 只能在组件的顶层调用,不能嵌套在if、for、其他函数中
相关文章:

【react】基础知识点学习
1. 创建项目 npm install -g create-react-app npx create-react-app my-app cd my-app npm startindex.js为入口文件,App.js为根组件。 如何将react应用挂载在页面上? 将App组件渲染到id为root的DOM元素中 2. JSX JSX是|avaScript和XML(HTML)的缩写…...

D4--哈夫曼树和不等式
看文先三连,养成好习惯~看文先三连,养成好习惯~看文先三连,养成好习惯~ 目录 知识点: 堆排序: 优先队列: 定义:(默认大顶堆) 入队: 出队: 取队顶&…...

详解RabbitMQ三种队列类型
RabbitMQ 是一个强大的消息队列系统,它提供了多种队列类型以满足不同的使用需求。本文将探讨三种主要队列类型:经典队列、仲裁队列和流式队列,并讨论它们的区别和选型建议。 经典队列(Classic Queues) 简介ÿ…...

openGauss数据库-头歌实验1-3 创建和管理模式
一、创建和使用模式 (一)任务描述 本关任务:基于 openGauss 学习创建模式的相关知识。 (二)相关知识 为了完成本关任务,你需要掌握:1.openGauss 的常用操作,2.SQL 创建模式相关语…...

森林火灾检测数据集(猫脸码客 第233期)
森林火灾检测数据集 森林火灾是一种具有巨大破坏性的自然灾害,每年在全球范围内造成巨大损失。为了有效应对森林火灾,及早发现和快速响应是至关重要的。传统上,森林火灾的检测主要依赖于人工巡逻和卫星遥感技术。然而,这些方法存…...

LeetCode100之找到字符串中所有字母异位词(438)--Java
1.问题描述 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例1 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 …...

【Python】Python自习课:第一个python程序
【Python】Python自习课:第一个python程序...

DICOM标准:解析DICOM属性中的病人模块
目录 病人模块概述 1. 病人关系模块(Patient Relationship Module) 2. 病人识别模块(Patient Identification Module) 3. 病人统计模块(Patient Demographic Module) 4. 病人医学模块(Pati…...

C++设计模式创建型模式———生成器模式
文章目录 一、引言二、生成器/建造者模式三、总结 一、引言 上一篇文章我们介绍了工厂模式,工厂模式的主要特点是生成对象。当对象较简单时,可以使用简单工厂模式或工厂模式;而当对象相对复杂时,则可以选择使用抽象工厂模式。 工…...

基于微信小程序的校园失物招领系统的研究与实现(V4.0)
博主介绍:✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...

DDRNet模型创新实现人像分割
项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【BiLSTM模型实现电力数据预测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实…...

try…catch…finally语句里return语句的执行顺序是怎样的?
第一种情况 try语句块里面有return语句,catch语句块和finally语句块里面没有return语句。 代码如下: public class Main {public static void main(String[] args) {System.out.println(test1());}public static int test1() {int i 10;try {System.o…...

AIGC与虚拟现实(VR)的结合与应用前景
公主请阅 引言1. AIGC与VR的基本概念1.1 AIGC简介1.2 VR技术概述 2. AIGC在VR中的应用2.1 生成虚拟环境2.2 自动生成内容2.3 互动体验 3. AIGC与VR结合的应用案例3.1 教育培训3.2 娱乐与游戏3.3 心理治疗3.4 虚拟旅游 4. AIGC与VR结合的挑战4.1 技术限制4.2 用户体验4.3 数据隐…...

如何在visual studio中 生成 并 使用dll和lib文件
因为工作需求,要写lib和dll给别人使用。 使用visual studio2022 以函数 int getmyset() { return 0;} 为例子 首先 点击打开 visual studio 文件->新建->项目 选择windows桌面向导 选择应用程序类型为动态链接库.dll 分别创建MyDLL.h和MyDLL.cpp文件&a…...

「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider 和 Progress 组件
Slider 和 Progress 是鸿蒙系统中的常用 UI 组件。Slider 控制数值输入,如音量调节;Progress 显示任务的完成状态,如下载进度。本文通过代码示例展示如何使用这些组件,并涵盖 进度条类型介绍、节流优化、状态同步 和 定时器动态更新。 关键词 Slider 组件Progress 组件节流…...

Iceoryx2:高性能进程间通信框架(中间件)
文章目录 0. 引言1. 主要改进2. Iceoryx2 的架构3. C示例代码3.1 发布者示例(publisher.cpp)3.2 订阅者示例(subscriber.cpp) 4. 机制比较5. 架构比较6. Iceoryx vs Iceoryx2参考资料 0. 引言 Iceoryx2 是一个基于 Rust 实现的开…...

构 造 器
我们创建了一个对象,在其中定义了属性,new一个对象,然后设置对应的属性,但是我们可以在new对象的时候,同时传入我们要设置的属性,这个时候就需要构造器。 特点 构造方法是一个特殊的成员方法,…...

草莓叶片病害识别与分类数据集(猫脸码客 第234期)
草莓叶片病害识别与分类数据集 草莓作为一种重要的经济作物,在全球范围内广泛种植。然而,草莓生产过程中常常受到各种病害的困扰,其中叶片病害尤为严重。为了有效识别、检测和分类草莓叶片病害,构建一个高质量的数据集是至关重要…...

微服务设计模式 - 断路器模式 (Circuit Breaker Pattern)
微服务设计模式 - 断路器模式 (Circuit Breaker Pattern) 定义 断路器模式(Circuit Breaker Pattern)是云计算和微服务架构中的一种保护性设计模式,其目的是避免系统中的调用链出现故障时,导致系统瘫痪。通过断路器模式ÿ…...

HarmonyOS NEXT 应用开发实战(九、知乎日报项目详情页实现详细介绍)
在本篇博文中,我们将探讨如何使用 HarmonyOS Next 框架开发一个知乎日报的详情页,逐步介绍所用到的组件及代码实现。知乎日报是个小巧完整的小项目,这是一个循序渐进的过程,适合初学者和有一定开发经验的工程师参考。 1. 项目背景…...

lvgl 模拟器移植(V9)
1.模拟器代码下载 1.1:通过git 下载 github链接:GitHub - lvgl/lv_port_pc_visual_studio: Visual Studio projects for LVGL embedded graphics library. Recommended on Windows. Linux support with Wayland is work in progress.https://github.com…...

基于vue+neo4j 的中药方剂知识图谱可视化系统
前言 历时一周时间,中药大数据R02系统中药开发完毕,该系统通过scrapy工程获取中药数据,使用python pandas预处理数据生成知识图谱和其他相关数据,利用vuespringbootneo4jmysql 开发系统,具体功能请看本文介绍。 简要…...

(自用)机器学习python代码相关笔记
一些自存的机器学习函数和详细方法记录,欢迎指错。 前言:读取数据方法 import pandas as pd import pandas as pddf pd.read_csv(数据集.csv, header0) # header是从哪一行开始读起,一般是0,也可以取infer 一、数据处理&#…...

docker复现pytorch_cyclegan
1、安装docker 配置docker镜像 添加镜像源至docker engine 2、wsl2安装nvidia-docker 要在Ubuntu中安装NVIDIA Docker,需要满足以下条件: 确保主机已安装NVIDIA的CUDA驱动程序,并使用适用于您操作系统的正确版本。 wsl --update在Ubuntu…...

IDEA2024下安装kubernetes插件并配置进行使用
【1】安装插件 其实2024.2.3下默认已经安装了kubernetes插件,如果你发现自己IDEA中没有,在市场里面检索并下载即可。 【2】kubernetes配置 ① 前置工作 首先你要准备一个config文件和一个kubectl.exe 。 config文件类似如下: apiVersi…...

理解原子变量之二:从volatile到内存序-进一步的认识
目录 实例1 实例2 实例3 内存序中两个最重要的概念 补记 结论 实例1 看下面的例子:在vs2013中建立如下工程: #include <thread> #include <iostream> #include <chrono>bool done false;void worker(){std::this_thread::sle…...

DICOM标准:MR图像模块属性详解——磁共振成像(MR)在DICOM中的应用
目录 引言 磁共振成像(MR) 一、MR图像模块 二、MR图像属性描述 1、图像类型 (Image Type) 2、抽样每个象素 (Sampling per Pixel) 3、光度插值 (Photometric Interpretation) 4、位分配 (Bits Allocated) 结论 引言 数字成像和通信在医学(…...

Linux内核与用户空间
Linux内核与用户空间是Linux操作系统中的两个重要概念,它们各自承担着不同的功能和职责,并通过特定的机制进行交互。以下是对Linux内核与用户空间的详细解释: 一、Linux内核 定义:Linux内核是Linux操作系统的核心组件,…...

计算机网络-以太网小结
前导码与帧开始分界符有什么区别? 前导码--解决帧同步/时钟同步问题 帧开始分界符-解决帧对界问题 集线器 集线器通过双绞线连接终端, 学校机房的里面就有集线器 这种方式仍然属于共享式以太网, 传播方式依然是广播 网桥: 工作特点: 1.如果转发表中存在数据接收方的端口信息…...

找树根和孩子c++
题目描述 给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子 输入 第一行:n(0<结点数<100),m(0<边数<200)。 以下m行;每行两个结点x和y…...