【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…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...