向 mobx 函数添加去抖动
Adding debounce to mobx function
我正在创建一个 React 应用程序,它在用户键入时向服务器发出搜索请求。我想去抖这个搜索请求,但不确定如何在我现有的代码中实现它:
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 组件调用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);
问题是由于上述原因,我无法直接从 Search
组件调用 debounceSearch
。但是我想去抖动 getPlanets
函数,return 是一个承诺(我不确定 Lodash 去抖动函数是否可以 return 包装函数 return 的承诺)?
您可以在去抖函数中代替在 searchPlanet
操作中为 planets
赋值。
例子
@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>
);
}
}
我正在创建一个 React 应用程序,它在用户键入时向服务器发出搜索请求。我想去抖这个搜索请求,但不确定如何在我现有的代码中实现它:
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 组件调用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);
问题是由于上述原因,我无法直接从 Search
组件调用 debounceSearch
。但是我想去抖动 getPlanets
函数,return 是一个承诺(我不确定 Lodash 去抖动函数是否可以 return 包装函数 return 的承诺)?
您可以在去抖函数中代替在 searchPlanet
操作中为 planets
赋值。
例子
@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>
);
}
}