首页 > 其他分享 >React 框架原理的八点

React 框架原理的八点

时间:2024-08-14 11:26:14浏览次数:13  
标签:count 框架 DOM React 虚拟 props 组件 八点

React 框架原理深入剖析

React 是一个用于构建用户界面的 JavaScript 库,它以其高效的渲染机制、组件化的开发模式和创新的设计理念在前端开发领域占据了重要地位。

一、虚拟 DOM(Virtual DOM)

虚拟 DOM 是 React 性能优化的核心策略之一。在传统的 Web 开发中,每当数据发生变化时,直接对真实的 DOM 进行操作是非常昂贵的,因为 DOM 操作涉及到浏览器的重绘和重排,会消耗大量的性能。

React 引入了虚拟 DOM 的概念。虚拟 DOM 本质上是一个 JavaScript 对象,它以一种结构化的方式描述了真实 DOM 节点的属性和结构。当组件的状态或属性发生改变时,React 会首先创建一个新的虚拟 DOM 树,然后通过一种高效的算法(通常称为 Diff 算法)将新的虚拟 DOM 树与旧的进行比较,找出两者之间的差异。

例如,假设我们有一个简单的组件,其初始虚拟 DOM 表示为:

{
  tag: 'div',
  attrs: { className: 'container' },
  children: [
    { tag: 'p', attrs: { className: 'text' }, text: 'Hello, World!' }
  ]
}

当组件的状态改变导致文本变为 ‘Hello, React!’ 时,新的虚拟 DOM 可能是:

{
  tag: 'div',
  attrs: { className: 'container' },
  children: [
    { tag: 'p', attrs: { className: 'text' }, text: 'Hello, React!' }
  ]
}

Diff 算法会快速找出这两个虚拟 DOM 树之间的差异,仅对真实 DOM 中发生变化的部分进行更新,而不是像传统方式那样直接重新渲染整个页面。

二、组件化

组件化是 React 组织代码和构建界面的基本方式。组件可以被视为独立的、可复用的功能单元,它们负责处理自己的逻辑、渲染和状态。

  1. 函数组件
    函数组件是使用 JavaScript 函数定义的组件。它们通常接收属性(props)作为输入,并返回描述组件界面的 JSX 结构。函数组件简洁明了,适合处理简单的展示逻辑。
function MyComponent(props) {
  return <div>{props.message}</div>;
}
  1. 类组件
    类组件通过扩展 React.Component 类来定义。类组件具有更多的功能,如本地状态(state)和生命周期方法。
class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  render() {
    return <div>Count: {this.state.count}</div>;
  }
}

组件化的优势在于:

  • 提高代码的可复用性,相同的组件可以在不同的地方多次使用。
  • 增强代码的可维护性,每个组件的逻辑相对独立,便于修改和调试。
  • 使界面结构更加清晰,易于理解和管理整个应用的架构。

三、单向数据流

React 遵循单向数据流的原则。数据从父组件通过属性(props)传递给子组件,子组件不能直接修改父组件传递的 props。如果子组件需要修改数据,它会通过回调函数将修改的意图传递给父组件,由父组件来进行数据的更新。

例如,父组件 ParentComponent 向子组件 ChildComponent 传递一个数据 message

<ChildComponent message="Hello" />

在子组件中,只能读取 message 的值,而不能直接修改它。如果子组件需要改变这个数据,它会通知父组件进行修改。

单向数据流的好处在于:

  • 使数据的流动更加清晰可预测,减少了数据混乱和不一致的情况。
  • 有助于更好地理解和跟踪数据的变化来源和去向。

四、状态(State)

状态是组件内部可以更改的数据。当组件的状态发生变化时,React 会重新渲染该组件及其子组件。

在类组件中,通过 this.state 来定义和管理状态,使用 this.setState 方法来更新状态。

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  incrementCount() {
    this.setState({ count: this.state.count + 1 });
  }

  render() {
    return (
      <div>
        <button onClick={this.incrementCount}>Increment</button>
        <p>Count: {this.state.count}</p>
      </div>
    );
  }
}

在函数组件中,可以使用 useState 钩子来管理状态。

function MyComponent() {
  const [count, setCount] = useState(0);

  const incrementCount = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <button onClick={incrementCount}>Increment</button>
      <p>Count: {count}</p>
    </div>
  );
}

五、生命周期方法

类组件具有一系列的生命周期方法,这些方法在组件的不同阶段被调用,允许开发者在特定的时机执行自定义的逻辑。

  1. 挂载阶段
  • constructor:在组件实例创建时被调用,用于初始化状态和绑定方法。
  • componentDidMount:组件挂载到 DOM 后调用,适合进行数据获取等异步操作。
  1. 更新阶段
  • shouldComponentUpdate:用于判断组件是否需要更新,通过返回 truefalse 来控制。
  • componentDidUpdate:组件更新后调用,可以在此处理更新后的操作。
  1. 卸载阶段
  • componentWillUnmount:组件即将卸载时调用,用于清理定时器、取消订阅等操作。

六、调和(Reconciliation)算法

调和算法是 React 用于比较新旧虚拟 DOM 树差异的机制。它会深度优先遍历两棵树,比较节点的类型、属性和子节点。

对于相同类型的节点,会进一步比较属性的变化。如果属性发生了变化,会更新对应的真实 DOM 节点的属性。

对于子节点,采用类似的比较方式。如果子节点的顺序发生了变化,React 会尽量以最小的 DOM 操作来实现重新排序。

七、JSX

JSX 是一种类似于 XML 的语法扩展,它允许在 JavaScript 代码中直接编写类似 HTML 的标记。JSX 并不是必需的,但它大大提高了代码的可读性和直观性。

const element = <h1>Hello, React!</h1>;

JSX 最终会被 Babel 等工具编译为普通的 JavaScript 函数调用,生成虚拟 DOM 对象。

八、钩子函数(Hooks)

Hooks 是 React 16.8 引入的新特性,它允许在函数组件中使用状态、副作用等功能,使函数组件更加强大和灵活。

  1. useState:用于在函数组件中添加状态。
  2. useEffect:用于处理副作用,如数据获取、订阅事件等。
  3. useContext:用于在函数组件中访问上下文数据。

Hooks 的出现使得函数组件和类组件在功能上更加接近,同时也鼓励了函数式编程的风格。

标签:count,框架,DOM,React,虚拟,props,组件,八点
From: https://blog.csdn.net/weixin_41978174/article/details/141186424

相关文章

  • ruoyi框架定时任务教程
    需求背景有时候我们需要动态管理一些定时任务,比如用户自己创建一个任务,在每天的早上9点执行。那我们就不能自己在配置文件中写死cron表达式,应该是一个动态的。ruoyi框架自带了定时任务模块,我们可以快速改造。题外话这里我们只讲定时任务这个功能,简单的两三个任务在这里执行......
  • 网络安全人士必知的35个安全框架及模型
    一、概述网络安全专业机构制定的一套标准、准则和程序,旨在帮助组织了解和管理面临的网络安全风险。优秀的安全框架及模型应该为用户提供一种可靠方法,帮助其实现网络安全建设计划。对于那些希望按照行业最佳实践来设计或改进安全策略的组织或个人来说,网络安全框架及模型是不......
  • 【Java手写RPC框架系列-1】—— 基础知识准备:RPC+Netty
    代码随想录知识星球介绍https://articles.zsxq.com/id_m76jd72243bi.html基于Netty手写实现RPChttps://www.cnblogs.com/mic112/p/15565795.html项目背景与介绍RPC:远程过程调用协议:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序......
  • React Diff
    ReactDiff流程前提在React的render阶段的beginWorl方法中对于update的组件会通过reconcileChildFibers方法将当前组件与该组件在上次更新时对应的Fiber节点进行比较(即diff算法),将比较的结果生成新的Fiber节点,即创建workInProgressfiber的过程。其中,在某一时刻,一个DOM节点最多......
  • 多租户、模块化、DDD框架、开箱即用
    .NET8+Blazor多租户、模块化、DDD框架、开箱即用前言基于.NET8的开源项目,主要使用WebAPI+Blazor支持多租户和模块化设计,DDD构建。可以帮助我们轻松地搭建起一个功能完善的Web应用程序。除了帮助你快速构建应用程序之外,项目也可以当做学习资料。我们可以从中了解到多......
  • UEFI Shell 的基本操作和应用场景,适合初学者了解和入门 UEFI Shell 的使用。 UEFI She
    UEFIShell是一种提供命令行接口的环境,用于与UEFI固件进行交互。UEFI(统一可扩展固件接口)是计算机启动过程中的一种固件接口,替代了传统的BIOS。UEFIShell提供了一种方式,让用户在启动操作系统之前进行系统管理和配置。主要特点命令行界面:UEFIShell提供一个类似于操作......
  • 一个基于 Java 接口参数加密框架,让接口参数加密变得简单、优雅!
    SecurityApiv1.0.1一个基于Java接口参数加密框架,让接口参数加密变得简单、优雅!文章目录一、SecurityApi介绍二、SecurityApi依赖三、使用1.RSA加密(非对称加密)1.1简单示例1.2生成RSA密钥1.3加签名说明「第一个场景」B要给A传递一条加密消息「第二个场景」B......
  • 【人工智能】 使用线性回归预测波士顿房价 paddlepaddle 框架 飞桨
    一、简要介绍经典的线性回归模型主要用来预测一些存在着线性关系的数据集。回归模型可以理解为:存在一个点集,用一条曲线去拟合它分布的过程。如果拟合曲线是一条直线,则称为线性回归。如果是一条二次曲线,则被称为二次回归。线性回归是回归模型中最简单的一种。本示例简要介......
  • [开题报告]FLASK框架涉外商务协会管理软件设计3j3jv(源码+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全球经济一体化的深入发展,涉外商务活动日益频繁,商务协会作为促进国际交流与合作的重要平台,其管理效率与服务质量直接关系到会员企业的......
  • [开题报告]FLASK框架思宇口腔门诊信息管理系统的设计与实现09jzm(源码+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在数字化时代,医疗行业的信息化转型已成为不可逆转的趋势。口腔门诊作为医疗服务体系中的重要一环,其日常运营涉及大量患者信息、医疗记录、......