【React】React 的核心设计思想


🌈个人主页: 鑫宝Code
🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础
💫个人格言: "如无必要,勿增实体"
文章目录
- React 的核心设计思想
- 引言
- 声明式编程
- 声明式 vs 命令式
- 示例
- 组件化
- 组件的优势
- 组件类型
- 单向数据流
- 单向数据流的特点
- 示例
- 虚拟 DOM
- 虚拟 DOM 的工作原理
- 虚拟 DOM 的优势
- 状态管理
- 组件状态
- 状态提升
- Context API
- 第三方状态管理库
- 生命周期和 Hooks
- 类组件生命周期
- Hooks
- JSX
- JSX 的优势
- 示例
- 封装与复用
- 组合
- 高阶组件(HOC)
- 自定义 Hooks
- 性能优化
- React.memo
- useMemo 和 useCallback
- 懒加载
- 总结
React 的核心设计思想
引言
React 自 2013 年由 Facebook 开源以来,已经成为前端开发领域最受欢迎的库之一。它不仅改变了我们构建用户界面的方式,还影响了整个前端生态系统的发展。本文将深入探讨 React 的核心设计思想,这些思想使得 React 在众多 JavaScript 框架中脱颖而出,成为开发者的首选工具。
声明式编程
React 的核心设计思想之一是声明式编程。这种范式与传统的命令式编程形成鲜明对比。
声明式 vs 命令式
- 命令式编程:详细指定每一步操作,告诉计算机"如何做"。
- 声明式编程:描述期望的结果,让框架决定"如何做"。
React 采用声明式方法来描述 UI。开发者只需声明在任何给定时刻 UI 应该是什么样子,React 负责更新 DOM 以匹配该描述。
示例
// 声明式(React)
function Welcome(props) {return <h1>Hello, {props.name}</h1>;
}// 命令式(原生 JavaScript)
function welcome(name) {const h1 = document.createElement('h1');h1.textContent = `Hello, ${name}`;document.body.appendChild(h1);
}
声明式编程的优势在于代码更加简洁、易读,并且更容易理解和维护。它让开发者专注于"做什么",而不是"怎么做"。
组件化
组件是 React 的核心概念之一。它允许将 UI 拆分为独立、可复用的部分。
组件的优势
- 模块化:将复杂的 UI 分解为简单的部分。
- 可重用性:组件可以在不同的上下文中重复使用。
- 可维护性:独立的组件更容易理解和维护。
- 封装:组件封装了自己的标记和逻辑。
组件类型
React 支持两种类型的组件:
-
函数组件:
function Welcome(props) {return <h1>Hello, {props.name}</h1>; }
-
类组件:
class Welcome extends React.Component {render() {return <h1>Hello, {this.props.name}</h1>;} }
组件化思想使得开发大型应用变得更加可行和高效。它鼓励开发者构建可复用的 UI 库,提高开发效率。
单向数据流
React 采用单向数据流的模式,这是其另一个重要的设计思想。
单向数据流的特点
- 数据自顶向下流动:父组件通过 props 向子组件传递数据。
- 状态提升:共享状态应提升到最近的共同祖先组件。
- 清晰的数据流向:使应用的数据流动更加可预测。
示例
function Parent() {const [count, setCount] = useState(0);return (<div><Child count={count} onIncrement={() => setCount(count + 1)} /></div>);
}function Child({ count, onIncrement }) {return (<div><p>Count: {count}</p><button onClick={onIncrement}>Increment</button></div>);
}
单向数据流简化了应用的状态管理,使得数据变化更容易追踪和调试。
虚拟 DOM
虚拟 DOM(Virtual DOM)是 React 性能优化的关键技术之一。
虚拟 DOM 的工作原理
- 创建虚拟 DOM 树:React 在内存中维护一个虚拟 DOM 树。
- 比较差异:当状态改变时,React 创建新的虚拟 DOM 树并与旧树比较。
- 最小化更新:只将必要的更改应用到实际 DOM。
虚拟 DOM 的优势
- 性能优化:减少直接操作 DOM 的次数。
- 跨平台:虚拟 DOM 可以映射到不同的渲染目标(如原生移动应用)。
- 简化编程模型:开发者可以像操作整个 DOM 树一样编写代码。
虚拟 DOM 使得 React 能够高效地更新 UI,同时保持良好的性能。
状态管理
状态管理是 React 应用中的核心概念之一。React 提供了多种管理状态的方式。
组件状态
React 组件可以有自己的状态,通过 useState
Hook 或类组件的 state
属性管理。
function Counter() {const [count, setCount] = useState(0);return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}
状态提升
当多个组件需要共享状态时,可以将状态提升到它们的最近共同祖先。
Context API
对于需要在组件树中广泛共享的数据,React 提供了 Context API。
const ThemeContext = React.createContext('light');function App() {return (<ThemeContext.Provider value="dark"><Toolbar /></ThemeContext.Provider>);
}function Toolbar() {return (<div><ThemedButton /></div>);
}function ThemedButton() {const theme = useContext(ThemeContext);return <Button theme={theme} />;
}
第三方状态管理库
对于复杂应用,可以使用如 Redux 或 MobX 等第三方状态管理库。
React 的状态管理方案灵活多样,可以根据应用的复杂度选择合适的方式。
生命周期和 Hooks
React 组件的生命周期和 Hooks 是其重要的设计概念,它们定义了组件在不同阶段的行为。
类组件生命周期
类组件有明确的生命周期方法,如 componentDidMount
、componentDidUpdate
和 componentWillUnmount
。
Hooks
Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性。
常用的 Hooks 包括:
useState
:管理组件状态useEffect
:处理副作用useContext
:访问 ContextuseReducer
:复杂状态逻辑useMemo
和useCallback
:性能优化
function Example() {const [count, setCount] = useState(0);useEffect(() => {document.title = `You clicked ${count} times`;});return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}
Hooks 简化了状态管理和副作用处理,使得函数组件更加强大和灵活。
JSX
JSX 是 React 的一个重要特性,它允许在 JavaScript 中编写类似 HTML 的代码。
JSX 的优势
- 声明式:直观地描述 UI 应该是什么样子。
- JavaScript 的全部能力:可以在 JSX 中使用 JavaScript 表达式。
- 编译时错误检查:语法错误可以在编译时被捕获。
- 优化:JSX 编译为高效的 JavaScript 代码。
示例
function Greeting({ name }) {return <h1>Hello, {name}!</h1>;
}const element = <Greeting name="World" />;
JSX 使得编写 UI 组件变得更加直观和高效,是 React 开发中不可或缺的一部分。
封装与复用
React 鼓励通过组合和封装来实现代码复用,而不是继承。
组合
组合是通过将组件组合在一起来创建更复杂的 UI。
function Dialog(props) {return (<div className="dialog"><h1>{props.title}</h1>{props.children}</div>);
}function WelcomeDialog() {return (<Dialog title="Welcome"><p>Thank you for visiting our spacecraft!</p></Dialog>);
}
高阶组件(HOC)
高阶组件是一个函数,接受一个组件并返回一个新组件。
function withLogger(WrappedComponent) {return class extends React.Component {componentDidMount() {console.log('Component is mounted');}render() {return <WrappedComponent {...this.props} />;}};
}
自定义 Hooks
自定义 Hooks 允许你提取组件逻辑到可重用的函数中。
function useWindowWidth() {const [width, setWidth] = useState(window.innerWidth);useEffect(() => {const handleResize = () => setWidth(window.innerWidth);window.addEventListener('resize', handleResize);return () => window.removeEventListener('resize', handleResize);}, []);return width;
}
这些模式使得 React 代码更加模块化和可复用。
性能优化
React 提供了多种方式来优化应用性能。
React.memo
React.memo
是一个高阶组件,用于包装纯函数组件以防止不必要的重新渲染。
const MemoizedComponent = React.memo(function MyComponent(props) {/* 渲染使用 props */
});
useMemo 和 useCallback
这两个 Hooks 用于优化计算成本高的操作和回调函数。
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
const memoizedCallback = useCallback(() => doSomething(a, b), [a, b]);
懒加载
React.lazy 和 Suspense 允许你动态导入组件。
const OtherComponent = React.lazy(() => import('./OtherComponent'));function MyComponent() {return (<React.Suspense fallback={<div>Loading...</div>}><OtherComponent /></React.Suspense>);
}
这些优化技术帮助开发者构建高性能的 React 应用。
总结
React 的设计思想体现了现代前端开发的最佳实践。通过声明式编程、组件化、单向数据流、虚拟 DOM、灵活的状态管理、JSX、强大的生命周期和 Hooks 系统,以及注重封装和复用的理念,React 为开发者提供了一个强大而灵活的工具集。
这些设计思想不仅使得构建复杂的用户界面变得更加简单和高效,还促进了整个前端生态系统的发展。React 的影响远远超出了它本身,它改变了我们思考和构建用户界面的方式。
随着 React 的不断发展,我们可以期待看到更多创新性的特性和优化。然而,核心设计思想可能会保持稳定,继续指导开发者构建高质量、可维护的前端应用。理解和掌握这些核心概念,将帮助开发者更好地利用 React,创造出优秀的用户体验。

相关文章:

【React】React 的核心设计思想
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 React 的核心设计思想引言声明式编程声明式 vs 命令式示例 组件化组件的优势组件…...

C++ 二叉树进阶:相关习题解析
目录 1. 二叉树创建字符串。 2. 二叉树的分层遍历1 3. 二叉树的分层遍历2 4. 二叉树的最近公共祖先 5. 将二叉搜索树转换为排序的双向链表 6. 从前序与中序遍历序列构造二叉树 7. 从中序与后序遍历序列构造二叉树 8. 二叉树的前序遍历,非递归迭代实现 9.…...

Matlab实现蚁群算法求解旅行商优化问题(TSP)(理论+例子+程序)
一、蚁群算法 蚁群算法由意大利学者Dorigo M等根据自然界蚂蚁觅食行为提岀。蚂蚁觅食行为表示大量蚂蚁组成的群体构成一个信息正反馈机制,在同一时间内路径越短蚂蚁分泌的信息就越多,蚂蚁选择该路径的概率就更大。 蚁群算法的思想来源于自然界蚂蚁觅食&a…...

2024年10月HarmonyOS应用开发者基础认证全新题库
注意事项:切记在考试之外的设备上打开题库进行搜索,防止切屏三次考试自动结束,题目是乱序,每次考试,选项的顺序都不同 这是基础认证题库,不是高级认证题库注意看清楚标题 高级认证题库地址:20…...

kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?
大家好,我是锋哥。今天分享关于【kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?】面试题?希望对大家有帮助; kafka 分布式(不是单机)的情况下,如何保证消息的…...

数据分析案例-苹果品质数据可视化分析+建模预测
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...

沈阳乐晟睿浩科技有限公司抖音小店运营创新
在当今这个数字化迅猛发展的时代,电子商务已经成为推动经济增长的重要引擎。而在电商的广阔舞台上,短视频与直播带货的崛起无疑是最为耀眼的明星之一。作为这一领域的佼佼者,抖音小店凭借其庞大的用户基础和独特的算法优势,吸引了…...

【前端】CSS知识梳理
基础:标签选择器、类选择器、id选择器和通配符选择器 font:font-style(normal) font-weight(400) font-size(16px) /line-height(0) font-family(宋体) 复合: 后代选择器( )、子选择器(>)、并集选择器(…...

【undefined reference to xxx】zookeeper库编译和安装 / sylar项目ubuntu20系统编译
最近学习sylar项目,编译项目时遇到链接库不匹配的问题,记录下自己解决问题过程,虽然过程很艰难,但还是解决了,以下内容供大家参考! undefined reference to 问题分析 项目编译报错 /usr/bin/ld: ../lib/lib…...

IDEA解决 properties 文件乱码问题
博主介绍: 计算机科班人,全栈工程师,掌握C、C#、Java、Python、Android等主流编程语言,同时也熟练掌握mysql、oracle、sqlserver等主流数据库,具有丰富的项目经验和开发技能。提供相关的学习资料、程序开发、技术解答、…...

超越Jira?2024年探索项目管理新工具!
一、Jira 在项目管理中的地位 Jira 作为一款在项目管理领域久负盛名的工具,有着不可忽视的地位。它以强大的问题跟踪和管理功能著称,无论是软件缺陷、新功能需求、任务分配还是技术难题的解决,都能精准把控。其高可定制性更是满足了不同团队…...

大模型,多模态大模型面试问题【计算图,LLama,交叉熵,SiLU,RLHF】
大模型,多模态大模型面试问题【计算图,LLama,交叉熵,SiLU,RLHF】 问题一:讲一讲计算图中pytorch是什么,TensorFlow是什么?1. PyTorch2. TensorFlow区别总结 问题二:Llama…...

凌雄科技打造DaaS模式,IT设备产业链由内而外嬗变升级
恒指正处在一种“奇妙”的波动当中。低估反弹,瞬时拉高,极速回调。这些变化集中在一条曲线上,让市场无所适从。 但事实上,所有的趋势一定总是以长期为锚。这个长期的尺度,可能会超过一般人的预估。因为中间需要经历很…...

Oracle视频基础1.2.1练习
1.2.1 需求: 完整格式查看所有用户进程判断oracle启动状态 连接sqlplus不登陆 以sysdba身份登陆,通过登陆信息判断oracle启动状态 启动数据库,查系统全局区动态组件表 使用shell,启动监听然后返回sql ps -ef sqlplus /nolog con…...

15、基于AT89C52的数码电子时钟proteus仿真设计
一、仿真原理图: 二、仿真效果: 三、相关代码: 1、timer0定时中断: void Time0(void ) interrupt 1 using 1 { count++; if(count == 20) { count = 0; second++; if(second >= 60) { second = 0; …...

UML总结
零:学习链接 UML_哔哩哔哩_bilibili 一:UML概述 二:类图 类图(Class Diagram)是统一建模语言(UML)中一种重要的图形表示,用于描述系统中的类及其之间的关系。它是面向对象设计中常…...

网站被浏览器提示不安全怎么办?——附解决方案
当你的网站被浏览器标记为不安全时,这通常意味着有一些问题需要解决。以下是一些解决这个问题的步骤: 检查SSL证书:首先,确保你的网站使用了有效的SSL证书。SSL证书可以加密浏览器和服务器之间的数据传输,保护用户数据…...

“前端兼容——CSS篇”(进阶版)
“前端兼容——CSS篇”(进阶版) 上一篇文章写了css 兼容问题处理的基础篇 点击这里基础篇—传送门,这里想给粉丝分享一下css 更深一点的兼容场景,和处理方案 文章目录 “前端兼容——CSS篇”(进阶版)进阶CS…...
使用Docker Compose简化微服务部署
文章目录 Docker Compose简介安装Docker Compose在Windows上安装Docker Compose在macOS上安装Docker Compose在Linux上安装Docker Compose 创建Docker Compose文件创建compose文件构建并运行服务 使用Docker Compose网络定义网络验证网络连接 使用Docker Compose卷定义卷使用卷…...

2025考研各省市网上确认时间汇总!
2025考研各省市网上确认时间汇总! 安徽:11月1日至5日 福建:11月1日-11月5日 山东:10月31日9:00至11月5日12:00 新疆:10月31日至11月4日17:00 湖南:11月1日9:00-4日12:00 广东:10月下旬至1…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...

spring boot使用HttpServletResponse实现sse后端流式输出消息
1.以前只是看过SSE的相关文章,没有具体实践,这次接入AI大模型使用到了流式输出,涉及到给前端流式返回,所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…...