封装表单组件 forwardRef的使用

278 阅读1分钟

点击按钮后,打开模态框,对模态框中的表单进行封装,在验证表单数据时,需要拿到封装的表单组件中的数据,这时候使用forwardRef很方便

初始状态

父组件 Userlist

export default function UserList() {
  const [isAddVisible, setIsAddVisible] = useState(false);
  const openModel = () => {
    setIsAddVisible(true);
  }
  const onCancel = () => {
    setIsAddVisible(false);
  }
  return (
    <div>
      <Button type="primary" onClick={() => openModel()}>Primary Button</Button>
      <Modal
        visible={isAddVisible}
        title="添加用户"
        okText="确定"
        cancelText="取消"
        onCancel={onCancel}
        onOk={() => {
           //进行表单验证
        }}
      >
        <UserForm/>
      </Modal>
    </div>

  )
}

表单组件UserForm

export default Function UserForm() {
    return (
        <Form
            ref={ref}
            layout="vertical"

        >
            <Form.Item
                name="usename"
                label="用户名"
                rules={[{ required: true, message: 'Please input the title of collection!' }]}
            >
                <Input />
            </Form.Item>

            <Form.Item
                name="password"
                label="密码"
                rules={[{ required: true, message: 'Please input the title of collection!' }]}
            >
                <Input />
            </Form.Item>
        </Form>
    )
})

forwardRef的使用

父组件 Userlist

const addForm = useRef();

<UserForm ref={addForm}/>

表单组件UserForm

修改导出格式

//引入forwardRef
import React, { forwardRef, useState } from 'react'

//第二个参数ref接收父组件传入的ref
const UserForm = forwardRef((props, ref) => {
    xxxxx
})
export default UserForm

Form绑定ref

<Form
    ref={ref}
    layout="vertical"
>
    xxxx
</Form>

点击确定按钮打印一下

<Modal
    visible={isAddVisible}
    title="添加用户"
    okText="确定"
    cancelText="取消"
    onCancel={onCancel}
    onOk={() => {
      console.log(addForm);
      //进行表单验证
    }}
  >
    <UserForm ref={addForm}/>
</Modal>

打印.png

然后调用validateFields()方法验证数据即可

onOk={() => {
  console.log(addForm);
  //进行表单验证
  addForm.current.validateFields().then(value => {
    console.log(value);
  })
}}

1.png

2.png

最后调用接口传出数据即可