reactjs - 使用 React AsyncSelect 的 React Hook Form 无法加载选项
问题描述
更新,移除options
道具
还是失败了。
文件 2:note.form-master.js
import React, { useState } from "react";
import { Controller } from "react-hook-form";
import AsyncSelect from "react-select/async";
import UserDataService from "../../../services/user.service";
const NoteFormMaster = ({ register, control, errors }) => {
// eslint-disable-next-line
const [selectedUser, setSelectedUser] = useState();
const loadOptions = (inputText) => {
// Axios here
UserDataService.getUserList(inputText)
.then((response) => {
return response.data.map((user) => ({
value: user.id,
label: user.username,
}));
})
.catch((error) => {
alert(JSON.stringify(error));
});
};
const handleInputChange = (selectedUser) => {
if (selectedUser) {
setSelectedUser(selectedUser);
}
};
return (
<div className="form-group col-md-6">
<label htmlFor="shareWith">Share With</label>
<Controller
control={control}
name="shareWith"
id="shareWith"
as={
<AsyncSelect
cacheOptions
isMulti
isClearable
loadOptions={(v) => loadOptions(v)}
defaultOptions={[]}
onInputChange={handleInputChange}
/>
}
// render={(props) => (
// <AsyncSelect
// cacheOptions
// isMulti
// isClearable
// loadOptions={(v) => loadOptions(v)}
// defaultOptions={[]}
// onInputChange={handleInputChange}
// />
// )}
/>
</div>
);
};
export default NoteFormMaster;
经过一整天的尝试解决这个 React Hook Form,我决定在这里问,因为我仍然失败。我使用如下反应钩子形式。我把它分成两个文件,以便于阅读。
问题是,成功时没有出现AsyncSelect 。这是我的源代码:option
axios response
文件 1:note.create.js
import React from "react";
import { useForm } from "react-hook-form";
import NoteDataService from "../../../services/note.service";
import NoteFormMaster from "./note.form-master";
import { Button } from "react-bootstrap";
const NoteCreate = (props) => {
const { register, control, errors, handleSubmit } = useForm({
defaultValues: {
title: "",
shareWith: [],
},
});
const onSubmit = (data) => {
// Some logic here
};
return (
<>
<form onSubmit={handleSubmit(onSubmit)}>
// Load form master
<NoteFormMaster register={register} control={control} errors={errors} />
<div className="row mt-4">
<div className="col">
<Button variant="primary" type="submit" className="float-right">
Submit
</Button>
</div>
</div>
</form>
</>
);
};
export default NoteCreate;
文件 2:note.form-master.js
import React, { useState } from "react";
import { Controller } from "react-hook-form";
import AsyncSelect from "react-select/async";
import UserDataService from "../../../services/user.service";
const NoteFormMaster = ({ register, control, errors }) => {
// eslint-disable-next-line
const [selectedUser, setSelectedUser] = useState();
const [suggestion, setSuggestion] = useState([]);
const loadOptions = (inputText) => {
// Axios here
UserDataService.getUserList(inputText)
.then((response) => {
let options = response.data.map((user) => ({
value: user.id,
label: user.username,
}));
setSuggestion(options);
})
.catch((error) => {
alert(JSON.stringify(error));
});
};
const handleInputChange = (selectedUser) => {
if (selectedUser) {
setSelectedUser(selectedUser);
}
};
return (
<div className="form-group col-md-6">
<label htmlFor="shareWith">Share With</label>
<Controller
control={control}
name="shareWith"
id="shareWith"
as={
<AsyncSelect
cacheOptions
isMulti
isClearable
options={suggestion}
loadOptions={(v) => loadOptions(v)}
defaultOptions={[]}
onInputChange={handleInputChange}
/>
}
// render={(props) => (
// <AsyncSelect
// cacheOptions
// isMulti
// isClearable
// loadOptions={(v) => loadOptions(v)}
// defaultOptions={[]}
// onInputChange={handleInputChange}
// />
// )}
/>
</div>
);
};
export default NoteFormMaster;
我已经使用检查了 axios 结果console.log (suggestion)
结果:
[
{
"value": 44,
"label": "Dzil"
},
{
"value": 190,
"label": "gmaildzil"
}
]
解决方案
正如我在评论中所写:
const loadOptions = (inputText) => {
// return promise here.
return UserDataService.getUserList(inputText)
.then((response) => {
return response.data.map((user) => ({
value: user.id,
label: user.username,
}));
})
.catch((error) => {
alert(JSON.stringify(error));
});
};
// The defaultOptions prop determines "when" your remote request is initially fired.
<AsyncSelect
cacheOptions
isMulti
isClearable
loadOptions={(v) => loadOptions(v)}
defaultOptions
onInputChange={handleInputChange}
/>
推荐阅读
- r - 如何计算R中多年每年特定日期的平均值?
- javascript - 在 Visual Studio 中将 TypeScript 文件合并到多个输出文件中
- google-apps-script - Google 电子表格 onEdit 事件未定义
- javascript - 反应地图内JSX元素的展开操作
- vue.js - 如何确保我的 vuex 商店在路由器中可用
- python - 在多个条件下拆分字符串列表
- c++ - freopen() 无法写入文件?
- log4j - log4j - 编程配置
- vuejs2 - vuetify:删除过滤器后无法选择第一个列表项
- python - 无法安装 pyttsx3(文本朗读模块)