使用debounce进行反应中的搜索输入

时间:2017-12-01 18:39:57

标签: javascript reactjs lodash debounce

我有一个搜索输入,可以动态进行API调用。我想实施去抖动以减少服务器调用量。

typedef struct { ... } BAZ;

class Foo {
  public:
    Foo(BAZ a) { ... }
};

class Bar {
  private:
    Foo foo1;
    Foo foo2;

  public:
    Bar(BAZ a, BAZ b) : foo1(a), foo2(b) { ... }
};

我期待每1秒钟 _debouncedSearch() { debounce(this.props.fetchRoutes(this.state.searchText), 1000); } _updateResults(searchText) { this.setState({searchText}); this._debouncedSearch(); } 。但它仍然在飞行中被召唤。抛出错误:

  

未捕获的TypeError:预期的函数       在辩论时(lodash.js?3387:10334)

     

未捕获错误:抛出了跨源错误。 React无法访问开发中的实际错误对象。

我觉得这个问题必须经常被问到,但解决方案似乎都不适合我。有人可以向我解释一下究竟是什么问题吗?我认为debounce只是一个setTimeOut。

由于

2 个答案:

答案 0 :(得分:4)

constructor(props) {
    super(props);
    this.state = {
      searchText: '',
    };
    this._debouncedSearch = debounce(
      () => this.props.fetchRoutes(this.state.searchText),
      1000
    );
  }

  _updateResults(searchText) {
    this.setState({searchText});
    this._debouncedSearch();
  }

如果有人需要,这是完整的代码!

答案 1 :(得分:2)

_.debounce已经是一个执行函数(函数返回函数)。那么_debouncedSearch应该是类的属性,而不是方法:

  _debouncedSearch=  debounce(() => this.props.fetchRoutes(this.state.searchText), 1000);

而不是:

  _debouncedSearch() {
    debounce(this.props.fetchRoutes(this.state.searchText), 1000);
  }

另外,请注意,_.debounce的第一个参数是函数(() => this.props.fetchRoutes...),而不是直接this.props.fetchRoutes...