我正在创建一个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>
);
}
}