我在react hook表单的表单中有一个MUI自动完成,它在填充表单时可以正常工作,但是当我想显示填充了提取数据的表单时,MUI自动完成仅在两次渲染后显示所选选项。
我认为这是使用效果和重置(从反应钩子形式)的东西,因为自动完成其选项是静态的工作正常,但我也必须从我的API获取选项的那些只有在第二次使用效果运行后才能正常工作。
我无法复制codesandbox,因为它是一个使用真实api的大型项目,但如果需要,我可以提供更多信息。如果有人能帮我,请提前感谢。
选择要在表单中可视化的项目的页面:
const People: React.FC = () => {
const [show, setShow] = useState(false);
const [modalData, setModalData] = useState<PeopleProps>({} as PeopleProps);
async function showCustomer(id: string) {
await api
.get(`people/${id}`)
.then((response) => {
setModalData(response.data);
setShow(true);
})
.catch((error) => toast.error('Error')
)
}
return (
<>
{...} // there's a table here with items that onClick will fire showCustomer()
<Modal
data={modalData}
visible={show}
/>
</>
);
};
模态中的我的表单:
const Modal: React.FC<ModalProps> = ({data, visible}) => {
const [situations, setSituations] = useState<Options[]>([]);
const methods = useForm<PeopleProps>({defaultValues: data});
const {reset} = methods;
/* FETCH POSSIBLE SITUATIONS FROM API*/
useEffect(() => {
api
.get('situations')
.then((situation) => setSituations(situation.data.data))
.catch((error) => toast.error('Error'));
}, [visible]);
/* RESET FORM TO POPULATE WITH FETCHED DATA */
useEffect(() => reset(data), [visible]);
return (
<Dialog open={visible}>
<FormProvider {...methods}>
<DialogContent>
<ComboBox
name="situation_id"
label="Situação"
options={situations.map((item) => ({
id: item.id,
text: item.description
}))}
/>
</DialogContent>
</FormProvider>
</Dialog>
);
};
export default Modal;
组合框组件:
const ComboBox: React.FC<ComboProps> = ({name, options, ...props}) => {
const {control, getValues} = useFormContext();
return (
<Controller
name={`${name}`}
control={control}
render={(props) => (
<Autocomplete
{...props}
options={options}
getOptionLabel={(option) => option.text}
getOptionSelected={(option, value) => option.id === value.id}
defaultValue={options.find(
(item) => item.id === getValues(`${name}`)
)}
renderInput={(params) => (
<TextField
variant="outlined"
{...props}
{...params}
/>
)}
onChange={(event, data) => {
props.field.onChange(data?.id);
}}
/>
)}
/>
);
};
export default ComboBox;
我认为你在这里简化了一些事情:
我制作了一个小的代码沙盒,试图复制您的用例,看看:
另一个重要的事情:只有当您有深度嵌套的控件时,您才应该使用
useFormContext
,否则只需将控件传递给您的
React钩子窗体的FormProvider是基于React的上下文API构建的。它解决了数据通过组件树传递的问题,而无需在每个级别手动传递道具。这还会导致组件树在React钩子窗体触发状态更新时触发重新渲染
我想在react中处理选择的事件,示例如何在普通JS中工作。 因此我为选择创建了react组件:
我正在使用AutoCompleteTextView进行地址建议。 我想做的是当用户输入地址(f. e.“Ma”)时,建议会显示为“Mary, Madley, Ma…”。 然后,当用户选择其中一个建议时,他会立即获得另一个包含整个地址的建议。 例如:他选择了“玛丽”,他得到了像“玛丽123,波士顿”、“玛丽1566,纽约”、“玛丽简569,纽约”这样的建议。 问题是建议填写了适配器,但没有显示。选择
我有这样一个下拉列表: 如何使用JavaScript获得实际的选项文本而不是值?我可以通过以下方法获得值: 但我想要的不是而是。
我有两个<代码> 当用户从第一个选择框中选择一个值时,我希望第二个选择框只显示连接的值。 我的代码: 因此,当用户从第一个选择框M中选择“test1”时,他在第二个选择框上只会看到“test2”、“test3”和“test4”;第一个框中的“test2”将在第二个框中显示“test6”、“test7”和“test8”。 如何使用JavaScript解决此问题?
问题内容: 嗨, 这是从JComboBox作为字符串获取值的正确方法,以及为什么它是正确的方法。谢谢。 要么 问题答案: 如果仅在JComboBox中放置(非空)引用,则两种方法都可以。 但是,第一种解决方案还允许将来进行修改,您可以在组合框中插入s,s,s等作为项目。 为了对值保持鲁棒性(仍然不强制转换),您可以考虑第三个选择:
运行Tomcat6服务器。单击更新选项,我得到以下选项- 中更新资源和类的选项不再显示。不是为了更新JSP,我已经重新启动了服务器。