SPA 应用中的防抖和节流技术

在 web 前端的开发中,常常需要处理用户的事件,比如滚动到底部加载更多数据、输入框实时搜索等,这些操作会引发频繁地触发回调函数,可能会导致页面出现卡顿或者频繁请求网络资源。为了解决这个问题,我们可以使用防抖和节流技术。

什么是防抖?

防抖的作用是当一个事件被触发时,我们不立即执行回调函数,而是等待一段时间再执行。如果在这段时间内该事件被触发了多次,那么只有最后一次会被执行。

防抖的实现方式有两种:

1. 定时器实现方式

-------- ------------------ ------ -
  --- ----- - -----

  ------ -------- --------- -
    ----- ------- - -----
    --------------------
    ----- - ------------- -- -
      ----------------------- ------
    -- -------
  --
-

----- ------------ - -- -- -
  --------------------- ---------
--

--------------------------------- ---------------------- ------

在这个例子中,debounce 函数接收两个参数,第一个参数是回调函数,第二个参数是等待时间。它返回了一个函数,这个函数作为事件监听的回调函数。

在执行回调函数之前,我们使用了 clearTimeout 清除了之前可能存在的定时器。接着,我们使用 setTimeout 创建一个新的定时器,等待一段时间后执行回调函数。

2. 时间戳实现方式

-------- ------------------ ------ -
  --- ----- - -----
  --- ---- - --

  ------ -------- --------- -
    ----- ------- - -----
    ----- --- - --- -----------------

    -- ---- - ---- - ------ -
      --------------------
      ----- - ------------- -- -
        ----------------------- ------
      -- -------
    - ---- -
      ---- - ----
      ----------------------- ------
    -
  --
-

----- ------------ - -- -- -
  --------------------- ---------
--

--------------------------------- ---------------------- ------

在这个例子中,我们使用了一个变量 last 来记录上一次事件触发的时间戳。在每次事件触发时,我们计算当前时间戳与 last 的差值,如果小于等待时间,那么我们清除之前的定时器,创建新的定时器等待执行;否则,我们立即执行回调函数并更新时间戳。

什么是节流?

节流的作用是当一个事件被触发时,我们每隔一段时间执行一次回调函数。如果在这段时间内事件被触发多次,那么只有第一次会被执行。

节流的实现方式有两种:

1. 定时器实现方式

-------- ------------------ ------ -
  --- ----- - -----

  ------ -------- --------- -
    ----- ------- - -----

    -- -------- -
      ----- - ------------- -- -
        ----------------------- ------
        ----- - -----
      -- -------
    -
  --
-

----- ------------ - -- -- -
  --------------------- ---------
--

--------------------------------- ---------------------- ------

在这个例子中,throttle 函数接收两个参数,第一个参数是回调函数,第二个参数是间隔时间。

在实际执行回调函数之前,我们先判断是否存在定时器,如果不存在,则创建一个定时器并执行回调函数。在回调函数执行完毕之后,我们清除定时器,等待下一次事件触发。

2. 时间戳实现方式

-------- ------------------ ------ -
  --- ---- - --

  ------ -------- --------- -
    ----- ------- - -----
    ----- --- - --- -----------------

    -- ---- - ---- - ------ -
      ---- - ----
      ----------------------- ------
    -
  --
-

----- ------------ - -- -- -
  --------------------- ---------
--

--------------------------------- ---------------------- ------

在这个例子中,我们使用了一个变量 last 来记录上一次回调函数执行的时间戳。在每次事件触发时,我们计算当前时间戳与 last 的差值,如果大于等待时间,那么我们立即执行回调函数并更新时间戳。

使用场景

防抖和节流通常用于处理用户输入、滚动事件等频繁触发的事件。在以下场景中,它们能够提高页面的性能和用户体验:

  • 输入框实时搜索
  • 滚动到底部加载更多数据
  • 鼠标移动事件
  • 窗口大小变化事件

总结

防抖和节流是前端开发中常用的优化技术,它们能够提高页面性能和用户体验。防抖通常用于处理连续多次触发的事件,节流通常用于处理间隔性的触发事件。

在实际开发中,可以根据具体的场景选择合适的实现方式。定时器方式是比较通用的,适用于大部分场景。时间戳方式更加精确,适用于需要控制节奏的场景。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/664863d5d3423812e4701188


猜你喜欢

  • RxJS 中的 retry 和 retryWhen 操作符的使用场景及原理解析

    在 RxJS 中,retry 和 retryWhen 操作符都用于在 Observable 出现错误时进行重试。本文将介绍这两个操作符的使用场景和原理解析。 retry 操作符 retry 操作符会在...

    5 个月前
  • webpack 如何配置处理图片和字体等资源文件?

    在前端开发中,我们经常要处理各种类型的资源文件,比如图片、字体、音频等。而 Webpack 是一个强大的打包工具,它可以帮我们处理这些资源文件,并将它们打包到最终的输出文件中。

    5 个月前
  • 使用 DaemonSet 在 Kubernetes 集群中运行应用程序

    引言 在 Kubernetes 集群中,DaemonSet 是一种非常有用的资源控制方式。它可以确保每个节点上都运行同一个 Pod,而且它们都有相同的标签。在这篇文章中,我们将学习如何在 Kubern...

    5 个月前
  • Vue.js 中使用 watch 监听数据变化的方法及其应用场景

    Vue.js 是一个流行的前端框架,它提供了多种方法来处理数据,在这些方法中,watch 是一种非常有用的方法,它可以监听数据的变化并执行相关的操作。本文将介绍如何使用 watch,并探讨它在实际开发...

    5 个月前
  • 如何在 GraphQL 中处理并发问题

    什么是 GraphQL GraphQL 是一种用于数据处理的查询语言和运行时环境。与 REST API 不同,GraphQL 提供了一种更加灵活的方式来请求和返回数据。

    5 个月前
  • Sass 代码优化之变量和 Mixin

    Sass是一种CSS预处理器,可以让开发者更加方便地编写可复用、可维护的CSS代码。在这篇文章中,我们将探讨如何通过使用 Sass 中的“变量”和“Mixin”来优化前端代码。

    5 个月前
  • ECMAScript 2020 新特性:可选链 (optional chaining) 操作符详细解析

    在过去,访问嵌套属性和方法时,需要考虑到空值和 undefined 的情况。这通常需要一些额外的代码来进行检查和处理,否则程序可能会出现崩溃或错误的结果。为了解决这个问题,ECMAScript 202...

    5 个月前
  • ES9 中的 for-await-of

    在 ES9(ECMAScript 2018)中,正式引入了一个新的关键字 for-await-of,用于处理异步迭代器(AsyncIterator)。相比于普通迭代器,异步迭代器是用于处理异步数据流的...

    5 个月前
  • 异步 Mocha 测试中的超时问题及解决方法

    Mocha 是 JavaScript 中一款广受欢迎的测试框架,它可用于浏览器和 Node.js 环境中。我们都知道,异步编程是 JavaScript 中一个非常重要的应用领域,而 Mocha 也为异...

    5 个月前
  • Socket.io 如何使用 HTTPS 进行加密通讯?

    随着网络安全的重要性日益提高,加密通讯成为了网络应用中不可或缺的一部分。Socket.io 是一个流行的实时通讯库,它支持 HTTP 和 HTTPS 协议。本文将介绍如何使用 HTTPS 协议进行 S...

    5 个月前
  • JVM 的垃圾收集器的性能优化技巧

    在前端开发中,JVM 垃圾收集器是一个重要的话题。垃圾收集器的优化可以大大提升程序性能,减少内存使用,从而提升程序的可靠性和稳定性。本文将介绍 JVM 垃圾收集器的性能优化技巧,并提供实际示例代码。

    5 个月前
  • Flexbox 解决 iOS 上 Safari 中宽度计算错误的问题

    在前端开发中,我们经常会用到宽度自适应的布局方式,如果不处理好,往往会出现在 iOS 上 Safari 中宽度计算错误的问题。这个问题是由于 Safari 计算元素宽度时,会将边框和内边距也计算在内,...

    5 个月前
  • 如何在 ES10 中使用 Optional Chaining 解决 TypeError

    在 JavaScript 编程中,经常会遇到不确定的属性或方法,这时候如果直接访问这些属性或方法可能会导致 TypeError,打乱程序的流程。为了解决这个问题,ES2020(ES10)中引入了 Op...

    5 个月前
  • MongoDB 的 MapReduce 详解

    MongoDB 是当前非关系型数据库中功能最完备、最流行的一种。当我们面对大数据时,如何高效地对其进行处理将是我们亟需解决的问题。在 MongoDB 中,MapReduce 是一种非常常见的用于处理大...

    5 个月前
  • 详解 ECMAScript 2020 中的 globalThis

    什么是 globalThis 在 ECMAScript 2020 中,新增了全局对象 globalThis。它的作用是一个全局性的对象,可以在任何地方都访问到。它与之前的全局对象 window、glo...

    5 个月前
  • 如何在 GraphQL 中使用 JWT 进行跨域认证

    GraphQL 是一种查询语言,其逐渐成为前端开发中广泛使用的数据获取方式。它通过客户端发送查询请求到服务器端,服务器端返回相应的数据,在实现数据传递过程中使用的就是 HTTP 协议。

    5 个月前
  • Polymer 能力升级:更加便捷实现 Web Components

    在 Web 中,组件化已成为开发前端应用的必备技术。Web Components 架构提供了一种标准化的组件化开发方式,可以让我们更加高效地实现复杂的前端应用。 而 Polymer 是一款 Web C...

    5 个月前
  • Koa2 中的静态服务和文件上传技巧

    Koa2 是一个轻量级的 Node.js Web 框架,在 Web 开发中应用广泛。本文将详细介绍如何在 Koa2 中实现静态服务和文件上传的技巧。 静态服务 静态服务就是将指定路径下的静态资源(如 ...

    5 个月前
  • SPA 应用的 SEO 优化实践

    前言 随着前端技术的不断发展,越来越多的网站开始选择使用 SPA(Single Page Application)这种浏览器端渲染的前端技术,让用户能够更加流畅地与网站交互。

    5 个月前
  • Sequelize 中 Op.and 和 Op.or 的区别

    Sequelize 是 Node.js 环境下的一款 ORM 工具,可以方便地实现与数据库的连接和数据操作。Op.and 和 Op.or 是 Sequelize 中用于实现 SQL 中的 AND 与 ...

    5 个月前

相关推荐

    暂无文章