已知
对于自定义或第三方的表单控件,也可以与 Form 组件一起使用。只要该组件遵循以下的约定:
(1)提供受控属性 value 或其它与 valuePropName 的值同名的属性。
(2)提供 onChange 事件或 trigger 的值同名的事件。
(3)不能是函数式组件。
问题
但是React Hooks就是函数式组件,在进行表单提交时自定义组件中的值就不能被获取。如下图全为undefined
用法
父组件
const [form] = Form.useForm();
const { validateFields, getFieldsValue, setFieldsValue } = form;
const checkDeploy = async () => {
const values = await getFieldsValue();
console.log(values, "表单的数据");
};
<Form layout="vertical" title="部署设置" form={form}>
<Button
onClick={checkDeploy}
htmlType="submit"
style={{ position: "fixed", bottom: "50px", right: "150px" }}
type={"primary"}
>
确认部署
</Button>
子组件
<Select
optionFilterProp="label"
showSearch
defaultValue={datamodel[0].id}
onChange={handleChange}
options={map(datamodel, (item) => {
return {
value: item.id,
label: item.name,
};
})}
/>
问题解决
上述用法没有任何问题,但自定义组件的值并没有和form表单联系起来
所以应该用一下方法解决
- 将子组件下拉框的值通过onChange记录
const [versionId, setVersionId] = useState<number>(0);
const handleChange = (value: any) => {
setVersionId(value);
};
- 检测到选项变化后,通过onChange 方法传递给父组件(父组件不需要收,就已自动到form的values里)
const DeploySelect = ({ onChange }: { onChange?: (val: number) => void }) => {}
useEffect(() => {
onChange && versionId && onChange(versionId);
}, [versionId]);
onFinish方法失效也是同样的原因,参考以上方式即可。