📜  react中的节流和去抖动以及raf节流有什么区别-Javascript(1)

📅  最后修改于: 2023-12-03 14:47:02.189000             🧑  作者: Mango

React中的节流、去抖动以及RAF节流

JavaScript中的节流和去抖动是常用的优化技术,可以有效地控制事件触发的频率,优化页面性能。在React中,我们经常会用到这些技术来优化组件的渲染和性能。

节流

节流(Throttling)技术可以确保在短时间内连续触发的事件只会执行一次,以控制事件触发的频率。比如说,我们可以在用户滚动页面的时候,通过节流技术来控制滚动事件的触发频率,以防止滚动事件过于频繁的触发,影响页面性能。

React中的节流,一般使用lodash库提供的throttle函数来实现。这个函数接受两个参数,第一个参数是要节流的函数,第二个参数是节流间隔的毫秒数。当事件触发时,throttle函数会判断当前时间是否已经超过了上一次触发时间加上间隔时间,如果是,则调用函数并更新上一次触发时间,如果不是,则不执行函数。

下面是一个示例代码:

import { throttle } from 'lodash';

function handleScroll() {
  // 处理滚动事件
}

const throttledHandleScroll = throttle(handleScroll, 1000);

window.addEventListener('scroll', throttledHandleScroll);

在这个例子中,我们将处理滚动事件的函数handleScroll通过throttle函数进行节流,设置节流间隔为1000毫秒。然后将返回的新函数throttledHandleScroll绑定到window对象的scroll事件中。这样,在用户滚动页面的时候,就可以确保handleScroll函数只会在每隔1000毫秒内执行一次。

去抖动

去抖动(Debouncing)技术可以确保在事件触发后,只有在一定的延迟时间内没有新的事件触发时,才会执行该事件处理函数。这种技术常常被用于搜索框输入的时候,可以让用户在输入完成后再进行搜索操作,避免频繁的搜索请求。

React中的去抖动,一般也使用lodash库提供的debounce函数来实现。这个函数同样接受两个参数,第一个参数是要去抖动的函数,第二个参数是去抖动的延迟时间。当事件触发时,debounce函数会判断在这个延迟时间内是否还有新的事件触发,如果是,则重新开始计时,否则会执行该函数。

下面是一个示例代码:

import { debounce } from 'lodash';

function handleInput() {
  // 处理输入事件
}

const debouncedHandleInput = debounce(handleInput, 500);

inputElement.addEventListener('input', debouncedHandleInput);

在这个例子中,我们将处理输入事件的函数handleInput通过debounce函数进行去抖动,设置延迟时间为500毫秒。然后将返回的新函数debouncedHandleInput绑定到inputElement元素的input事件中。这样,在用户进行输入操作的时候,就可以确保handleInput函数只会在用户输入完成后500毫秒内执行一次。

RAF节流

RAF节流(RAF Throttling)技术是一种更高效的节流技术,可以通过requestAnimationFrame函数来实现。RAF节流的原理是将需要进行节流的函数封装在在一个RAF循环中,每次只在RAF循环中执行一次函数。

下面是一个示例代码:

function handleScroll() {
  // 处理滚动事件
}

let ticking = false;

function requestTick() {
  if (!ticking) {
    requestAnimationFrame(function() {
      handleScroll();
      ticking = false;
    });
  }
  ticking = true;
}

window.addEventListener('scroll', requestTick);

在这个例子中,我们定义了一个handleScroll函数,用于处理滚动事件。然后定义了一个requestTick函数,用于在RAF循环中执行handleScroll函数。在requestTick函数中,我们首先判断ticking变量是否为false,如果是,则调用requestAnimationFrame函数,将handleScroll函数添加到RAF循环中。然后将ticking变量设置为true,表示该函数已经被添加到RAF中。如果在下一个RAF循环中,ticking变量仍然为true,则不会再次添加该函数到RAF中,直到ticking变量为false,才会再次添加。

RAF节流相比于一般的节流和去抖动技术,具有更高的效率和更好的用户体验。它可以保证在RAF循环中只会执行一次函数,避免了其他节流技术中可能会出现的重复执行问题。同时,RAF节流会在垂直同步期间执行,提高了动画流畅性,避免了抖动问题。