最近antd发布了4.0版本,里面做了一些变化,特别是form组件部分。
比如说,之前我们在Modal的组件中使用Form 。原来的做法是Modal和From写在一个组件中,但是4.0版本中,我们看到文档上有这段文字。
为何在 Modal 中调用 form 控制台会报错?#
Warning: Instance created by useForm is not connect to any Form element. Forget to pass form prop?
这是因为你在调用 form 方法时,Modal 还未初始化导致 form 没有关联任何 Form 组件。你可以通过给 Modal 设置 forceRender 将其预渲染
所以,我们需要在父组件中写Modal,子组件中使用Form。由于antd的Modal的确定和取消按钮都是Modal组件的,所以,我们需要在父组件中调用子组件的提交方法。
父组件
const Tag = (props)=>{
const [loading,setLoading] = useState(false);
const [rows,setRows] = useState([]);
const [modalVisible,setModalVisible] = useState(false);
const [editId,setEditId] = useState(null);
const formRef = useRef();
const handleShowModal = (editId)=>{
setModalVisible(true);
setEditId(editId);
};
const handleCloseModal = ()=>{
setModalVisible(false);
setEditId(null);
};
const handleDelete=(record)=>{
Modal.confirm({
title: '确定删除?',
content: '删除标签',
onOk() {
},
onCancel() {
},
});
};
const handleModalOK = ()=>{
formRef.current.submit();
};
const columns = [{
title: '名称',
dataIndex: 'tagName',
key: 'tagName',
},{
title: '操作',
key:'id',
width: 200,
render: (text, record) => (
<span>
<a onClick={()=>handleShowModal(record.id)}>编辑</a>
<Divider type="vertical"/>
<a onClick={()=>handleDelete(record)}>删除</a>
</span>
)
}];
const titleEl = <div>
<Button type={`primary`} onClick={()=>handleShowModal(null)} >新增标签</Button>
</div>;
return (<>
<Table rowKey={`id`} title={()=>titleEl} columns={columns} dataSource={rows} loading={loading} pagination={false} />
<Modal forceRender visible={modalVisible} title={(editId?`修改`:`新增`)} onOk={handleModalOK} onCancel={handleModalCancel}>
<TagForm ref={formRef} editId={editId} />
</Modal>
</>)
};
export default Tag
子组件
import { Form, Input } from 'antd';
import React, {forwardRef, useEffect, useImperativeHandle} from 'react';
const TagForm = ({visible, editId, onCancel, onSuccess},tagFormRef)=>{
const [form] = Form.useForm();
const {getFieldDecorator, validateFields, resetFields, setFieldsValue} = form;
useImperativeHandle(tagFormRef,()=>({
submit:()=>{
console.log("ss")
}
}));
return <>
<Form form={form} >
<Form.Item label={`标签名称`} name={'tagName'}>
<Input/>
</Form.Item>
</Form>
</>
};
export default forwardRef(TagForm)