【问题标题】:How to perform debounce on onChange react event?如何对 onChange 反应事件执行去抖动?
【发布时间】:2018-09-28 18:48:53
【问题描述】:

当用户在输入字段中键入一些信息时,我在向服务器执行请求时遇到问题。请求已发送,但如果用户快速从字段中删除所有内容,则默认情况下不会发送请求,但会发送最后一封信。所以会发生一些延迟。

例如,当用户快速键入内容并发送一次请求 2 毫秒时,我需要以某种方式实现去抖动

<input type="text"
  placeholder="add"
  className='input'
  onChange={(e) => this.search(e.target.value)}
  onKeyDown={this.handleSearchParam}
  value={keyword}
/>

处理输入的函数

search(text) {
    this.props.onTextInputAdd(text);
    if (text) {
     this.props.onSearchTypeResult(this.props.tab, text)
    } else {
      this.props.onLoadDefaultInfo(this.props.tab);
    }
}

const mapStateToProps = state => ({
  keyword: state.searchReducers.keyword,
});

const mapDispatchToProps = dispatch => ({
  onSearchTypeResult: (tabName, query) => dispatch(actionCreators.loadSearchInfo(tab, tabQuery)),
  onTextInputAdd: keyword => dispatch(actionCreators.addKeyword(keyword)),
});

下面是动作:

const loadSearchResults = (tabName, query) => axios.get(`testurl?query1=${tabName}&query2=${query}`)

export const loadSearchInfo = (tabName, query) => dispatch => {
  loadSearchResults(tabName, query).then(response => {
    const data = { ...response.data };
    dispatch(updateTabInfo(data));
  });
}

export const updateTabInfo = data => ({
  type: LOAD_TAB_INFO,
  payload: data,
});

我尝试使用自定义去抖动,但它不起作用。每次我输入文本时都会触发它,但不是间隔

【问题讨论】:

  • 不,不是,我检查了这些,但事实并非如此
  • 您需要在组件实例上创建一个 debounce 方法,然后从 onchange 中调用该方法。实例方法将使您的 api 调用。是一样的。
  • 所以请为我的案件提供指导。我不知道如何使用您发送给我的链接来做到这一点。这是发送链接和关闭主题的最简单方法
  • 我给你提供了我写的所有代码

标签: javascript reactjs


【解决方案1】:

你可以像这样使用 lodash debounce 方法:

search = _.debounce((text) => {
  this.props.onTextInputAdd(text);
  if (text) {
   this.props.onSearchTypeResult(this.props.tab, text)
  } else {
    this.props.onLoadDefaultInfo(this.props.tab);
  }
}, 300);

然后你就可以像以前一样使用它了。函数搜索将在 300 毫秒后触发。 2ms 可能太快了。

<input type="text"
  placeholder="add"
  className='input'
  onChange={(e) => this.search(e.target.value)}
  onKeyDown={this.handleSearchParam}
  value={keyword}
/>

要使用 lodash,运行 npm install lodash --saveyarn add lodash 然后像这样导入它:

import _ from "lodash";

如果你不想只为 debounce 函数添加 lodash,你可以像这样创建自己的 debounce 函数:

function debounce(func, wait) {
  let timeout;
  return function() {
    const context = this;
    const args = arguments;
    const later = function() {
      timeout = null;
      func.apply(context, args);
    };
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
  };
};

【讨论】:

  • 我知道 lodash,但我想要一些自定义解决方案,无需连接这么大的库
  • 你也可以只导入 debounce 而不是整个 lodash lib...o_o
  • 我知道,但我正在寻找一些非图书馆解决方案
  • 我添加了一个自定义去抖动功能的示例。
  • Lodash 版本具有更多功能,例如最大等待时间、前导和尾随函数调用。它还在每个主要浏览器上进行了测试,并且在每个浏览器上都有非常好的性能。您也 100% 确定 Lodash 版本没有错误。
猜你喜欢
  • 2019-12-21
  • 2021-10-24
  • 2019-01-18
  • 2021-02-11
  • 2019-06-01
  • 2015-06-24
  • 2015-04-12
  • 1970-01-01
相关资源
最近更新 更多