防流、节抖、重绘、回流原理,以及实现方法和区别
防流、节抖、重绘、回流原理,以及实现方法和区别,还有就是为什么会出现这种情况?
防抖(Debounce)
原理
防抖就像是你坐电梯,如果你一直不停地按开门按钮,电梯不会每次都开门,而是等你停止按按钮一段时间后,才会执行开门动作。在前端里,当一个事件被频繁触发时,防抖会让事件处理函数在你停止触发一段时间后才执行。比如在搜索框输入联想功能中,用户快速输入文字时,我们不希望每次输入都去请求服务器获取联想词,而是等用户停止输入一小段时间后,再去请求,这样可以减少不必要的请求。
实现方法
function debounce(func, delay) {let timer;return function () {const context = this;const args = arguments;// 每次触发事件时,清除之前的定时器clearTimeout(timer); // 设置新的定时器timer = setTimeout(() => {func.apply(context, args);}, delay);};
}// 使用示例
const input = document.getElementById('searchInput');
input.addEventListener('input', debounce(function () {console.log('执行搜索操作');
}, 300));
出现原因
在一些场景中,用户可能会频繁触发某个事件,比如搜索框输入、窗口缩放等。如果每次触发都执行相应的处理函数,会导致性能问题,比如产生大量的网络请求、进行不必要的计算等。防抖可以避免这些问题,提高性能和用户体验。
节流(Throttle)
原理
节流就像你家的水龙头,你把水流调到一定大小,不管你怎么拧水龙头,在一段时间内,水的流量是固定的。在前端里,当一个事件被频繁触发时,节流会让事件处理函数在一定时间内只执行一次。比如在滚动加载数据的场景中,用户滚动页面时,我们不希望滚动一点就加载一次数据,而是每隔一段时间加载一次。
实现方法
function throttle(func, limit) {let inThrottle;return function () {const context = this;const args = arguments;if (!inThrottle) {func.apply(context, args);inThrottle = true;// 设置定时器,一段时间后重置状态setTimeout(() => inThrottle = false, limit);}};
}// 使用示例
window.addEventListener('scroll', throttle(function () {console.log('滚动加载数据');
}, 200));
出现原因
和防抖类似,在高频触发事件的场景中,为了避免处理函数被过于频繁地执行,导致性能问题,比如滚动加载数据时,如果每次滚动都加载数据,会造成大量的网络请求和数据处理,影响性能。节流可以控制处理函数的执行频率,保证性能稳定。
重绘(Repaint)
原理
重绘就像是你给家里的家具重新刷漆,家具的位置和大小不变,只是外观变了。在网页里,当一个元素的外观发生变化,但没有影响到布局信息(如宽高、位置)时,浏览器会将这个元素的外观重新绘制一遍,这就是重绘。比如改变元素的颜色、透明度等样式。
实现方法
在 CSS 里直接修改元素的外观样式就会触发重绘,例如:
/* HTML 中有一个 id 为 myElement 的元素 */
#myElement {color: red; /* 初始颜色为红色 */
}/* 使用 JavaScript 修改颜色,触发重绘 */
const element = document.getElementById('myElement');
element.style.color = 'blue';
出现原因
当我们通过 CSS 或 JavaScript 修改元素的外观样式时,浏览器需要更新元素在屏幕上的显示,所以会触发重绘。
回流(Reflow,也叫重排)
原理
回流就像是你重新布置家里的家具,改变了家具的位置和大小。在网页里,当一个元素的布局信息(如宽高、位置、边距等)发生变化时,浏览器需要重新计算元素的位置和大小,然后将它们重新排列在页面上,这就是回流。回流的开销比重绘大,因为它不仅要重新绘制元素,还要重新计算布局。
实现方法
修改元素的布局信息会触发回流,例如:
const element = document.getElementById('myElement');
// 修改元素的宽度,触发回流
element.style.width = '200px';
出现原因
当我们通过 CSS 或 JavaScript 修改元素的布局信息时,浏览器需要重新计算整个页面的布局,所以会触发回流。像添加或删除元素、修改元素的尺寸、改变字体大小等操作都可能导致回流。
区别
- 防抖和节流:防抖是在用户停止触发事件一段时间后才执行处理函数,强调的是“停止触发后的延迟执行”;节流是在一定时间内只执行一次处理函数,强调的是“固定时间间隔执行”。
- 重绘和回流:重绘只涉及元素外观的重新绘制,不改变布局信息;回流涉及元素布局信息的重新计算和排列,开销比重绘大。而且回流通常会触发重绘,因为布局改变后,元素的外观也需要重新绘制。
那么,在vue和react中如何进行防流、节抖、重绘、回流原理,以及实现方法和区别
防抖(Debounce)
原理
想象你在电梯里,要是一直狂按开门按钮,电梯不会每次都开门,而是等你停手一小段时间后,才会执行开门动作。在前端里,防抖就是处理频繁触发事件的这种情况,比如搜索框输入,用户快速打字时,我们不想每次按键都去做一些操作(像请求服务器获取联想词),而是等用户停了一小会儿,再去执行对应的操作。
在 Vue 中的实现方法
在 Vue 里,我们可以借助第三方库 lodash 来实现防抖。比如在一个搜索框输入时使用防抖:
<template><div><input v-model="keyword" @input="debouncedSearch" placeholder="搜索内容"></div>
</template><script>
import { debounce } from 'lodash';export default {data() {return {keyword: ''};},created() {// 创建防抖函数,300 毫秒内没有再次触发才执行搜索this.debouncedSearch = debounce(this.search, 300);},methods: {search() {console.log('执行搜索:', this.keyword);// 这里可以放实际的搜索请求代码}}
};
</script>
这里在 created 生命周期里用 lodash 的 debounce 函数把 search 方法包装成了防抖函数 debouncedSearch,这样输入框输入事件触发时,只有停顿 300 毫秒才会执行搜索操作。
在 React 中的实现方法
在 React 里同样可以用 lodash 来做防抖。示例如下:
import React, { useState } from'react';
import { debounce } from 'lodash';function SearchInput() {const [keyword, setKeyword] = useState('');const search = () => {console.log('执行搜索:', keyword);// 这里可以放实际的搜索请求代码};const debouncedSearch = debounce(search, 300);const handleInputChange = (e) => {setKeyword(e.target.value);debouncedSearch();};return (<inputtype="text"value={keyword}onChange={handleInputChange}placeholder="搜索内容"/>);
}export default SearchInput;
这里创建了一个 debouncedSearch 防抖函数,当输入框内容改变时,调用这个防抖函数,从而实现防抖效果。
出现原因
在很多场景下,用户可能会快速频繁地触发事件,比如输入框输入、窗口缩放等。如果每次触发都执行对应的操作,会造成性能问题,像产生大量不必要的网络请求或者进行重复计算,所以需要防抖来避免这些问题。
节流(Throttle)
原理
节流就像家里的水龙头,你把水流大小固定好,不管你怎么拧水龙头,在一段时间内,水的流量是固定的。在前端里,当一个事件被频繁触发时,节流会让事件处理函数在一定时间内只执行一次。比如滚动加载数据,我们不想滚动一点就加载一次数据,而是每隔一段时间加载一次。
在 Vue 中的实现方法
<template><div @scroll="throttledScroll"><!-- 这里放滚动内容 --></div>
</template><script>
import { throttle } from 'lodash';export default {created() {// 创建节流函数,每 200 毫秒最多执行一次滚动处理this.throttledScroll = throttle(this.handleScroll, 200);},methods: {handleScroll() {console.log('滚动事件触发');// 这里可以放滚动加载数据的代码}}
};
</script>
使用 lodash 的 throttle 函数把 handleScroll 方法包装成节流函数 throttledScroll,这样滚动事件触发时,每 200 毫秒最多执行一次 handleScroll。
在 React 中的实现方法
import React from'react';
import { throttle } from 'lodash';function ScrollComponent() {const handleScroll = () => {console.log('滚动事件触发');// 这里可以放滚动加载数据的代码};const throttledScroll = throttle(handleScroll, 200);return (<div onScroll={throttledScroll}>{/* 这里放滚动内容 */}</div>);
}export default ScrollComponent;
同样借助 lodash 的 throttle 函数创建节流函数,绑定到滚动事件上。
出现原因
和防抖类似,在高频触发事件的场景中,为了避免处理函数被过于频繁地执行,导致性能问题,比如滚动加载数据时,如果每次滚动都加载数据,会造成大量的网络请求和数据处理,影响性能,所以需要节流来控制执行频率。
重绘(Repaint)
原理
重绘就好比你给家里的家具重新刷漆,家具的位置和大小不变,只是外观变了。在网页里,当一个元素的外观发生变化,但没有影响到布局信息(像宽高、位置)时,浏览器会把这个元素的外观重新画一遍,这就是重绘。比如改变元素的颜色、透明度等样式。
在 Vue 和 React 中出现的情况及处理
在 Vue 和 React 里,只要修改了元素的外观样式,就可能触发重绘。比如在 Vue 中:
<template><div :style="{ color: textColor }">这是一段文字</div><button @click="changeColor">改变颜色</button>
</template><script>
export default {data() {return {textColor: 'black'};},methods: {changeColor() {this.textColor = 'red';}}
};
</script>
点击按钮改变文字颜色,就会触发重绘。在 React 里也是类似的,通过修改样式来触发重绘:
import React, { useState } from'react';function RepaintExample() {const [textColor, setTextColor] = useState('black');const changeColor = () => {setTextColor('red');};return (<div><div style={{ color: textColor }}>这是一段文字</div><button onClick={changeColor}>改变颜色</button></div>);
}export default RepaintExample;
出现原因
当我们通过 CSS 或 JavaScript 修改元素的外观样式时,浏览器需要更新元素在屏幕上的显示,所以会触发重绘。
回流(Reflow,也叫重排)
原理
回流就像是你重新布置家里的家具,改变了家具的位置和大小。在网页里,当一个元素的布局信息(像宽高、位置、边距等)发生变化时,浏览器需要重新计算元素的位置和大小,然后把它们重新排列在页面上,这就是回流。回流的开销比重绘大,因为它不仅要重新画元素,还要重新算布局。
在 Vue 和 React 中出现的情况及处理
在 Vue 里,比如动态修改元素的宽度就可能触发回流:
<template><div :style="{ width: boxWidth + 'px' }">这是一个盒子</div><button @click="changeWidth">改变宽度</button>
</template><script>
export default {data() {return {boxWidth: 100};},methods: {changeWidth() {this.boxWidth = 200;}}
};
</script>
在 React 中:
import React, { useState } from'react';function ReflowExample() {const [boxWidth, setBoxWidth] = useState(100);const changeWidth = () => {setBoxWidth(200);};return (<div><div style={{ width: `${boxWidth}px` }}>这是一个盒子</div><button onClick={changeWidth}>改变宽度</button></div>);
}export default ReflowExample;
点击按钮改变盒子宽度,就会触发回流。
出现原因
当我们通过 CSS 或 JavaScript 修改元素的布局信息时,浏览器需要重新计算整个页面的布局,所以会触发回流。像添加或删除元素、修改元素的尺寸、改变字体大小等操作都可能导致回流。
区别
- 防抖和节流:防抖是等用户停止触发事件一段时间后才执行处理函数,强调“停止触发后的延迟执行”;节流是在一定时间内只执行一次处理函数,强调“固定时间间隔执行”。
- 重绘和回流:重绘只改元素外观,不涉及布局信息改变;回流涉及元素布局信息重新计算和排列,开销比重绘大,而且回流通常会引发重绘。
相关文章:
防流、节抖、重绘、回流原理,以及实现方法和区别
防流、节抖、重绘、回流原理,以及实现方法和区别,还有就是为什么会出现这种情况? 防抖(Debounce) 原理 防抖就像是你坐电梯,如果你一直不停地按开门按钮,电梯不会每次都开门,而是…...
通义灵码插件安装入门教学 - IDEA(安装篇)
在开发过程中,使用合适的工具和插件可以极大地提高我们的工作效率。今天,我们将详细介绍如何在 IntelliJ IDEA 中安装并配置通义灵码插件,这是一款旨在提升开发者效率的实用工具。无论你是新手还是有经验的开发者,本文都将为你提供…...
ES、OAS、ERP、电子政务、企业信息化(高软35)
系列文章目录 ES、OAS、ERP、电子政务、企业信息化 文章目录 系列文章目录前言一、专家系统(ES)二、办公自动化系统(OAS)三、企业资源规划(ERP)四、典型信息系统架构模型1.政府信息化和电子政务2.企业信息…...
用大白话解释缓存Redis +MongoDB是什么有什么用怎么用
Redis和MongoDB是什么? Redis:像你家的“小冰箱”,专门存高频使用的食物(数据)。它是基于内存的键值数据库,读写速度极快(每秒超10万次操作)。比如你每次打开手机App,用…...
华为数通Datacom认证体系详解:从HCIA到HCIE的进阶路径
华为数通Datacom(Data Communication)课程是华为认证体系中的核心方向之一,聚焦企业网络通信与数据通信技术,适合从事网络规划、部署和运维的人员。 一、数通Datacom课程体系 华为数通Datacom认证分为 三个级别,逐级递…...
PyTorch 的 nn.NLLLoss:负对数似然损失全解析
PyTorch 的 nn.NLLLoss:负对数似然损失全解析 在 PyTorch 的损失函数家族中,nn.NLLLoss(Negative Log Likelihood Loss,负对数似然损失)是一个不太起眼但非常重要的成员。它经常跟 LogSoftmax 搭配出现,尤…...
《数据安全架构设计与实战》的目录
《数据安全架构设计与实战》的目录如下1: 第一部分 安全架构基础 第 1 章 架构第 2 章 安全架构 2.1 什么是安全2.2 为什么使用 “数据安全” 这个术语2.3 什么是安全架构2.4 安全架构 5A 方法论2.5 安全架构 5A 与 CIA 的关系 第二部分 产品安全架构 …...
python-leetcode-删除并获得点数
740. 删除并获得点数 - 力扣(LeetCode) 解法 1:动态规划(O(n) 时间,O(n) 空间) class Solution:def deleteAndEarn(self, nums: List[int]) -> int:if not nums:return 0# 统计每个数的贡献points Cou…...
助力DeepSeek私有化部署服务:让企业AI落地更简单、更安全
在数字化转型的浪潮中,越来越多的企业选择私有化部署AI技术,以保障数据安全、提升业务效率并实现自主可控。DeepSeek作为行业领先的AI开源技术,其技术可以支持企业私有化部署,企业需要一站式服务私有化部署,涵盖硬件采…...
Android JNI开发指南
了解Android JNI开发。首先,我需要回忆一下JNI的基本概念和作用。JNI允许Java代码与本地代码(如C/C)交互,这在需要高性能或者使用现有C/C库时非常有用。 接下来,我应该整理开发步骤。用户可能想知道如何开始ÿ…...
【每天认识一个漏洞】url重定向
🌝博客主页:菜鸟小羊 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 常见应用场景 主要是业务逻辑中需要进行跳转的地方。比如登录处、注册处、访问用户信息、订单信息、加入购物车、分享、收…...
纯代码实战--用Deepseek+SQLite+Ollama搭建数据库助手
如何用Python调用本地模型实现DeepSeek提示词模板:一步步教你高效解决13种应用场景 从零到一:纯代码联合PyQt5、Ollama、Deepseek打造简易版智能聊天助手 用外接知识库武装大模型:基于Deepseek、Ollama、LangChain的RAG实战解析 纯代码实战–…...
2025 最新版鸿蒙 HarmonyOS 开发工具安装使用指南
为保证 DevEco Studio 正常运行,建议电脑配置满足如下要求: Windows 系统 操作系统:Windows10 64 位、Windows11 64 位内存:16GB 及以上硬盘:100GB 及以上分辨率:1280*800 像素及以上 macOS 系统 操作系统…...
日期时间 API
日期时间 API (java.time 包),旨在解决旧版 java.util.Date 和 java.util.Calendar 存在的一些设计缺陷,比如线程不安全、时区处理不一致等问题。新 API 基于 ISO 8601 标准,更加直观、简洁,且支持时区和区域设置。主要类有&#…...
AI数字人开发,引领科技新潮流
引言 随着人工智能技术的迅猛发展,AI 数字人在影视娱乐、客户服务、教育及医疗等多个领域展现出巨大的潜力。本文旨在为开发者提供一份详细的 AI 数字人系统开发指南,涵盖从基础架构到实现细节的各个方面,包括人物建模、动作生成、语音交互、…...
领域驱动设计:事件溯源架构简介
概述 事件溯源架构通常由3种应用设计模式组成,分别是:事件驱动(Event Driven),事件溯源(Event Source)、CQRS(读写分离)。这三种应用设计模式常见于领域驱动设计(DDD)中,但它们本身是一种应用设计的思想,不仅仅局限于DDD,每一种模式都可以单独拿出来使用。 E…...
自定义类加载器国密版本冲突
自定义类加载器国密版本冲突 对接三方接口经常使用到国密加密包(bcprov),此时系统已经引入了1.5版本,而三方提供的sdk中引用了1.6版版本,两个版本有冲突,如果系统加载到1.5版本的将会加密异常(各种奇怪的异…...
Debian 包版本号比较规则详解
1 版本号组成结构 Debian 版本号格式为:[epoch:]upstream_version[-debian_revision] 示例:2:1.18.3~betadfsg1-5b1 组件说明比较优先级Epoch冒号前的数字 (2:)最高Upstream主版本 (1.18.3~betadfsg1)中Debian修订号减号后的部分 (5)最…...
STM32之影子寄存器
预分频寄存器计数到一半的时候,改变预分频值,此时不会立即生效,会等到计数完成,再从影子寄存器即预分频缓冲器里装载修改的预分频值。 如上图,第一行是内部时钟72M,第二行是时钟使能,高电平启动…...
x64汇编下过程参数解析
简介 好久没上博客, 突然发现我的粉丝数变2700了, 真是这几个月涨的粉比我之前好几年的都多, 于是心血来潮来写一篇, 记录一下x64下的调用约定(这里的调用约定只针对windows平台) Windows下的x64程序的调用约定有别于x86下的"stdcall调用约定"以及"cdecl调用约…...
Blender调整最佳渲染清晰度
1.渲染采样调高 512 2.根据需要 开启AO ,开启辉光 , 开启 屏幕空间反射 3.调高分辨率 4096x4096 100% 分辨率是清晰度的关键 , 分辨率不高 , 你其他参数调再高都没用 4.世界环境开启体积散射 , 可以增强氛围感 5.三点打光法 放在模型和相机45夹角上 白模 白模带线条 成品...
TSMaster【第二十篇:华山论剑——知识图谱全览】
(三维思维导图「独孤九剑总诀式」技能树「经脉贯通」检测系统未来技术「武学秘境」预测) 【武侠场景导入】光明顶秘道惊变 明教光明顶密道中,张无忌面对错综复杂的甬道体系,以乾坤大挪移心法贯通九阳神功与太极拳剑,终成武林至尊。今时今日,三电工程师面对庞杂的TSMaste…...
神经性手抖是一种常见的症状
神经性手抖是一种常见的症状,表现为手部无意识或不受控制地颤抖。为了预防神经性手抖,我们可以采取以下几种方法: 1. 放松身心:压力和焦虑是导致神经性手抖的常见原因之一。因此,学会放松身心是预防手抖的关键。可以通…...
前端项目打包生成 JS 文件的核心步骤
前端项目打包生成 JS 文件的过程通常涉及以下核心步骤,以主流工具(如 Webpack、Vite、Rollup 等)为例: 一、项目准备阶段 项目结构 源代码目录(如 src/)包含 JS/TS、CSS、图片等资源配置文件(pa…...
金融支付行业技术侧重点
1. 合规问题 第三方支付系统的平稳运营,严格遵循《非银行支付机构监督管理条例》的各项条款是基础与前提,其中第十八条的规定堪称重中之重,是支付机构必须牢牢把握的关键准则。 第十八条明确指出,非银行支付机构需构建起必要且独…...
支付宝 IoT 设备入门宝典(下)设备经营篇
上篇介绍了支付宝 IoT 设备管理,但除了这些基础功能外,商户还可以利用设备进行一些运营动作,让设备更好的帮助自己,本篇就会以设备经营为中心,介绍常见的设备相关能力和问题解决方案。如果对上篇感兴趣,可以…...
mac电脑中使用无线诊断.app查看连接的Wi-Fi带宽
问题 需要检查连接到的Wi-Fi的AP硬件支持的带宽。 步骤 1.按住 Option 键,然后点击屏幕顶部的Wi-Fi图标;2.从下拉菜单中选择 “打开无线诊断”(Open Wireless Diagnostics);3.你可能会看到一个提示窗口,…...
企业微信里可以使用的企业内刊制作工具,FLBOOK
如何让员工及时了解公司动态、行业资讯、学习专业知识,并有效沉淀企业文化?一份高质量的企业内刊是不可或缺的。现在让我来教你该怎么制作企业内刊吧 1.登录与上传 访问FLBOOK官网,注册账号后上传排版好的文档 2.选择模板 FLBOOK提供了丰富的…...
网络变压器的主要电性参数与测试方法(2)
Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(2).. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法: 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…...
深度学习笔记17-马铃薯病害识别(VGG-16复现)
目录 一、 前期准备 1. 设置GPU 2. 导入数据 二、手动搭建VGG-16模型 1. 搭建模型 三、 训练模型 1. 编写训练函数 3. 编写测试函数 4. 正式训练 四、 结果可视化 1. Loss与Accuracy图 2. 指定图片进行预测 3. 模型评估 前言 🍨 本文为🔗365天深度学习训…...
