javascript - 消除 redux 调度未按预期工作
问题描述
我试图去抖动一个 api 动作,它是对 reducer 的调度调用。浏览器中的 api 调用应该在作为单个 api 给出的特定延迟后去抖动,但它在延迟后作为多个 api 调用进行,代码如下。
const apiCall = (args) => {
dispatch(getECByStatus({status: 'PENDING_APPROVAL', search: args}))
}
const debounce = (apiFunc, delay) => {
let inDebounce
return function () {
const context = this
const args = arguments
clearTimeout(inDebounce)
inDebounce = setTimeout(() => {
inDebounce = null
apiFunc.apply(context, args)
},delay);
}
}
const optimizedVersion = debounce(apiCall, 600)
const handleSearchChange = (value) => {
optimizedVersion(value)
}
这handleSearchChange
是在输入输入时从输入框中触发的 onchange 事件。getECByStatus
是一个 redux 动作创建者,它使用搜索参数调用 api,
export const getECByStatus = (params) => async (dispatch) => {
let editCheckType = params?.type ? `/${params.type}` : ''
let searchParams = params?.search ? `&search=${params.search}` : ''
try {
dispatch({
type: actionType.GET_EC_BY_STATUS_REQUEST,
payload: {
load: true,
},
})
let study_id = getItem('study_id')
const { data } = await DataService.get(
`/edit-checks${editCheckType}?status=${params.status}&study_id=${study_id}${searchParams}`
)
dispatch({
type: actionType.GET_EC_BY_STATUS_SUCCESS,
payload: {
load: false,
data: data.data,
}
},
})
} catch (error) {
console.error('Get EC by status error', error)
dispatch({
type: actionType.GET_EC_BY_STATUS_FAIL,
payload: {
load: false,
},
})
}
}
提前致谢!
解决方案
这是由于在 dispatch 事件触发后 UI 重新渲染,由于输入框是受控的,我们必须将更新后的值传递给输入框组件,因此我们可以传递一个 ref 以不重新渲染用户界面。
推荐阅读
- spring - 在 Angular 和 Java 中存储 cookie 的方法
- angular - 在 ngFor 中创建表单的副本
- java - Spring Boot Java 11 缺少运行时依赖项
- python-3.x - Google Cloud:dev_appserver.py 不反映实时更改
- assembly - 为什么在 MIPS 中有两种方法可以将任意有符号数相乘?
- matlab - 有没有办法在matlab中计算分类时间?
- python - 定义这个函数绝对不会返回任何东西:
- c# - 我的 HTTP 触发 Azure 函数如何将请求的参数直接传递给 Run 方法?
- java - 我可以将自定义标准(来自数据库扩展)与 spring JPA 规范一起使用吗?
- c++ - 指针验证的最佳实践?