React 简介:核心概念、组件化架构与声明式编程

 本文为《React Agent:从零开始构建 AI 智能体》专栏系列文章。 专栏地址:https://blog.csdn.net/suiyingy/category_12933485.html。项目地址:https://gitee.com/fgai/react-agent(含完整代码示​例与实战源)。完整介绍:https://blog.csdn.net/suiyingy/article/details/146983582。

        在当今快速发展的 Web 开发领域,构建高效、可维护且用户体验出色的用户界面(UI)始终是开发者面临的核心挑战。传统的 DOM 操作方式虽然直接,但随着应用复杂度的提升,频繁的 DOM 操作会导致性能瓶颈,代码的可维护性也会急剧下降。2013 年,Facebook(现 Meta)开源了 React.js,这个专注于 UI 层的 JavaScript 库以其独特的组件化架构和声明式编程思想,彻底改变了前端开发的范式。经过十年的发展,React 已成为全球最受欢迎的前端框架之一,Stack Overflow 2024 年开发者调查显示,40.2% 的专业开发者在使用 React,其生态系统覆盖了 Web、移动、桌面甚至 VR 应用开发。截至 2025 年,React 最新稳定版为 18.3,新增并发模式、自动批处理等特性,持续引领前端技术发展。其官网地址为https://react.dev/。

图1 React 官网页面

        React 核心理念是基于组件化和声明式编程,使得开发者能够以一种直观且高效的方式构建动态的 Web 应用程序。组件化将 UI 分解为独立可复用的单元,每个组件封装了自身的逻辑和视图,如同搭建积木般构建复杂界面。声明式编程则让开发者只需描述“UI 应该是什么样”,而非“如何实现变化”,React 会自动处理 DOM 更新的具体逻辑。这种思想解放了开发者的思维,将关注点从操作 DOM 转向管理数据状态,大大提升了开发效率。它专注于 UI 层,与其他框架(例如 Angular 和 Vue)不同,其并不提供完整的框架解决方案,而是鼓励通过组合第三方库和工具来完成特定需求。

        下面是一个简单按钮点击程序,效果如下图所示。

function MyButton() {return (<button>I'm a button</button>);
}export default function MyApp() {return (<div><h1>Welcome to FGAI React Agent</h1><MyButton /></div>);
}

图2 React 示例效果

        DOM 即文档对象模型(Document Object Model),它是一种用于表示 HTML 或 XML 文档的树形结构,让程序和脚本能够动态地访问和修改文档的内容、结构和样式。React 并不直接操作浏览器的 DOM,而是构建一个内存中的虚拟 DOM。在虚拟 DOM 中完成必要的操作后,它才将变化应用到实际的浏览器 DOM 上。这种方式极为高效,因为它仅对需要修改的部分进行变更,大大减少了直接操作 DOM 带来的性能损耗。举例来说,当一个列表项发生变化时,React 通过虚拟 DOM 的比对,仅更新该列表项对应的 DOM 部分,而非整个列表的 DOM 结构。

        React 的关键特点如下。

1 基于组件的架构

        React 允许将用户界面拆分为更小的、自包含的组件。组件是一种可复用的、独立的代码单元,可以封装 HTML、CSS 和 JavaScript,能够显著提高代码的可维护性和复用性。每个组件都可以拥有自己的状态(state)和属性(props)。以一个简单的导航栏组件为例,它可能包含自己的状态来控制菜单的展开与收起,同时通过属性接收来自父组件的链接信息等。这种组件化的方式使得代码的复用性大大提高,维护和更新也更加便捷。

2 JSX(JavaScript 语法扩展)

        JSX 是 JavaScript 的一种语法扩展,开发者能够在 JavaScript 文件中编写类似 HTML 的代码。这使得 React 组件的代码可读性和表达性更强。例如:

const name = "FGAI React Agent";
const ele = <h1>Welcome to {name}</h1>;

        这里通过 JSX,将 JavaScript 变量name嵌入到类似 HTML 的标签中,直观地创建了一个包含特定文本的标题元素。

3 虚拟 DOM(Virtual DOM)

        如前所述,React 维护着一个轻量化的实际 DOM 的内存表示。当数据发生变化时,它会高效地更新 DOM 中真正需要改变的部分。这种机制避免了频繁地直接操作 DOM,提升了应用程序的性能。在一个实时聊天应用中,不断更新的聊天消息列表,通过虚拟 DOM,它能精准地只添加新消息对应的 DOM 元素,而不影响其他已存在的消息 DOM。

4 单向数据流

        React 采用单向数据流(Unidirectional Data Flow),即数据从父组件传递到子组件。这样可以确保数据流向清晰,便于调试和状态管理。子组件通过属性(props)接收来自父组件的数据,但无法直接将数据返回给父组件。不过,子组件可以与父组件通信,根据提供的输入来修改父组件的状态。例如,在一个父子组件构成的表单场景中,父组件传递初始表单数据给子组件,子组件通过用户输入修改数据后,通过特定的回调函数通知父组件更新状态。

5 声明式编程

开发者只需要描述 UI 在不同状态下的样子,React 会自动处理 UI 更新的逻辑,而无需手动操作 DOM。他会自动处理 UI 更新的具体逻辑,比如如何查询 DOM 元素、如何更新元素的属性或内容、如何处理动画效果等。例如,在一个电商应用中,当用户将商品加入购物车时,开发者只需设定购物车图标旁的商品数量显示会相应增加,或者商品列表中的“加入购物车”按钮变为“已加入”状态等。

立即关注获取最新动态

点击订阅《React Agent 开发专栏》,每周获取智能体开发深度教程。项目代码持续更新至React Agent 开源仓库,欢迎 Star 获取实时更新通知!FGAI 人工智能平台https://www.botaigc.cn/

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

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

相关文章

LeetCode100.7 接雨水

对于这题&#xff0c;有一个非常直观简洁的思路&#xff1a;水量等于柱子围成的体积减去柱子的体积。 首先计算每一个高度的体积&#xff0c;相加即为总体积&#xff0c;减去sum(height)即为水的体积。 class Solution { public:int trap(vector<int>& height) {in…

NineData 社区版 V4.1.0 正式发布,新增 4 条迁移链路,本地化数据管理能力再升级

NineData 社区版 V4.1.0 正式更新发布。本次通过新增 4 条迁移链路扩展、国产数据库深度适配、敏感数据保护增强‌等升级&#xff0c;进一步巩固了其作为高效、安全、易用的数据管理工具的定位。无论是开发测试、数据迁移&#xff0c;还是多环境的数据管理&#xff0c;NineData…

Go 语言 sqlx 库使用:对 MySQL 增删改查

MySQL 作为目前最流行的开源关系型数据库&#xff0c;其 SQL 语法体系已形成行业标准&#xff0c;相关知识体系庞大且成熟&#xff0c;本文不再对 SQL 基础进行详细展开&#xff0c;建议尚未掌握的读者先行系统学习。本文聚焦于如何使用 Go 语言进行 MySQL 数据库操作&#xff…

单片机-STM32部分:13、PWM

飞书文档https://x509p6c8to.feishu.cn/wiki/NjhuwbVP7iaEOikVK95cmJNLnWf PWM&#xff08;Pulse Width Modulation&#xff09;脉冲宽度调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。它是把每一脉冲宽度均相等的脉冲列作为PWM波形&am…

抽奖系统-奖品-活动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言获取奖品列表前端页面活动创建需求分析活动创建后端实现1-控制层实现及校验活动活动创建后端实现2-保存信息活动插入活动奖品插入 整合活动信息存入redis测试活…

Dense 与 MoE 系列模型架构的全面对比与应用策略

0. 简介 人工智能领域正经历着一场架构革命&#xff0c;从传统的密集连接模型&#xff08;Dense&#xff09;向混合专家模型&#xff08;Mixture of Experts, MoE&#xff09;的转变。本文将全面剖析这两种模型架构的本质差异、各自优势与挑战&#xff0c;并提供战略性的选择框…

代码随想录算法训练营第四十天

LeetCode题目: 647. 回文子串516. 最长回文子序列 其他: 今日总结 往期打卡 647. 回文子串 跳转: 647. 回文子串 学习: 代码随想录公开讲解 问题: 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。…

Supabase 的入门详细介绍

Supabase 是什么&#xff1f; 简单来说&#xff0c;Supabase 是一个开源的 Firebase 替代品。它提供了一整套后端即服务 (BaaS - Backend as a Service) 的工具&#xff0c;让你能够快速构建应用程序的后端&#xff0c;而无需自己从头搭建和管理服务器、数据库等基础设施。 S…

【MySQL】mysql/bin目录下程序介绍

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【MySQL】探秘&#xff1a;数据库世界的瑞士军刀 MySQL在安装完成后&#xff0c;通常会包含以下程序&#xff0c;以Ubuntu上的mysql为例&#xff0c;我们可以查看到 以下是常用的mysql程序 程序名作用…

IDEA+git将分支合并到主分支、IDEA合并分支

文章目录 一、合并分支二、可能遇到的问题2.1、代码冲突 开发过程中我们可能在开发分支(dev)中进行开发&#xff0c;等上线后将代码合并到主分支(master)中&#xff0c;本文讲解如何在IDEA中将dev分支的代码合并到master分支中。 一、合并分支 功能说明&#xff1a;将dev分支的…

通过Ollama读取模型

通过Ollama读取模型 前言一、查看本地Ollama上有哪些模型二、调用bge-m3模型1、调用模型2、使用bge-m3进行相似度比较 三、调用大模型 前言 手动下载和加载大模型通常需要复杂的环境配置&#xff0c;而使用Ollama可以避免这一问题。本文将介绍如何调用Ollama上的模型。 一、查…

JS 中 Object.keys() 和 Object.values() 的深度解析与应用

文章目录 前言一、Object.keys() 和 Object.values() 基础1. Object.keys()2. Object.values() 二、与 Object.entries() 的对比三、实际应用场景1. 遍历对象属性2. 判断对象是否为空3. 对象与数组的转换4. 动态属性操作5. 过滤对象属性 总结 前言 在 JavaScript 开发中&#…

HCIP(BFD)

一、前言 随着网络应用的广泛部署,网络发生故障极大可能导致业务异常。为了减小链路、设备故障对业 务的影响,提高网络的可靠性,网络设备需要尽快检测到与相邻设备间的通信故障,以便及时采取措施,保证业务正常进行。BFD(Bidirectional Forwarding Detection,双向转发检测)提供…

Webpack其他插件

安装html打包插件 const path require(path); const HtmlWebpackPlugin require(html-webpack-plugin) module.exports {entry: path.resolve(__dirname,src/login/index.js),output: {path: path.resolve(__dirname, dist),filename: ./login/index.js,clean:true},Plugin:…

【Linux网络】网络层

网络层 在复杂的网络环境中确定一个合适的路径 IP 协议 IPV4 点分十进制[0,255].[0,255].[0,255].[0,255]IPV6 IP地址目标网格目标主机 基本概念 主机:配有IP地址,但是不进行路由控制的设备;路由器:即配有IP地址,又能进行路由控制;节点:主机和路由器的统称。 两个问题 路…

跨域的几种方案

因为浏览器出于安全考虑&#xff0c;有同源策略。也就是说&#xff0c;如果协议、域名、端口有一个不同就是跨域&#xff0c;Ajax 请求会失败。 我们可以通过以下几种常用方法解决跨域的问题 JSONP JSONP 的原理很简单&#xff0c;就是利用 <script> 标签没有跨域限制…

基于EFISH-SCB-RK3576/SAIL-RK3576的智能安检机技术方案‌

&#xff08;国产化替代J1900的全场景技术解析&#xff09; 一、硬件架构设计‌ ‌核心处理模块‌ ‌异构计算架构‌&#xff1a; ‌四核Cortex-A72&#xff08;2.3GHz&#xff09;‌&#xff1a;运行X光图像重建算法&#xff08;FDK反投影&#xff09;&#xff0c;支持双能谱…

MQ防重复消费----去重表结合 Spring AOP 切面编程,抽象封装成通用幂等注解

以下内容包含针对 NoMQDuplicateConsumeAspect 的深度面试问答、消息队列重投递触发场景、AOP 切面编程扩展&#xff0c;以及基于已有实现的关键要点与步骤总结。文中所有论断均引用多源资料&#xff0c;以助于您在面试与实战中全面展示对幂等消费切面及消息重投的理解。 一、深…

[:, :, 1]和[:, :, 0] 的区别; `prompt_vector` 和 `embedding_matrix`的作用

prompt_vector = torch.sum(prompt_embedding * attention_weights.unsqueeze(-1), dim=1) # [1, hidden_dim] prompt_vector = torch.sum(prompt_embedding * attention_weights.unsqueeze(-1), dim=1) 主要作用是通过将 prompt_embedding 与 attention_weights 相乘后再按指…

Dinky 安装部署并配置提交 Flink Yarn 任务

官方文档 https://www.dinky.org.cn/docs/1.1/deploy_guide/normal_deploy 版本 dinky 1.1.0、1.2.3 当前最新发布版本为 1.2.3 &#xff0c;但是官方文档最新稳定版为 1.1 &#xff0c;所以先选择 1.1.0&#xff0c;验证通过后&#xff0c;再尝试 1.2.3 &#xff0c;发现 1…