react原理及合成事件原理
文章目录
- react的理解
- react创建组件的三种写法
- react的工作原理
- 初始化的渲染流程。
- 页面更新的流程。
- diffing 算法计算更新视图
- diff策略
- react合成事件原理
- 一、React合成事件的概念
- 二、React合成事件的原理
- 三、React合成事件的优势
- 四、React合成事件的使用方法
- 五、总结
react的理解
- 采用声明式渲染,函数式编程,声明显示内容,react自动完成
- 通过虚拟DOM,减少与DOM的交互
- 单向数据流,从父节点传递到子节点,父节点改变,子节点重新渲染,遵循不可变数据。
- 提高代码的复用率,通过react构建组件,让代码更容易得到复用
- react类组件使用render()方法或函数式组件return,接受输入的数据并返回需要展示的内容
- 代码可读性高
- 可以做劫持渲染(shouldcomponentupdate)
react创建组件的三种写法
- React.createClass
- React.Component
- 无状态的函数写法(纯组件)
react的工作原理
react的响应式理念,通过改变函数的data值,改变ui。实现一个组件或者功能需要先实现一个函数,改变函数的data值,来影响ui
初始化的渲染流程。
- react用jsx语法写好逻辑。
- 执行 ReactDOM.render 函数,渲染出虚拟DOM。
- react 将虚拟DOM,渲染成真实的DOM。
页面更新的流程。
- 当页面需要更新时,通过声明式的方法,调用 setState 告诉 react什么数据变了。
- react 自动调用组件的 render 方法,渲染出虚拟 DOM。
- react 会通过 diffing 算法,对比当前虚拟 DOM 和需要更新的虚拟 DOM 有什么区别。然后重新渲染区别部分的真实 DOM
diffing 算法计算更新视图
render()调用后视图发生了变化,根据状态和jsx结构生成新的虚拟DOM,同级比较两棵虚拟DOM树的差异,得到差异对象,把差异对象应用到真正的DOM树上。
diff策略
1、tree diff
按照树的层级进行比较,如果该节点不存在,则整个删除,不再继续比较。
如果是跨层级的话,只有创建节点和删除节点的操作
2、component diff
每一层中组件的对比,同一类型的两个组件,按照层级比较虚拟DOM。组件A变化为组件B时,可能虚拟DOM没有任何变化,可以通过shouldComponentUpdata()来判断是否需要判断计算;不同类型的组件,将一个(将被改变的)组件判断为dirtycomponent(脏组件),从而替换整个组件的所有节点
3、element diff
如果两个组件类型相同,则需要对比组建中的元素。删除,插入,移动节点
同一组件中key的要素
1、通过key保证节点的唯一性,避免了重复渲染。如果key相同,则不需要重新计算并渲染。
2、key值是固定的,一般key值不用数组的下表索引值,当数组发生变化是,索引值会改变。
原文链接:https://blog.csdn.net/Jasmine_jieer/article/details/126404865
react合成事件原理
React是-个流行的JaaScript库,用构建用户界面。它采用了一种特殊的事件处理机制,即React合成事件。本文将详细个绍React合成事件的原理及其重要性。
一、React合成事件的概念
React合成事件是指React通过在浏览器上绑定一系列事件处理函数,来处理用户与界面的交互行为。它的设计目标是提供一种高效、跨浏览器的事件系统,同时也解决了传统原生事件处理中一些常见的问题。
二、React合成事件的原理
1.事件委托:React合成事件利用了事件委托的机制,将事件绑定在顶层的容器上,而不是每个具体的元素上。这样做的好处是减少了事件处理函数的数量,提高了性能
2.事件池: React合成事件使用了事件池的概念。事件池是一个复用的对象池,用于存储事件对象。当事件被触发时React会从事件池中取出一个事件对象,并将相关信息填充到该对象中,然后传递给事件处理函数。事件处理函数执行完毕后,事件对象会被重置并放回事件池中,供下次使用。
3.统一化事件处理: React合成事件封装了原生事件对象,提供了一套统一的AP1,使得事件处理函数在不同浏览器下表现一致。这样开发者无需关心浏览器兼容性的问题,可以更专注于业务逻辑的实现。
三、React合成事件的优势
1.性能优化:由于利用了事件委托和事件池的机制,React合成事件大大减少了事件处理函数的数量,提高了性能。另外,事件池的复用机制也减少了对象的创建和销毁,进一步减少了内存消耗
2.事件处理函数的统一性: React合成事件封装了原生事件对象,并提供了一致的API,使得开发者可以更方便地处理事件。这对于跨浏览器的开发是非常重要的。
3.防上事件冒泡: React合成事件默认会阻止事件冒泡,这在一些场景下非常有用。开发者可以通过调用event.stopPropagation(来手动阻止事件冒泡。
四、React合成事件的使用方法
使用React合成事件非常简单。开发者只需在元素上绑定事件处理函数即可。例如,要为一个按钮添加点击事件处理区数,可以使用以下代码:
import React from 'react!.
class MyButton extends React.Component {
handleClick = (event) => [
console.log(按钮被点击了!;
render() [
return (
<button onClick={this.handleClickI>点击我</button>
在上述代码中,我们在按钮元素上绑定了一个点击事件处理函数handleClick。当按钮被点击时,控制台将会输出"按钮被点击了!"。
五、总结
React合成事件是React框架中非常重要的一部分,它通过事件委托、事件池和统一化事件处理等机制,提供了高效、跨浏览器的事件系统。使用React合成事件可以有效地提高性能,简化开发流程,并保证事件处理函数在不同浏览器下的致性。因此,掌握React合成事件的原理和使用方法对于React开发者来说是非常重要的。
简单说就是:react是在原生浏览器的枝上做了一层封装,把对应事件做了一次合成,最大的好处是合成事件可以匹配不同浏览器之间的差异,比如事件委托、事件池、事件合并这些
相关文章:
react原理及合成事件原理
文章目录 react的理解react创建组件的三种写法react的工作原理初始化的渲染流程。页面更新的流程。diffing 算法计算更新视图diff策略 react合成事件原理一、React合成事件的概念二、React合成事件的原理三、React合成事件的优势四、React合成事件的使用方法五、总结 react的理…...
独立版求职招聘平台小程序开发
小程序招聘系统开发 我们开发了一款高效、便捷的互联网招聘平台。在这里,可以轻松实现企业入驻、职位发布、在线求职、精准匹配职位和人才,以及参与招聘会等功能。目标是为求职者和企业搭建一个连接彼此的桥梁,帮助您更快地找到满意的工作&…...
Redis事务+秒杀案例
Redis事务是一个单独的隔离操作,是指将多条命令放在一个命令队列当中,按顺序执行,保证多个命令在同一个事务中执行而不受其他客户端的影响。 通俗来说就是:串联多个命令防止别的命令插队。 1.Multi、Exec、discard 在输入Multi命…...
目标分割技术-语义分割总览
前言 博主现任高级人工智能工程师,曾发表多篇SCI且获得过多次国际竞赛奖项,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。目的就是为了让零基础快速使用各类代码模型,每一篇文章都包含实战项目以及可运行代码。欢迎大家订阅一…...
基于C#实现最长公共子序列
一、作用 最长公共子序列的问题常用于解决字符串的相似度,是一个非常实用的算法,作为码农,此算法是我们的必备基本功。 二、概念 举个例子,cnblogs 这个字符串中子序列有多少个呢?很显然有 27 个,比如其…...
物联网AI MicroPython学习之语法 SPI串行外设通信
学物联网,来万物简单IoT物联网!! SPI 介绍 模块功能: SPI串行外设驱动 接口说明 SPI - 构建SPI对象 函数原型:SPI(id, baudrate,polarity, phase,sck, mosi, miso)参数说明: 参数类型必选参…...
电动汽车充放电V2G模型MATLAB代码
微❤关注“电气仔推送”获得资料(专享优惠) 主要内容: 本程序主要建立电动汽车充放电V2G模型,采用粒子群算法,在保证电动汽车用户出行需求的前提下,为了使工作区域电动汽车尽可能多的消纳供给商场基础负荷…...
【大数据Hive】hive 优化策略之job任务优化
目录 一、前言 二、hive执行计划 2.1 hive explain简介 2.1.1 语法格式 2.1.2 查询计划阶段说明 2.2 操作演示 2.2.1 不加条件的查询计划分析 2.2.2 带条件的查询计划分析 三、MapReduce属性优化 3.1 本地模式 3.1.1 本地模式参数设置 3.1.2 本地模式操作演示 3.2 …...
OpenAI再次与Altman谈判;ChatGPT Voice正式上线
11月22日,金融时报消息,OpenAI迫于超过700名员工联名信的压力,再次启动了与Sam Altman的谈判,希望他回归董事会。 在Sam确定加入微软后,OpenAI超700名员工签署了一封联名信,要求Sam和Greg Brockman&#x…...
【JS】Chapter15-高阶技巧
站在巨人的肩膀上 黑马程序员前端JavaScript入门到精通全套视频教程,javascript核心进阶ES6语法、API、js高级等基础知识和实战教程 (十五)高阶技巧 1. 深浅拷贝 开发中我们经常需要复制一个对象。如果直接用赋值会有下面问题:/…...
Google Chrome 任意文件读取 (CVE-2023-4357)漏洞
漏洞描述 该漏洞的存在是由于 Google Chrome 中用户提供的 XML 输入验证不足。远程攻击者可以创建特制网页,诱骗受害者访问该网页并获取用户系统上的敏感信息。远程攻击者可利用该漏洞通过构建的 HTML 页面绕过文件访问限制,导致chrome任意文件读取。Li…...
psql 模式(SCHEMA)
模式是数据库领域的一个基本概念,有些数据库把模式和用户合二为一了,而postgresql则是有清晰的模式定义。 模式是数据库中的一个概念,可以理解为一个命名空间或目录,不同模式下可以有相同名称的表、函数等对象而不会产生冲突。提出…...
网络吞吐量 公网带宽有关吗?
环境: 华为交换机 深信服防火墙 问题描述: 网络吞吐量 公网带宽有关吗? 解决方案: 网络吞吐量网络吞吐量是指在特定时间内通过网络传输的数据量。它衡量了网络设备(如防火墙、交换机、路由器)或网络连…...
Linux设置静态IP
Linux设置静态IP 使用ip addr查看ip,如下所示就是动态IP 1、什么是静态IP? 静态ip就是固定的ip,需要手动设置。静态IP地址(又称固定IP地址)是长期分配给一台计算机或网络设备使用的 IP 地址。一般来说,一…...
六、Big Data Tools安装
1、安装 在Jetbrains的任意一款产品中,均可安装Big Data Tools这个插件。 2、示例 下面以DadaGrip为例: (1)打开插件中心 (2)搜索Big Data Tools,下载 3、链接hdfs (1࿰…...
数据结构【DS】特殊二叉树
完全二叉树 叶子结点只能出现在最下层和次下层, 最下层的叶子结点集中在树的左部完全二叉树中, 度为1的节点数 0个或者1个【计算时可以用这个快速计算, 配合𝑛0𝑛21】若n为奇数,则分支节点每个都有左右孩子;若n为偶数࿰…...
【Spring Boot】如何在Linux系统中快速启动Spring Boot的jar包
在Linux系统中先安装java的JDK 然后编写下列service.sh脚本,并根据自己的需求只需要修改export的log_path、exec_cmd参数即可 # 配置运行日志输出的路径 export log_path/usr/local/project/study-pro/logs # 当前服务运行的脚本命令 export exec_cmd"nohup /u…...
交替最小二乘法
前置概念导入 协同过滤(Collaborative Filtering):这是一种推荐系统的方法,依据用户之间或物品之间的相似性来进行推荐。协同过滤通常分为两种主要类型:用户基于(user-based)和物品基于…...
封面从这里取好啦
文章目录 前端NPMViteNode.js 后端JavaMavenPython 数据库算法 前端 NPM Vite Node.js 后端 Java Maven Python 数据库 算法...
DM8共享集群DSC初始化DB实例报错
DM8共享集群DSC初始化DB实例报错 问题描述 启动dmcss和dmasmsvr服务启动后,初始化DB实例提示如下报错: [dmdbalocalhost DSC0]$ /dmdb8/dmdbms/bin/dminit control/dmdb8/dmdbms/dsc_config/DSC0/dminit.ini initdb V8 db version: 0x7000c file dm.k…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
