当前位置: 首页 > news >正文

【React】React 的核心设计思想


鑫宝Code

🌈个人主页: 鑫宝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 拆分为独立、可复用的部分。
在这里插入图片描述

组件的优势

  1. 模块化:将复杂的 UI 分解为简单的部分。
  2. 可重用性:组件可以在不同的上下文中重复使用。
  3. 可维护性:独立的组件更容易理解和维护。
  4. 封装:组件封装了自己的标记和逻辑。

组件类型

React 支持两种类型的组件:

  1. 函数组件

    function Welcome(props) {return <h1>Hello, {props.name}</h1>;
    }
    
  2. 类组件

    class Welcome extends React.Component {render() {return <h1>Hello, {this.props.name}</h1>;}
    }
    

组件化思想使得开发大型应用变得更加可行和高效。它鼓励开发者构建可复用的 UI 库,提高开发效率。

单向数据流

React 采用单向数据流的模式,这是其另一个重要的设计思想。
在这里插入图片描述

单向数据流的特点

  1. 数据自顶向下流动:父组件通过 props 向子组件传递数据。
  2. 状态提升:共享状态应提升到最近的共同祖先组件。
  3. 清晰的数据流向:使应用的数据流动更加可预测。

示例

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 的工作原理

  1. 创建虚拟 DOM 树:React 在内存中维护一个虚拟 DOM 树。
  2. 比较差异:当状态改变时,React 创建新的虚拟 DOM 树并与旧树比较。
  3. 最小化更新:只将必要的更改应用到实际 DOM。

虚拟 DOM 的优势

  1. 性能优化:减少直接操作 DOM 的次数。
  2. 跨平台:虚拟 DOM 可以映射到不同的渲染目标(如原生移动应用)。
  3. 简化编程模型:开发者可以像操作整个 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 是其重要的设计概念,它们定义了组件在不同阶段的行为。

类组件生命周期

类组件有明确的生命周期方法,如 componentDidMountcomponentDidUpdatecomponentWillUnmount

Hooks

Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性。

常用的 Hooks 包括:

  • useState:管理组件状态
  • useEffect:处理副作用
  • useContext:访问 Context
  • useReducer:复杂状态逻辑
  • useMemouseCallback:性能优化
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 的优势

  1. 声明式:直观地描述 UI 应该是什么样子。
  2. JavaScript 的全部能力:可以在 JSX 中使用 JavaScript 表达式。
  3. 编译时错误检查:语法错误可以在编译时被捕获。
  4. 优化: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,创造出优秀的用户体验。

End

相关文章:

【React】React 的核心设计思想

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

C++ 二叉树进阶:相关习题解析

目录 1. 二叉树创建字符串。 2. 二叉树的分层遍历1 3. 二叉树的分层遍历2 4. 二叉树的最近公共祖先 5. 将二叉搜索树转换为排序的双向链表 6. 从前序与中序遍历序列构造二叉树 7. 从中序与后序遍历序列构造二叉树 8. 二叉树的前序遍历&#xff0c;非递归迭代实现 9.…...

Matlab实现蚁群算法求解旅行商优化问题(TSP)(理论+例子+程序)

一、蚁群算法 蚁群算法由意大利学者Dorigo M等根据自然界蚂蚁觅食行为提岀。蚂蚁觅食行为表示大量蚂蚁组成的群体构成一个信息正反馈机制&#xff0c;在同一时间内路径越短蚂蚁分泌的信息就越多&#xff0c;蚂蚁选择该路径的概率就更大。 蚁群算法的思想来源于自然界蚂蚁觅食&a…...

2024年10月HarmonyOS应用开发者基础认证全新题库

注意事项&#xff1a;切记在考试之外的设备上打开题库进行搜索&#xff0c;防止切屏三次考试自动结束&#xff0c;题目是乱序&#xff0c;每次考试&#xff0c;选项的顺序都不同 这是基础认证题库&#xff0c;不是高级认证题库注意看清楚标题 高级认证题库地址&#xff1a;20…...

kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?

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

数据分析案例-苹果品质数据可视化分析+建模预测

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

沈阳乐晟睿浩科技有限公司抖音小店运营创新

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

【前端】CSS知识梳理

基础&#xff1a;标签选择器、类选择器、id选择器和通配符选择器 font:font-style(normal) font-weight(400) font-size(16px) /line-height(0) font-family(宋体&#xff09; 复合&#xff1a; 后代选择器&#xff08; &#xff09;、子选择器&#xff08;>)、并集选择器(…...

【undefined reference to xxx】zookeeper库编译和安装 / sylar项目ubuntu20系统编译

最近学习sylar项目&#xff0c;编译项目时遇到链接库不匹配的问题&#xff0c;记录下自己解决问题过程&#xff0c;虽然过程很艰难&#xff0c;但还是解决了&#xff0c;以下内容供大家参考&#xff01; undefined reference to 问题分析 项目编译报错 /usr/bin/ld: ../lib/lib…...

IDEA解决 properties 文件乱码问题

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

超越Jira?2024年探索项目管理新工具!

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

大模型,多模态大模型面试问题【计算图,LLama,交叉熵,SiLU,RLHF】

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

凌雄科技打造DaaS模式,IT设备产业链由内而外嬗变升级

恒指正处在一种“奇妙”的波动当中。低估反弹&#xff0c;瞬时拉高&#xff0c;极速回调。这些变化集中在一条曲线上&#xff0c;让市场无所适从。 但事实上&#xff0c;所有的趋势一定总是以长期为锚。这个长期的尺度&#xff0c;可能会超过一般人的预估。因为中间需要经历很…...

Oracle视频基础1.2.1练习

1.2.1 需求&#xff1a; 完整格式查看所有用户进程判断oracle启动状态 连接sqlplus不登陆 以sysdba身份登陆&#xff0c;通过登陆信息判断oracle启动状态 启动数据库&#xff0c;查系统全局区动态组件表 使用shell&#xff0c;启动监听然后返回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总结

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

网站被浏览器提示不安全怎么办?——附解决方案

当你的网站被浏览器标记为不安全时&#xff0c;这通常意味着有一些问题需要解决。以下是一些解决这个问题的步骤&#xff1a; 检查SSL证书&#xff1a;首先&#xff0c;确保你的网站使用了有效的SSL证书。SSL证书可以加密浏览器和服务器之间的数据传输&#xff0c;保护用户数据…...

“前端兼容——CSS篇”(进阶版)

“前端兼容——CSS篇”&#xff08;进阶版&#xff09; 上一篇文章写了css 兼容问题处理的基础篇 点击这里基础篇—传送门&#xff0c;这里想给粉丝分享一下css 更深一点的兼容场景&#xff0c;和处理方案 文章目录 “前端兼容——CSS篇”&#xff08;进阶版&#xff09;进阶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考研各省市网上确认时间汇总&#xff01; 安徽&#xff1a;11月1日至5日 福建&#xff1a;11月1日-11月5日 山东&#xff1a;10月31日9:00至11月5日12:00 新疆&#xff1a;10月31日至11月4日17:00 湖南&#xff1a;11月1日9:00-4日12:00 广东&#xff1a;10月下旬至1…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...