如何添加去抖动以响应 onChange Input

sev*_*ven 7 javascript typescript reactjs redux

我正在尝试向我的 React 应用程序添加去抖动功能,并且想要在没有像 loadash、3rd 方节点模块等库的情况下进行。我尝试在那里发布一些帖子,但没有任何效果。

基本上,handleSearch我只是分派 redux 操作,该操作执行对 API 端点的查询,并在输入绑定值中将值绑定到 redux 状态并调用 handleSearch onChange。

我的代码是:

const handleSearch = (e: React.FormEvent<HTMLInputElement>) => {
        const value = e.currentTarget.value
        dispatch(setSearch(value))
    }
Run Code Online (Sandbox Code Playgroud)

后来作为回报

<input type="text" value={searchQuery} onChange={handleSearch} />
Run Code Online (Sandbox Code Playgroud)

另外,我的操作:

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
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

和一块用于搜索的减速器:

...
 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
            }
...
Run Code Online (Sandbox Code Playgroud)

小智 1

我见过 React Redux 项目使用此资源向其项目添加去抖功能。它取自https://davidwalsh.name/javascript-debounce-function

export const debounce = (func, wait, immediate) => {
    let timeout;
    return function () {
        const later = () => {
            timeout = null;
            if (!immediate) func.apply(this, arguments);
        };
        const callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(this, arguments);
    };
};
Run Code Online (Sandbox Code Playgroud)