【问题标题】:Lodash debounce isn't preventing dispatch as expected onChangeLodash debounce 不会像预期的那样阻止调度 onChange
【发布时间】:2020-09-24 12:01:17
【问题描述】:

目前,我有一个复选框列表,onChange 将向服务器发出请求以返回一些数据。但是,我使用 lodash debounce 仅在用户在一定时间后停止选择多复选框时尝试发出请求。

目前,它会阻止立即调度,但会在达到去抖时间后调度,而不是在用户停止与复选框交互时调度。有人能告诉我如何实现这一目标或我哪里出错了吗?

谢谢!

import React, { useContext, useState, useEffect } from 'react';
import { Context } from '../../pages/search-and-results/search-and-results.js';
import debounce from 'lodash.debounce';

const FilterCheckbox = ({ name, value }) => {
  const checkboxContext = useContext(Context);
  const [checked, setChecked] = useState(false);
  const debounceCheckboxSelection = debounce(dispatchCheckbox, 2000);

  function dispatchCheckbox(type, value) {
    checkboxContext.dispatch({
      type: type,
      payload: { value }
    });
  }

  return (
    <Label>
      <FilterInput
        type="checkbox"
        name={name}
        onChange={() => {
          if (checked) {
            debounceCheckboxSelection('REMOVE_SELECTED_PROPERTY_TYPE', value);
            setChecked(false);
            return;
          }
          debounceCheckboxSelection('SET_SELECTED_PROPERTY_TYPE', value);
          setChecked(true);
        }}
        checked={checked}
      />
      {name}
    </Label>
  );
};

export default FilterCheckbox;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

【问题讨论】:

    标签: reactjs debounce debouncing


    【解决方案1】:

    每次重新渲染时都会创建您的去抖动函数,以修复它:

    您可以使用 useRef 返回一个 ref 对象,该对象将在组件的整个生命周期内持续存在:

    const debounceCheckboxSelection = useRef(
      debounce(dispatchCheckbox, 2000);
    )
    

    并使用debounceCheckboxSelection.current访问其初始值:

    <FilterInput
      type="checkbox"
      name={name}
      onChange={() => {
        if (checked) {
          debounceCheckboxSelection.current('REMOVE_SELECTED_PROPERTY_TYPE', value);
          setChecked(false);
          return;
        }
        debounceCheckboxSelection.current('SET_SELECTED_PROPERTY_TYPE', value);
        setChecked(true);
      }}
      checked={checked}
    />
    

    或者您可以使用useCallback 将返回回调的记忆版本,该回调仅在其任何依赖项更改时才会更改:

    const debounceCheckboxSelection = useCallback(
      () => debounce(dispatchCheckbox, 2000), []
    )
    

    【讨论】:

    • 嗨@Ajeet,非常感谢您的回复,我已尝试实施您上面提到的更改,由于某种原因,它似乎仍然在达到去抖动时间后发送,而不是在用户已停止检查/取消检查。 :(
    • dispatchCheckbox 将在复选框上的 onChange 事件 2 秒后被调用。如果用户在 2 秒前更改复选框选择,dispatchCheckbox 将在第二次 onChange 的 2 秒后被调用。不是这样吗?
    • 无论您是否继续快速选择多个复选框,它似乎都会在 2 秒后被调用,看起来它似乎调度并忽略了去抖动?
    • 当然,让我模拟一个 - 非常感谢您到目前为止帮助我!
    • 你是对的。我想我会接受你关于某种“保存”按钮的建议,这会使事情变得更容易 - 非常感谢你帮助我解决 Ajeet。祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 2016-03-07
    • 2022-01-11
    • 2020-07-21
    • 2018-08-04
    • 2019-08-04
    • 2014-05-16
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多