使用 lodash 的节流不使用 ReactJS 进行节流

Posted

技术标签:

【中文标题】使用 lodash 的节流不使用 ReactJS 进行节流【英文标题】:Throttle with lodash isn't throttling using ReactJS 【发布时间】:2021-11-30 22:15:59 【问题描述】:

所以我有这个代码

import React,  createRef, useEffect, useCallback, useState  from 'react';
import  throttle  from 'lodash';
import  setProgress  from '../../helpers/markersApi';

const EXECUTE_EVERY_THIRTY_SECONDS = 30 * 1000; 
const throttledSetProgress = throttle(setProgress, EXECUTE_EVERY_THIRTY_SECONDS);

const Player = () => 

  const updateProgress = (playerPosition, asset, immediateUpdate = false) => 
    if (asset.type !== 'EPG_PROGRAM') 
      const 
        id, episode,
       = asset;
      const type = (episode && episode.episodeNumber) ? 'episode' : 'movie';

      if (immediateUpdate) 
        console.log('IMMEDIATE');
        // Cancel possible future invocations and set progress immediately
        throttledSetProgress.cancel();
        setProgress(id, playerPosition, type);
       else 
        throttledSetProgress(id, playerPosition, type);
      
    
  ;

  useEffect(() => 
    updateProgress(position, playerAsset);
  , [position, playerAsset]);

问题是节流不起作用,因为每次调用 useEffect 时它都会运行 setProgress。有什么想法吗?

【问题讨论】:

你能提供整个组件吗,好像你在组件外使用了useEffect。 【参考方案1】:

节流函数在重新渲染之间应该保持不变,这意味着我们必须使用 React 的 UseCallback 函数。这可以通过更改 throttledSetProgress 来实现:

const throttledSetProgress = throttle(setProgress, EXECUTE_EVERY_THIRTY_SECONDS);

到这里:

const throttledSetProgress = useCallback(
  throttle(setProgress, EXECUTE_EVERY_THIRTY_SECONDS),
  [],
);

(别忘了从 'react' 导入 useCallback)

【讨论】:

以上是关于使用 lodash 的节流不使用 ReactJS 进行节流的主要内容,如果未能解决你的问题,请参考以下文章

用lodash使用防抖节流

在 ReactJS 上使用 Lodash 对映射列表进行排序

43.Vue中使用Lodash 节流(throttle)和防抖(debounce)函数

vue中element中的input框和laod中防抖和节流结合使用(性能优化)使用lodash相关方法

vue中使用防抖节流

lodash 的 防抖(debounce)和节流(throttle)