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 开发的道路上更加游刃有余,能够打造出高效、可维护且用户体验卓越的前端应用。

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

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

相关文章

【解决方案】MuMu模拟器移植系统进度条卡住98%无法打开

之前在Vmware虚拟机里配置了mumu模拟器&#xff0c;现在想要移植到宿主机中 1、虚拟机中的MuMu模拟器12-1是目标系统&#xff0c;对应的目录如下 C:\Program Files\Netease\MuMu Player 12\vms\MuMuPlayer-12.0-1 2、Vmware-虚拟机-设置-选项&#xff0c;启用共享文件夹 3、复…

DeepSeek介绍及使用ollama本地化部署DeepSeek-R1大模型

DeepSeek 中文名深度求索人工智能基础技术研究有限公司(简称“深度求索”或“DeepSeek”)&#xff0c;成立于2023年&#xff0c;是一家专注于实现AGI的中国公司。 在本月初推出 DeepSeek-R1后&#xff0c;该公司宣称其在执行数学、编码和自然语言推理等任务时“性能可与OpenAI…

金融级分布式数据库如何优化?PawSQL发布OceanBase专项调优指南

前言 OceanBase数据库作为国产自主可控的分布式数据库&#xff0c;在金融、电商、政务等领域得到广泛应用&#xff0c;优化OceanBase数据库的查询性能变得愈发重要。PawSQL为OceanBase数据库提供了全方位的SQL性能优化支持&#xff0c;助力用户充分发挥OceanBase数据库的性能潜…

简要介绍C语言与c++共有的数学函数

C语言和C都提供了丰富的数学函数&#xff0c;这些函数主要定义在 <math.h>&#xff08;C语言&#xff09;和 <cmath>&#xff08;C&#xff09;头文件中。以下分别介绍C语言与C共有的数学函数&#xff0c;以及C特有的数学函数。 C语言与C共有的数学函数&#xff08…

NVIDIA GPU介绍:概念、序列、核心、A100、H100

概述 入职一家大模型领域创业公司&#xff0c;恶补相关知识。 概念 一些概念&#xff1a; HPC&#xff1a;High Performance Computing&#xff0c;高性能计算SoC&#xff1a;System on Chip&#xff0c;单片系统FLOPS&#xff1a;Floating Point Operations Per Second&am…

Python中的函数(下)

函数返回值 返回单个值 函数可以通过 return 语句返回一个值。一旦执行到 return 语句&#xff0c;函数就会停止执行&#xff0c;并将指定的值返回给调用者。例如&#xff1a; 返回多个值 实际上&#xff0c;Python函数只能返回一个值&#xff0c;但可以通过返回一个元组来模…

python算法和数据结构刷题[2]:链表、队列、栈

链表 链表的节点定义&#xff1a; class Node():def __init__(self,item,nextNone):self.itemitemself.nextNone 删除节点&#xff1a; 删除节点前的节点的next指针指向删除节点的后一个节点 添加节点&#xff1a; 单链表 class Node():"""单链表的结点&quo…

https数字签名手动验签

以bing.com 为例 1. CA 层级的基本概念 CA 层级是一种树状结构&#xff0c;由多个层级的 CA 组成。每个 CA 负责为其下一层级的实体&#xff08;如子 CA 或终端实体&#xff09;颁发证书。层级结构的顶端是 根 CA&#xff08;Root CA&#xff09;&#xff0c;它是整个 PKI 体…

S4 HANA明确税金本币和外币之间转换汇率确定(OBC8)

本文主要介绍在S4 HANA OP中明确明确税金本币和外币之间转换汇率确定(OBC8)相关设置。具体请参照如下内容&#xff1a; 明确税金本币和外币之间转换汇率确定(OBC8) 以上配置&#xff0c;我们可以根据不同公司代码所配置的使用不同的汇率来对税金外币和本币之间进行换算。来针对…

YOLOv8源码修改(4)- 实现YOLOv8模型剪枝(任意YOLO模型的简单剪枝)

目录 前言 1. 需修改的源码文件 1.1添加C2f_v2模块 1.2 修改模型读取方式 1.3 增加 L1 正则约束化训练 1.4 在tensorboard上增加BN层权重和偏置参数分布的可视化 1.5 增加剪枝处理文件 2. 工程目录结构 3. 源码文件修改 3.1 添加C2f_v2模块和模型读取 3.2 添加L1正则…

深入解析 C++17 中的 std::not_fn

文章目录 1. std::not_fn 的定义与目的2. 基本用法2.1 基本示例2.2 使用 Lambda 表达式2.3 与其他函数适配器的比较3. 在标准库中的应用3.1 结合标准库算法使用3.1.1 std::find_if 中的应用3.1.2 std::remove_if 中的应用3.1.3 其他标准库算法中的应用4. 高级技巧与最佳实践4.1…

【腾讯云】腾讯云docker搭建单机hadoop

这里写目录标题 下载jdk hadoop修改hadoop配置编写Dockerfile构建镜像运行镜像创建客户端 下载jdk hadoop wget --no-check-certificate https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz wget --no-check-certificate https://repo.huaweicloud.…

SpringBoot 原理分析

SpringBoot 原理分析 依赖管理相关 启动器 starter Spring Boot 的 Starter 是预定义依赖项集合&#xff0c;可简化 Spring 应用配置与构建&#xff0c;启动时自动引入所需库、配置和功能。 Spring Boot 有很多预定义 Starter&#xff0c;如 spring - boot - starter - web 用…

MySQL 索引存储结构

索引是优化数据库查询最重要的方式之一&#xff0c;它是在 MySQL 的存储引擎层中实现的&#xff0c;所以 每一种存储引擎对应的索引不一定相同。我们可以通过下面这张表格&#xff0c;看看不同的存储引擎 分别支持哪种索引类型&#xff1a; BTree 索引和 Hash 索引是我们比较…

5.桥模式(Bridge)

动机 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;乃至多个纬度的变化。 &#xfeff;class Messager{ public:// 登录virtual void Login(string username, string password)0;// 发送消息virtual void SendMessage(string message)0;/…

【Rust自学】15.1. 使用Box<T>智能指针来指向堆内存上的数据

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.1.1. Box<T> box<T>可以被简单地理解为装箱&#xff0c;它是最简单的智能指针&#xff0c;允许你在堆内存上存储数据&am…

【电工基础】低压电器元件,低压断路器(空开QF),接触器(KM)

一.低压电器元件定义 电器可分为高压电器和低压电器两大类&#xff0c;我国现行标准是将工作在交流1200V(50Hz)以下、直流1500V以下的电器设备称为低压电器。 二.低压断路器&#xff0c;空开&#xff0c;空气断路器 1.空开图片与使用方式 当电路中发生严重过载、短路及失压等故…

论文阅读(七):贝叶斯因果表型网络解释遗传变异和生物学知识

1.论文链接&#xff1a;Bayesian Causal Phenotype Network Incorporating Genetic Variation and Biological Knowledge 摘要&#xff1a; 在分离群体中&#xff0c;数量性状基因座&#xff08;QTL&#xff09;定位可以确定对表型有因果效应的QTL。这些方法的一个共同特点是Q…

DeepSeek-R1 模型及GRPO算法学习

总结DeepSeek-R1 模型算法&#xff0c;并对其中的GRPO算法做一些学习补充。 DeepSeek-R1 论文总结 提出了通过强化学习提升大语言模型推理能力的方法&#xff0c;开发出 DeepSeek-R1-Zero 和 DeepSeek-R1 模型&#xff0c;在多个推理任务上表现出色&#xff0c;并开源模型推动…

灰色预测模型

特点&#xff1a; 利用少量、不完全的信息 预测的是指数型的数值 预测的是比较近的数据 灰色生成数列原理&#xff1a; 累加生成&#xff1a; 累减生成&#xff1a;通过累减生成还原成原始数列。 加权相邻生成&#xff1a;&#xff08;会更接近每月中旬&#xff0c;更推荐…