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

React 的 12 个核心概念

文章目录

    • 一、JSX:逻辑与视图的桥梁
    • 二、组件:模块化构建的核心
    • 三、Props:单向数据流的基石
    • 四、State:动态交互的核心
    • 五、useEffect:副作用管理的利器
    • 六、Context:跨层级数据共享的利器
    • 七、React.memo:优化渲染的利器
    • 八、useReducer:复杂状态管理的利器
    • 九、Ref 和 forwardRef:DOM 操作与组件间通信
    • 十、虚拟 DOM:高效渲染的核心
    • 十一、React 和性能优化
    • 十二、组件复用:设计原则与最佳实践

一、JSX:逻辑与视图的桥梁

JSX 并非简单的语法糖,而是 React 高效渲染能力的起点。它通过编译阶段将类似 HTML 的语法转换为 React.createElement 调用,使逻辑与视图能够自然融合。其背后的机制直接影响虚拟 DOM 的创建与更新效率。例如:

const element = <h1>Hello, React!</h1>;

被编译为:

const element = React.createElement('h1', null, 'Hello, React!');

理解这种转译机制有助于优化组件性能,尤其在处理复杂 UI 时,避免因 JSX 使用不当导致的渲染问题。

二、组件:模块化构建的核心

React 的一切皆是组件。它们既是 UI 的基本单元,也是逻辑复用的重要载体。函数组件因其轻量、高效和 Hooks 的支持,逐渐成为主流:

const MyComponent = ({ title }) => {const [count, setCount] = useState(0);return (<div><h1>{title}</h1><button onClick={() => setCount(count + 1)}>Count: {count}</button></div>);
};

通过合理划分组件,结合 props 和状态管理,我们可以构建解耦、高复用的系统。在大型应用中,组件分层与职责分离的设计尤为重要。

三、Props:单向数据流的基石

React 的单向数据流确保了组件间通信的清晰与可靠。props 是父组件向子组件传递数据的主要方式,通过精确控制 props 的内容和类型,可以提高代码的健壮性和可维护性。例如:

const Item = ({ name, onClick }) => (<li onClick={onClick}>{name}</li>
);const List = ({ items, onItemClick }) => (<ul>{items.map((item) => (<Item key={item.id} name={item.name} onClick={() => onItemClick(item)} />))}</ul>
);

通过类型检查工具(如 PropTypes 或 TypeScript),可以进一步强化 props 的类型约束。

四、State:动态交互的核心

相比于 props 的静态数据,state 是组件内部的动态引擎。状态管理不仅影响组件的交互性,还直接决定渲染逻辑的复杂度。例如:

const Counter = () => {const [count, setCount] = useState(0);return (<div><p>Current Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);
};

合理管理状态的生命周期,避免频繁更新或滥用 state,对性能优化至关重要。

五、useEffect:副作用管理的利器

useEffect 为函数组件注入了处理副作用的能力,例如数据获取、订阅和清理等。它的设计灵感来源于类组件的生命周期,但更灵活、精准。例如:

useEffect(() => {const subscription = subscribeToSomeService();return () => {subscription.unsubscribe();};
}, [dependency]);

通过合理设置依赖数组,可以避免不必要的重渲染,提高组件的运行效率。

六、Context:跨层级数据共享的利器

在复杂的组件树中,props drilling(层层传递)容易导致代码冗余和难以维护。React.createContext 提供了更优雅的解决方案,让数据能够在组件树中高效流动。例如:

const ThemeContext = React.createContext('light');const ThemeProvider = ({ children }) => {const [theme, setTheme] = useState('light');return (<ThemeContext.Provider value={{ theme, setTheme }}>{children}</ThemeContext.Provider>);
};const ThemedButton = () => {const { theme, setTheme } = useContext(ThemeContext);return (<buttonstyle={{ background: theme === 'light' ? '#fff' : '#333', color: theme === 'light' ? '#000' : '#fff' }}onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>Toggle Theme</button>);
};

通过组合 Provider 和 useContext,我们可以在组件树的任意层级获取上下文数据,极大地提高了代码的可维护性和可扩展性。

七、React.memo:优化渲染的利器

对于性能敏感的应用,避免不必要的组件重新渲染尤为重要。React.memo 是一个高阶组件,用于缓存组件的渲染结果,从而提升性能。例如:

const ExpensiveComponent = React.memo(({ data }) => {console.log('Rendering...');return <div>{data}</div>;
});

结合 React.memo 和 useCallback,可以减少组件重渲染和避免闭包问题:

const ParentComponent = () => {const [count, setCount] = useState(0);const increment = useCallback(() => setCount((prev) => prev + 1), []);return (<div><button onClick={increment}>Increment</button><ExpensiveComponent data={count} /></div>);
};

记住,React.memo 仅适用于纯函数组件,且性能提升取决于实际使用场景。

八、useReducer:复杂状态管理的利器

当组件状态逻辑变得复杂,尤其涉及多种交互时,useReducer 提供了更清晰的管理方式。它类似于 Redux 的 reducer 概念:

const initialState = { count: 0 };function reducer(state, action) {switch (action.type) {case 'increment':return { count: state.count + 1 };case 'decrement':return { count: state.count - 1 };default:throw new Error();}
}const Counter = () => {const [state, dispatch] = useReducer(reducer, initialState);return (<div><button onClick={() => dispatch({ type: 'decrement' })}>-</button><span>{state.count}</span><button onClick={() => dispatch({ type: 'increment' })}>+</button></div>);
};

useReducer 的清晰结构适合处理多条件逻辑,并为状态变化提供了严格的流程控制。

九、Ref 和 forwardRef:DOM 操作与组件间通信

虽然 React 主张通过声明式代码操作 UI,但有时仍需要直接访问 DOM 元素或向父组件暴露子组件的方法。useRef 和 forwardRef 是实现这一目标的重要工具:

const Input = React.forwardRef((props, ref) => (<input {...props} ref={ref} />
));const Parent = () => {const inputRef = useRef();const focusInput = () => inputRef.current.focus();return (<div><Input ref={inputRef} /><button onClick={focusInput}>Focus Input</button></div>);
};

forwardRef 的应用场景包括高阶组件、第三方库封装和复杂 UI 组件的开发。

十、虚拟 DOM:高效渲染的核心

虚拟 DOM 是 React 的灵魂所在,它以轻量级的 JavaScript 对象描述真实 DOM,借助 diff 算法计算最小更新集,从而优化了渲染性能。例如,当状态变化时:

  1. React 创建新的虚拟 DOM。
  2. 比较新旧虚拟 DOM,找出需要更新的部分。
  3. 最后更新真实 DOM。

虚拟 DOM 的这一机制减少了直接操作 DOM 的频率,并提升了跨平台能力(如 React Native)。

十一、React 和性能优化

性能优化是构建高效 React 应用的核心。以下是常见的性能优化技巧:

  1. 避免不必要的重新渲染
    使用 React.memo 缓存组件。
    使用 useCallback 和 useMemo 缓存函数和计算结果。
const Child = React.memo(({ value }) => {console.log('Rendering...');return <div>{value}</div>;
});const Parent = () => {const [count, setCount] = useState(0);const increment = useCallback(() => setCount((prev) => prev + 1), []);return (<div><Child value={count} /><button onClick={increment}>Increment</button></div>);
};
  1. 延迟加载组件
使用 React.lazy 和 Suspense 实现按需加载,减少初始加载时间。const LazyComponent = React.lazy(() => import('./HeavyComponent'));const App = () => (<Suspense fallback={<div>Loading...</div>}><LazyComponent /></Suspense>
);
  1. 使用性能分析工具
    React 提供了性能分析工具(React Developer Tools Profiler),帮助开发者定位性能瓶颈并进行优化。

十二、组件复用:设计原则与最佳实践

React 的核心理念之一是组件复用。要实现高复用性,以下是几个设计原则和最佳实践:

  1. 拆分小型、纯粹的组件
    组件应该只关注一个功能,方便在不同场景下组合使用。例如:
const Button = ({ onClick, children }) => (<button onClick={onClick}>{children}</button>
);const IconButton = ({ icon, onClick }) => (<Button onClick={onClick}><img src={icon} alt="icon" /></Button>
);
  1. 提取公共逻辑
    通过自定义 Hook 提取逻辑,减少重复代码:
const useFetch = (url) => {const [data, setData] = useState(null);useEffect(() => {fetch(url).then((res) => res.json()).then(setData);}, [url]);return data;
};
  1. 使用 HOC 和 Render Props
    在某些场景下,HOC(高阶组件)和 Render Props 是实现组件复用的有效模式:
// HOC 示例
const withLogging = (Component) => (props) => {useEffect(() => console.log('Component mounted'), []);return <Component {...props} />;
};// Render Props 示例
const MouseTracker = ({ render }) => {const [position, setPosition] = useState({ x: 0, y: 0 });useEffect(() => {const handleMouseMove = (e) => setPosition({ x: e.clientX, y: e.clientY });window.addEventListener('mousemove', handleMouseMove);return () => window.removeEventListener('mousemove', handleMouseMove);}, []);return render(position);
};

这些 React 的核心概念相互交织、协同工作,共同构建起了强大而灵活的 React 应用开发体系。深入理解并熟练运用它们,将使我们在 React 开发的道路上更加游刃有余,能够打造出高效、可维护且用户体验卓越的前端应用。

相关文章:

React 的 12 个核心概念

文章目录 一、JSX&#xff1a;逻辑与视图的桥梁二、组件&#xff1a;模块化构建的核心三、Props&#xff1a;单向数据流的基石四、State&#xff1a;动态交互的核心五、useEffect&#xff1a;副作用管理的利器六、Context&#xff1a;跨层级数据共享的利器七、React.memo&#…...

玩转大语言模型——使用langchain和Ollama本地部署大语言模型

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…...

【数据结构】(2)时间、空间复杂度

一、衡量算法好坏的指标 时间复杂度衡量算法的运行速度&#xff0c;空间复杂度衡量算法所需的额外空间。这些指标&#xff0c;是某场景中选择使用哪种数据结构和算法的依据。如今&#xff0c;计算机的存储器已经变得容易获得&#xff0c;所以不再太关注空间复杂度。 二、渐进表…...

分享14分数据分析相关ChatGPT提示词

数据分析 在研究过程中数据分析扮演着至关重要的角色&#xff0c;它能够帮助研究者从海量数据中提取有价值的信息&#xff0c;从而为研究结论提供坚实的依据。而ChatGPT在数据分析领域展现出了强大的辅助能力&#xff0c;为研究者提供了全方位的支持。当研究者提供清晰且具体的…...

dify实现原理分析-rag-数据检索的实现

数据检索的总体执行步骤 数据检索总体步骤如下&#xff1a; #mermaid-svg-YCRNdSE7T1d0Etyj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YCRNdSE7T1d0Etyj .error-icon{fill:#552222;}#mermaid-svg-YCRNdSE7T1d…...

Day30-【AI思考】-错题分类进阶体系——12维错误定位模型

文章目录 错题分类进阶体系——12维错误定位模型**一、认知层错误&#xff08;根源性缺陷&#xff09;****二、操作层错误&#xff08;执行过程偏差&#xff09;****三、心理层错误&#xff08;元认知障碍&#xff09;****四、进阶错误&#xff08;专业级陷阱&#xff09;** 错…...

全国31省空间权重矩阵(地理相邻空间、公路铁路地理距离空间、经济空间)权重矩阵数据-社科数据

中国31个省份空间权重矩阵-社科数据https://download.csdn.net/download/paofuluolijiang/90028597 https://download.csdn.net/download/paofuluolijiang/90028597 空间权重矩阵是反映个体在空间中依赖关系的矩阵&#xff0c;本数据计算全国31个省三种标准化处理的空间权重矩…...

Docker容器数据恢复

Docker容器数据恢复 1 创建mongo数据库时未挂载数据到宿主机2 查找数据卷位置3 将容器在宿主机上的数据复制到指定目录下4 修改docker-compose并挂载数据&#xff08;注意端口&#xff09;5 重新运行新容器 以mongodb8.0.3为例。 1 创建mongo数据库时未挂载数据到宿主机 versi…...

Visual Studio使用GitHub Copilot提高.NET开发工作效率

GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手&#xff0c;可帮助你更快、更省力地编写代码&#xff0c;从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能&#xff1f; 每月 2000 代码补全&#xff0c;帮助开发者快速完成代码编写。 每月 …...

【matlab】绘图 离散数据--->连续函数

matlab绘图练习 离散数据及离散函数对离散区间进行细划分 达到连续效果画plot(y)图 与 复数的应用 离散数据及离散函数 例1 x1[1 2 4 6 7 8 10 11 12 14 16 17 18 20] y1[1 2 4 6 7 8 10 10 8 7 6 4 2 1] figure(1); plot(x1,y1,o,MarkerSize,15); x21:20; y2log(x2); figure…...

Python大数据可视化:基于python的电影天堂数据可视化_django+hive

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 电影数据 看板展示 我的信息 摘要 电影天堂数据可视化是…...

几种K8s运维管理平台对比说明

目录 深入体验**结论**对比分析表格**1. 功能对比****2. 用户界面****3. 多租户支持****4. DevOps支持** 细对比分析1. **Kuboard**2. **xkube**3. **KubeSphere**4. **Dashboard****对比总结** 深入体验 KuboardxkubeKubeSphereDashboard 结论 如果您需要一个功能全面且适合…...

YOLO11/ultralytics:环境搭建

前言 人工智能物体识别行业应该已经饱和了吧&#xff1f;或许现在并不是一个好的入行时候。 最近看到了各种各样相关的扩展应用&#xff0c;为了理解它&#xff0c;我不得不去尝试了解一下。 我选择了git里非常受欢迎的yolo系列&#xff0c;并尝试了最新版本YOLO11或者叫它ultr…...

Effective Objective-C 2.0 读书笔记—— 消息转发

Effective Objective-C 2.0 读书笔记—— 消息转发 文章目录 Effective Objective-C 2.0 读书笔记—— 消息转发前言消息转发机制概述动态方法解析处理dynamic的属性用于懒加载 消息转发快速消息转发完整消息转发 总结 前言 在前面我学习了关联对象和objc_msgSend的相关内容&a…...

【Python-办公自动化】实现自动化输出json数据类型的分析报告和正逆转换

分析报告 import json from pprint import pprint, PrettyPrinterdef analyze_energy_data(file_path):"""能源数据分析与结构查看函数参数:file_path (str): JSON文件路径功能:1. 加载并解析JSON数据2. 显示数据结构概览3. 交互式结构探索"""…...

Docker小游戏 | 使用Docker部署RPG网页小游戏

Docker小游戏 | 使用Docker部署RPG网页小游戏 前言一、项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署RPG网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置四、访问RPG网页小游戏五、总结前言 随着互联网技术的不断…...

技术周总结 01.13~01.19 周日(Spring Visual Studio git)

文章目录 一、01.14 周二1.1&#xff09;问题01&#xff1a;Spring的org.springframework.statemachine.StateMachine 是什么&#xff0c;怎么使用&#xff1f;:如何使用StateMachine&#xff1a; 1.2&#xff09;问题02&#xff1a;Spring StateMachine 提供了一系列高级特性 …...

Linux中使用unzip

安装命令 yum install unzip unzip常用选项和参数 选项 说明 -q 隐藏解压过程中的消息输出 -d /path/to/directory 指定解压文件的目标目录 -P password 如果.zip文件被密码保护&#xff0c;使用此选项可以指定打开文件所需的密码 解压命令 unzip 要解压的压缩包unz…...

Baklib引领内容管理平台新时代优化创作流程与团队协作

内容概要 在迅速变化的数字化时代&#xff0c;内容管理平台已成为各种行业中不可或缺的工具。通过系统化的管理&#xff0c;用户能够有效地组织、存储和共享信息&#xff0c;从而提升工作效率和创意表达。Baklib作为一款新兴的内容管理平台&#xff0c;以其独特的优势和创新功…...

利用Redis实现数据缓存

目录 1 为啥要缓存捏&#xff1f; 2 基本流程&#xff08;以查询商铺信息为例&#xff09; 3 实现数据库与缓存双写一致 3.1 内存淘汰 3.2 超时剔除&#xff08;半自动&#xff09; 3.3 主动更新&#xff08;手动&#xff09; 3.3.1 双写方案 3.3.2 读写穿透方案 3.3.…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...