javascript – 为mobx功能添加去抖动

我正在创建一个React App,它在用户输入时向服务器发出搜索请求.我想去除这个搜索请求,但不知道如何在我现有的代码中实现它:

Mobx商店:

// function which initiates a fetch request to server
@action searchPlanet = async (event) => {
            this.searchString = event.target.value;
            this.planets = await getPlanets(this.searchString);
        }

React Component调用searchPlanet:

const Search = observer(({ store }) => {
    const planetList = toJS(store.planets);
    return (
        <div>
            <div className={style.search_container}>
                <input type="text" id="search" onChange={e => store.searchPlanet(e)} value={store.searchString} placeholder="search planet" />
            </div>
        </div>
    )
})

我不能直接在onChange上使用debounce功能,因为这也会延迟搜索组件的重新呈现,因此用户将在一段时间后看到键入的文本.但是我无法弄清楚如何在我的商店中实现去抖功能?我可以这样做:

import _ from lodash

@action searchPlanet = async (event) => {
            this.searchString = event.target.value;
            this.planets = await getPlanets(this.searchString);
        }

debounceSearch = _.debounce(this.searchPlanet, 250);

这个问题是由于上面提到的原因,我不能直接从搜索组件调用debounceSearch.但是我想去抖动getPlanets函数,它返回一个promise(我不确定Lodash debounce函数是否可以返回包装函数返回的promise)?

解决方法:

您可以在debounced函数中执行此操作,而不是在searchPlanet操作中为行星指定值.

@observer
class App extends Component {
  @observable value = "";
  @observable query = "";

  onChange = action(event => {
    const { value } = event.target;
    this.value = value;
    this.search(value);
  });

  search = debounce(action(query => {
    this.query = query;
  }), 250);

  render() {
    const { value, query, onChange } = this;
    return (
      <div>
        <input value={value} onChange={onChange} />
        <div>{query}</div>
      </div>
    );
  }
}
上一篇:推入数组时,MobX不更新React视图


下一篇:javascript – 没有React可以使用MobX吗?