了解 React 应用程序中的渲染和重新渲染:它们如何工作以及如何优化它们
本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《了解 React 应用程序中的渲染和重新渲染:它们如何工作以及如何优化它们》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

当我们在 react 中创建应用程序时,我们经常会遇到术语“渲染”和“重新渲染组件”。虽然乍一看这似乎很简单,但当涉及不同的状态管理系统(如 usestate、redux)或当我们插入生命周期钩子(如 useeffect)时,事情会变得有趣。如果您希望您的应用程序快速高效,那么了解这些流程是关键。
什么是渲染?
渲染是 react 根据状态或属性在屏幕上渲染用户界面 (ui) 的过程。当你的组件第一次渲染时,它被称为第一次渲染。
初始渲染如何工作?
当组件首次“安装”到 dom 时,会发生以下情况:
1。状态初始化:
无论你使用 usestate、props 还是 redux,都会创建组件的初始状态。
2。渲染函数:
react 循环遍历 jsx 代码并根据当前状态生成虚拟 dom。
3。为组件的当前状态创建一个虚拟 dom(虚拟 dom)。
4。比较(差异):
虚拟 dom 与真实 dom 进行比较(由于是第一次渲染,所以所有元素都会完全渲染)。
5。显示:
该组件显示在屏幕上。
组件渲染完成后,下一个挑战就是渲染它。
重新渲染:何时以及为何?
每次状态或道具发生变化时都会发生重新渲染。您是否单击了更改屏幕上数字的按钮?更改了 redux 存储中的值?所有这些操作都可能导致 react 再次渲染组件,这就是重新渲染的用武之地。
重新渲染如何工作?
状态变化检测:
使用 usestate,当你调用 setstate 时,react 知道它需要更新组件。
使用 redux,当存储中的值发生更改时,与该状态部分关联的每个组件都会重新渲染。
渲染触发器:
当状态发生变化时,react 会根据该变化创建一个新的虚拟 dom。
比较(差异):
- react 将新的虚拟 dom 与旧的虚拟 dom 进行比较,并计算要应用哪些更改。这是 react 优化渲染的一种方式。
查看更改:
- 计算出更改后,react 将它们应用到实际的 dom 上。因此,仅再次显示页面更改的部分。
渲染哪些组件?
并非所有组件都会受到每次更改的影响。 react 仅重新渲染那些满足以下条件的组件:
使用当地州:
如果您使用 usestate,则每次调用 setstate.
使用 redux 状态:
如果你的组件依赖于 redux 状态(通过 useselector 或 connect),当该部分状态发生变化时,它将重新渲染。
使用道具:
如果 props 值发生变化,组件将使用新值重新渲染。
渲染优化
当然,不必要地重新渲染所有组件并不总是理想的。如果我们希望应用程序快速高效地运行,这里有一些优化技巧:
1。组件记忆
react 通过 react.memo 提供组件记忆功能。如果你的组件不依赖于 props 或状态变化,你可以“记住”它,因此只有当相关值发生变化时它才会重新渲染。
示例:
const memoizedcomponent = react.memo(mycomponent);
2。函数和值的记忆
为了避免在每次渲染时重新创建函数或值,请使用 usecallback 来记忆函数并使用 usememo 来记忆值。
usecallback 允许您记住函数并防止在依赖项发生变化之前重新创建它。
usememo 会记住函数的结果,因此不会在每次渲染时重新计算。
示例:
const increment = usecallback(() => {
setcount(prevcount => prevcount + 1);
}, []);
const expensivecalculation = usememo(() => {
return count * 2;
}, [count]);
3。 redux 优化
如果您使用 redux,您可以使用记忆选择器(例如重新选择)进一步优化您的应用程序。这可以避免重新渲染不受状态更改影响的组件。
生命周期挂钩和渲染
在经典的react类中,我们使用shouldcomponentupdate来控制组件何时重新渲染。在功能组件中,可以使用 useeffect 和 memoization 来模拟这个概念。
结论
渲染和重新渲染对于 react 应用程序中的 ui 显示至关重要,但正确理解和优化这些过程可以区分慢速应用程序和超快应用程序。正确使用 memoization、usecallback、usememo 以及仔细处理 redux,有助于避免不必要的重新渲染,并保持我们的应用程序快速响应。
代码示例:实际渲染和重新渲染
这是一个使用 usestate、redux 和 memoization 来优化渲染的示例组件:
import React, { useState, useEffect, useCallback, useMemo } from 'react';
import { useSelector, useDispatch } from 'react-redux';
const MyComponent = () => {
// Lokalni state
const [count, setCount] = useState(0);
// Redux state
const reduxValue = useSelector(state => state.someValue);
const dispatch = useDispatch();
// Memoizacija funkcije kako bi se izbeglo ponovno kreiranje na svakom renderu
const increment = useCallback(() => {
setCount(prevCount => prevCount + 1);
}, []);
// Memoizacija izračunate vrednosti
const expensiveCalculation = useMemo(() => {
return count * 2;
}, [count]);
// Efekat koji se pokreće samo pri promeni reduxValue
useEffect(() => {
console.log("Redux value changed:", reduxValue);
}, [reduxValue]);
return (
<div>
<p>Count: {count}</p>
<p>Expensive Calculation: {expensiveCalculation}</p>
<button onClick={increment}>Increment</button>
<button onClick={() => dispatch({ type: 'SOME_ACTION' })}>
Dispatch Redux Action
</button>
</div>
);
};
正如我们所看到的,这里使用了本地状态、redux、memoization 和 useeffect hook 的组合,以使应用程序尽可能高效。
以上就是《了解 React 应用程序中的渲染和重新渲染:它们如何工作以及如何优化它们》的详细内容,更多关于的资料请关注golang学习网公众号!
为什么每个人都应该学习 Go(即使您认为生活中不需要另一种语言)
- 上一篇
- 为什么每个人都应该学习 Go(即使您认为生活中不需要另一种语言)
- 下一篇
- 如何确定错误类型并做出适当的响应
-
- 文章 · 前端 | 7小时前 | CSS JavaScript localStorage CSS变量 颜色主题切换
- JS动态切换颜色主题方法解析
- 440浏览 收藏
-
- 文章 · 前端 | 7小时前 |
- 响应式设计CSS优化与性能提升
- 447浏览 收藏
-
- 文章 · 前端 | 7小时前 |
- CSS缩放过渡技巧与动画实现
- 450浏览 收藏
-
- 文章 · 前端 | 7小时前 |
- Linux下dmenu快速启动HTML/CSS预览终端
- 306浏览 收藏
-
- 文章 · 前端 | 7小时前 | JavaScript TypeScript 静态类型 泛型 装饰器
- JavaScript与TypeScript类型系统解析
- 141浏览 收藏
-
- 文章 · 前端 | 7小时前 |
- CSSz-index定位解决视频覆盖问题
- 426浏览 收藏
-
- 文章 · 前端 | 7小时前 |
- CSS动画卡顿?transition-transform优化技巧
- 323浏览 收藏
-
- 文章 · 前端 | 7小时前 |
- React条件渲染Props使用技巧详解
- 476浏览 收藏
-
- 文章 · 前端 | 8小时前 | DOMContentLoaded 外部脚本 async/defer 内联script 事件触发
- HTML中运行脚本语言的几种方式详解
- 161浏览 收藏
-
- 文章 · 前端 | 8小时前 |
- JavaScriptpop()方法使用技巧与数组解析
- 148浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3212次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3425次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3455次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4564次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3832次使用
-
- JavaScript函数定义及示例详解
- 2025-05-11 502浏览
-
- 优化用户界面体验的秘密武器:CSS开发项目经验大揭秘
- 2023-11-03 501浏览
-
- 使用微信小程序实现图片轮播特效
- 2023-11-21 501浏览
-
- 解析sessionStorage的存储能力与限制
- 2024-01-11 501浏览
-
- 探索冒泡活动对于团队合作的推动力
- 2024-01-13 501浏览

