我试图在我的React应用程序中添加去抖动功能,并希望在没有loadash,第三方节点模块等库的情况下完成它。
基本上,在handleSearch
中,我只是调度redux操作,它执行对API端点的查询,并在输入中将值绑定到redux状态的pice,然后调用Redux Search onChange。
我的代码是:
const handleSearch = (e: React.FormEvent<HTMLInputElement>) => {
const value = e.currentTarget.value
dispatch(setSearch(value))
}
字符串
后来作为回报
<input type="text" value={searchQuery} onChange={handleSearch} />
型
我的行动:
export const searchMovies = (category: String, searchQuery: string) => async (dispatch: Dispatch<ControlDispatchTypes>) => {
try {
dispatch({
type: SEARCH_LIST_LOADING
})
let res: any;
if (searchQuery.length >= 3) {
res = await axios.get(`https://api.themoviedb.org/3/search/${category}?api_key=xxxxxxxxxx&query=${searchQuery}`)
}
dispatch({
type: SEARCH_LIST_SUCCESS,
payload: res.data.results
})
} catch (error) {
dispatch({
type: SEARCH_LIST_FAIL
})
}
}
型
和一段减速器用于搜索:
...
case SET_SEARCH:
return {
...state,
search: action.payload
}
case SEARCH_LIST_LOADING:
return {
...state,
searchLoading: false
}
case SEARCH_LIST_SUCCESS:
return {
...state,
searchLoading: false,
items: action.payload
}
case SEARCH_LIST_FAIL:
return {
...state,
searchLoading: false
}
...
型
3条答案
按热度按时间flvtvl501#
我创建了一个自定义钩子来封装去抖动。
字符串
代码中的用法:
型
View on CodeSandbox
或者只使用https://www.npmjs.com/package/use-debounce
vmpqdwk32#
目前还不清楚如何调用
searchMovies()
,但我认为最简单的方法是将调度 Package 在一个已去抖动的回调中。字符串
这是一个简单的解决方案。如果你想获得额外的好处,可以考虑编写一个自定义钩子来拉取包含所有状态和逻辑的内容。它可以清理组件并使电影搜索可重用。
型
这看起来应该是非常标准的东西。我只是将所有的
searchMovies
逻辑移动到一个自定义钩子中。我还添加了屏蔽。由于互联网的复杂性,你不能保证按照请求发出的顺序获得结果。这只是忽略了除了最近的请求之外的所有响应。使用情况与您预期的差不多。
型
7fyelxc53#
我见过React Redux项目使用此资源为项目添加去抖动。
字符串