自学内容网 自学内容网

React modal暴露ref简洁使用

  • 父组件使用
import { useRef } from 'react'
import { FormModal } from './modal'

const IndexRoute = () => {
  const formRef = useRef<any>()
  const openModal = (row?: any) => {
    const params = {
      title: row?.id ? `【${row.name}】编辑` : '创建',
      isView: false,
      row,
      api: row?.id ?  editXXX : createXXX,
      refreshList: () => proTableProps.actionRef.current?.reload()
    }
    formRef.current?.acceptParams(params)
  }

  return (
    <>
    <Button onClick={openModal}>open modal</Button>
      <FormModal ref={formRef} />
 others page content
    </>
  )
}

export default IndexRoute

  • 子组件
import { Icons } from '@/components/antd-icons'
import { Button, Form, Input, message, Modal, Upload } from 'antd'
import { forwardRef, useEffect, useImperativeHandle, useState } from 'react'

export const FormModal = forwardRef((props: any, ref) => {
  const [form] = Form.useForm()
  const [confirmloading, setConfirmloading] = useState<boolean>(false)
  const [visible, setVisible] = useState(false)
  const [modalProps, setModalProps] = useState<any>({
    isView: false,
    title: '',
    row: {},
    api: () => {}
  })

  const { isView, title, row, api, refreshList } = modalProps

  const onCancel = () => {
    setConfirmloading(false)
    form.resetFields()
    setVisible(false)
  }

  const acceptParams = (params: any) => {
    setModalProps(params)
    setVisible(true)
    params.row ? form.setFieldsValue({ ...params.row }) : form.resetFields()
  }

  const onOk = async () => {
    form.validateFields().then(async formValue => {
      setConfirmloading(true)
      const res = await api({ ...formValue, id: row?.id })
      if (res) {
        message.success(`操作成功`)
        onCancel()
        refreshList()
      }
      setConfirmloading(false)
    })
  }

  useImperativeHandle(
    ref,
    () => ({
      acceptParams
    }),
    []
  )

  useEffect(() => {
    row && Object.keys(row)?.length > 0
      ? form.setFieldsValue({ ...row })
      : form.resetFields()
  }, [row])

  const normFile = (e: { fileList: any }) => {
    if (Array.isArray(e)) {
      return e
    }
    return e && e.fileList
  }

  return (
    <Modal
      forceRender
      title={title}
      open={visible}
      onOk={onOk}
      onCancel={onCancel}
      confirmLoading={confirmloading}
      destroyOnClose={true}
    >
      <Form
        form={form}
        disabled={isView}
        initialValues={row}
        layout="horizontal"
        labelCol={{ span: 4 }}
        size="small"
      >
        <Form.Item
          label="名称"
          name="name"
          rules={[{ required: true, message: '请输入版本名称!' }]}
        >
          <Input placeholder="name" />
        </Form.Item>
         {/* 文件上传form包裹demo */}
        <Form.Item
          name="calibration_zip"
          label="附件"
          valuePropName="fileList"
          getValueFromEvent={normFile}
        >
          <Upload maxCount={1} beforeUpload={() => false}>
            <Button size="small" icon={<Icons.UploadOutlined />}>
              上传
            </Button>
          </Upload>
        </Form.Item>
      </Form>
    </Modal>
  )
})

原文地址:https://blog.csdn.net/qq_34273059/article/details/142823512

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!