javascript - React Hook 表单 - 控制器 - React AsyncSelect - Lodash Debounce | 未能显示 loadOptions
问题描述
当我从 lodash 使用时,React 挂钩未在 AsyncSelect 的 loadingOptions 中显示选项debounce
。
这是代码。
const NoteFormMaster = ({ register, control, errors }) => {
const getAsyncOptions = (inputText) => {
return axios
.get(`/v1/user?username=${inputText}`)
.then((response) => {
return response.data.map((user) => ({
value: user.id,
label: user.username,
}));
})
.catch((error) => {
alert(JSON.stringify(error));
});
};
const loadOptions = (inputText) => getAsyncOptions(inputText);
const debounceLoadOptions = _.debounce(loadOptions, 3000);
return (
<Controller
control={control}
name="shareWith"
id="shareWith"
as={
<AsyncSelect
// cacheOptions
loadOptions={(v) => debounceLoadOptions(v)}
defaultValue={[]}
isMulti
isClearable
defaultOptions={[]}
/>
}
/>
)
);
};
但是,当我不使用 debounce 时,loadOptions={(v) => getAsyncOptions(v)}
它可以工作。如何处理这种去抖动?
解决方案
loadOptions
期望使用新选项调用回调参数或返回承诺。您debounceLoadOptions
返回一个包含在 debounce 函数中的函数,因此它不满足这些要求中的任何一个。
鉴于您的实现,我将像这样替换 loadOptions 函数声明。
const loadOptions = React.useCallback(
debounce((inputText, callback) => {
getAsyncOptions(inputText).then((options) => callback(options));
}, 3000),
[]
);
也不需要按原样声明 loadOptions 道具。应该注意的是, loadOptions 属性实际上传递了两个参数,在这种情况下需要第二个参数来设置新选项,因此 select 可以呈现如下:
<AsyncSelect
// cacheOptions
loadOptions={loadOptions}
defaultValue={[]}
isMulti
isClearable
defaultOptions={[]}
/>
这是相应的代码框来尝试一下: https ://codesandbox.io/s/react-select-async-debounce-usecallback-oeixm?file=/src/App.js
推荐阅读
- python - 如何通过 Node JS 使用 Python 机器学习库,如 Numpy、Scipy、Pandas、Tensorflow
- python - 在 MSER 检测到的区域上执行凸包时出错
- mongodb - Spring mongo slice array in embedded document
- spring-boot - 无法解决 maven 项目中的 javax.annotation.Priority 依赖问题
- c++ - Why operator cannot be in parentheses?
- android - 在底部导航视图上重新创建活动
- c++ - Temporary object argument lifetime in a function
- c# - azure maps differentiate address from point of interest
- javascript - JavaScript 'IN' 语句
- sharepoint - 将现有文档库连接到共享点站点