React 窗口防抖

2023-09-20 03:01:53

假如有这种需求:浏览器的窗口不断缩小变大,此时页面的布局不会自动刷新,需要手动刷新页面才会自适应大小。此时我们立马就会想到使用windows的onresize方法

window.onresize = ()=>{
       // 重新渲染画面
      root.render(<App/>)
}

但是新的问题就会出现这个onresize方法会被调用多次,多次渲染页面会造成资源浪费,于是我们就需要使用防抖函数

防抖函数

简单理解为:降低本来高频率执行函数的执行次数

完整的代码如下:

const root = ReactDom.createRoot(document.getElementById('container'));

//第一次渲染
root.render(
        <APP/>
)

// 窗口防抖
let timeId = null
window.onresize = ()=>{
    debounce(()=>{
        root.render(<App/>)
    },1000,timeId)
}

/**
 * 为什么做到了防抖,并且定时器不会一直执行,场景:多次触发onresize方法胡回调debounce方法:
 *      1. 第一次会有一个定时器执行,如果没执行到timerId = null,后续的回调函数就会一直消除+不创建定时器
 *      2. 直到执行到timerId = null,此时后面回调debounce方法,才会创建。为什么定时器执行,没有一直运行
 *      3. 就是通过回调的频率以及定时器的执行时间,具体就是某一个时间点:T1定时器执行到timerId = null进入等待,而同时回调debounce,删除T1定时器,判断为false没有创建定时器,函数结束。这个时间点大概率就是最后一次调用debounce方法
 * @param func 要执行的函数
 * @param delay 延迟时间
 * @param timerId  定时器ID
 */
function debounce(func, delay,timerId) {
    clearInterval(timerId)
    if(!timerId) {
        timerId = setInterval(() => {
            func()   // 实际可能树未渲染完毕/不渲染 可以使用window.location.reload();刷新页面
            timerId = null
        }, delay);
    }
}

更多推荐

详解WebSocket

目录1.WebSocket是什么?2.WebSocket的通信过程3.WebSocket的报文结构4.JAVA中的WebSocket1.WebSocket是什么?在传统的BS体系中,请求响应一直是单向的,服务器一直扮演的”被动“的角色,浏览器发起请求去访问服务器,服务器才会返回响应。这种单向的模式让实时通信、消息推送一

Vue3项目中使用插槽

前言:此文章仅记录插槽的使用,用于自己后期学习查看。代码实现过程中,HelloWorld为子组件,HomeView为父组件<slot></slot>元素:是一个插槽出口,是写在子组件中的,表示了父组件提供的插槽内容将在子组件哪一个位置展示。默认插槽:HellowVorld组件内容:情况一:HomeView组件不提供插槽

百川的大模型KnowHow

卷友们好,我是rumor。大模型是一个实验工程,涉及数据清洗、底层框架、算法策略等多个工序,每个环节都有很多坑,因此知道如何避坑和技术选型非常重要,可以节省很多算力和时间,说白了就是一摞摞毛爷爷。近期百川智能发布了Baichuan2的7B和13B版本,可能不少卷友被刷屏惯了没有仔细看,他们在放出模型的同时也给了一份技术

vue.js路由如何配置,及全局前置路由守卫(做所有请求登录验证)、路由独享守卫(访问路由前身份验证)

1.编写路由配置文件router.js以及配置全局前置路由守卫和路由独享守卫//路由配置文件//作用是将指定的路由地址切换成对应的模块//eslint-disable-next-lineno-unused-varsimportRouterfrom"vue-router"//eslint-disable-next-lin

HelpLook全新升级!定制AI问答机器人,企业内容中心焕新

一直以来,企业都在努力解决内外部“企业知识管理”问题:从纸质手册发放,转线上电子文档传阅(pdf/ppt/word等),再到整理客户常见问题(FAQ)和内部知识库(wiki),但始终没有找到一套完整方案将“企业知识”很好地集中管理及分享查阅。持续困扰大家的⬇️❌要么是软件系统更新太困难、或搭建费用太昂贵❌要么是没人知道

MybatisX快速生成代码(mybatis plus模板)

文章目录1、概述2、基本使用2.1、插件安装2.2、集成数据库1、概述MybatisX是一款基于IDEA的快速开发插件,为效率而生。在开发过程中,相信大家都遇到过一个数据库内有着十几张或比之更多的数据表的情况。而面对这众多的数据表,实体类、服务类、服务实现类、Mapper接口及其对应的XML文件更是头大,这无疑是成倍增

IPV6真的神

ipv6地址短缺的现实,万物互联的未来<全局可达性>1、路由表更小。地址分配遵循聚类原则,路由表用Entry的路由表示一片子网。2、更强的组播以及流控制。为媒体服务质量QoS。控制提供了良好的网络平台。3、DHCPv6,自动配置地址。使得网(尤其是局域网)的管理更加方便和快捷。4、自带IPSec,端对端安全。在网络层的

通讯网关软件001——利用CommGate X2Access-U实现OPC UA数据转储Access

本文介绍利用CommGateX2ACCESS-U实现从OPCUAServer读取数据并同步转储至ACCESS数据库。CommGateX2ACCESS-U是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。【案例】如下图所示,实现从OPCUAServer实时读取数

linux vim操作汇总

汇总起来,备忘查看~目录1、复制复制一行包括换行符复制光标开始到行末的文本复制光标开始到行首的文本复制当前单词复制单行或多行到指定行后2、粘贴、剪贴3、移动4、删除删除整行删除光标所在行删除光标所在行开始的3行删除一行带复制(当前光标所在行)删除当前行开始的几行(包括当前行)删除到本行行首/行尾删除字符删除单词/符号5

探索Go语言在机器学习领域的应用局限与前景

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

Pytest系列-数据驱动@pytest.mark.parametrize(7)

简介unittest和pytest参数化对比:pytest与unittest的一个重要区别就是参数化,unittest框架使用的第三方库ddt来参数化的而pytest框架:前置/后置处理函数fixture,它有个参数params专门与request结合使用来传递参数,也可以用parametrize结合request来传

热文推荐