• React 窗口防抖


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

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

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

    防抖函数

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

    完整的代码如下:

    1. const root = ReactDom.createRoot(document.getElementById('container'));
    2. //第一次渲染
    3. root.render(
    4. <APP/>
    5. )
    6. // 窗口防抖
    7. let timeId = null
    8. window.onresize = ()=>{
    9. debounce(()=>{
    10. root.render(<App/>)
    11. },1000,timeId)
    12. }
    13. /**
    14. * 为什么做到了防抖,并且定时器不会一直执行,场景:多次触发onresize方法胡回调debounce方法:
    15. * 1. 第一次会有一个定时器执行,如果没执行到timerId = null,后续的回调函数就会一直消除+不创建定时器
    16. * 2. 直到执行到timerId = null,此时后面回调debounce方法,才会创建。为什么定时器执行,没有一直运行
    17. * 3. 就是通过回调的频率以及定时器的执行时间,具体就是某一个时间点:T1定时器执行到timerId = null进入等待,而同时回调debounce,删除T1定时器,判断为false没有创建定时器,函数结束。这个时间点大概率就是最后一次调用debounce方法
    18. * @param func 要执行的函数
    19. * @param delay 延迟时间
    20. * @param timerId 定时器ID
    21. */
    22. function debounce(func, delay,timerId) {
    23. clearInterval(timerId)
    24. if(!timerId) {
    25. timerId = setInterval(() => {
    26. func() // 实际可能树未渲染完毕/不渲染 可以使用window.location.reload();刷新页面
    27. timerId = null
    28. }, delay);
    29. }
    30. }

  • 相关阅读:
    C++_红黑树
    利用OpenCV的函数imwrite()保存图像到硬盘
    CCF CSP认证历年题目自练Day45
    【C++ 科学计算】线性代数和科学计算库 Armadillo 构建安装
    ecology修改Reisn的JDK目录
    硬件工程师入门和进阶
    以太坊 CALL 数据解析【ETH】
    “对症下药”,高效控价——控价方法详解
    【Python零基础入门篇 · 33】:进程的基础操作、进程间的通信-Queue、进程池的构建
    Mysql-SQL优化
  • 原文地址:https://blog.csdn.net/m0_64332518/article/details/133054754