介绍

当我们在特定的环境下需要将表单放入蒙层中,通过弹框的形式,实现表单的提交

此组件封装与 ModalFrom(动态表单)的结合

有些人觉得 Modal 和 From 功能太少没必要封装,其实这个组件的功能确实并不是很多,那么做了什么呢?

首先,当表单放入弹框中,要满足 Modal 的样式,其次,表单最终要提交给后端的,所以会结合接口,做到传输数据~

在线演示:弹出表单

功能

当你有以下需求时,可以试试这个组件

  • 当表单需要通过 Modal 展示时
  • 需要通过结合接口一键配置
  • Modal的一切属性

    代码演示

    功能演示

    image.png

    具体代码

  1. import { useState, useEffect } from 'react';
  2. import { Modal, Button, message } from 'antd';
  3. import { Form } from '@/components';
  4. import { MaskFromProps } from './interface';
  5. import { maskSy } from '@/utils/Setting';
  6. const MaskFrom: React.FC<MaskFromProps> = ({
  7. children,
  8. onReset,
  9. onCancel,
  10. onSubmit,
  11. onEdit,
  12. onRequest,
  13. form={},
  14. formList=[],
  15. ...props
  16. }) => {
  17. const [loading, setLoading] = useState<boolean>(false);
  18. const [maskFormRef, setMaskFormRef] = useState<any>(false);
  19. useEffect(() => {
  20. if(props.visible){
  21. maskFormRef?.current?.resetFields()
  22. }
  23. }, [props.visible])
  24. return (
  25. <Modal
  26. {...props}
  27. onCancel={onCancel}
  28. footer={[
  29. <Button key="back" onClick={onCancel}>
  30. {props.cancelText || maskSy.maskFrom.cancelText}
  31. </Button>,
  32. <Button
  33. key="reset"
  34. onClick={async () => {
  35. if (onReset) {
  36. onReset();
  37. return;
  38. }
  39. console.log(form)
  40. await maskFormRef?.current?.resetFields();
  41. if(form.fieldValues && Array.isArray(form.fieldValues) && form.fieldValues.length !== 0){
  42. form.fieldValues.map((item) => {
  43. let payload: any = {};
  44. payload[item.name] = item.value;
  45. maskFormRef?.current?.setFieldsValue(payload);
  46. })
  47. }
  48. }}
  49. >
  50. {props.resetText || maskSy.maskFrom.resetText}
  51. </Button>,
  52. <Button
  53. key="submit"
  54. type="primary"
  55. loading={loading}
  56. onClick={async (e) => {
  57. const fieldsValue = await maskFormRef?.current?.validateFields();
  58. const params = onEdit ? await onEdit(fieldsValue) : fieldsValue;
  59. if(typeof params === 'string') return message.error(params)
  60. if(typeof params !== 'object' || Array.isArray(params)) return message.error('请在onEdit中返回对象或则字符串!')
  61. if(!onRequest){
  62. message.error('请在onRequest,写入对应的接口')
  63. return
  64. }
  65. setLoading(true);
  66. const res = await onRequest(params);
  67. setLoading(false);
  68. if (typeof res !== 'boolean') {
  69. message.success(props.message || maskSy.maskFrom.message);
  70. if (onSubmit) return onSubmit();
  71. }
  72. }}
  73. >
  74. {props.submitText || maskSy.maskFrom.submitText}
  75. </Button>,
  76. ]}
  77. >
  78. <Form
  79. method="mask"
  80. formList={formList}
  81. getRef={(formRef: any) => {
  82. setMaskFormRef(formRef);
  83. }}
  84. {...form}
  85. />
  86. </Modal>
  87. );
  88. };
  89. export default MaskFrom;

如何使用

  1. import React,{ useState, useEffect } from 'react';
  2. import { Form } from '@/components';
  3. import type { formProps } from '@/components';
  4. import { queryDetail } from './services' //提交接口
  5. export default () => {
  6. const [maskVisible, setMaskVisible] = useState<boolean>(false);
  7. const list: formProps[] = [
  8. {
  9. name: '最终表单获得的值,多个会覆盖~'
  10. type: '表单类型'
  11. ....
  12. }
  13. ....
  14. ]
  15. return (
  16. <>
  17. <Button onClick={() => {
  18. setMaskVisible(true)
  19. }}>弹框表单</Button>
  20. {
  21. maskVisible &&
  22. <Mask.Form
  23. title="表单弹框"
  24. message={"编辑成功"}
  25. visible={maskVisible}
  26. onRequest={queryDetail} // 请求的接口
  27. formList={list}
  28. onCancel={() => setMaskVisible(false)}
  29. onSubmit={() => setMaskVisible(false)}
  30. onEdit={(value) => { //作为接口的参数
  31. return value
  32. }}
  33. />
  34. }
  35. </>
  36. )
  37. }

特殊说明

  • 将接口的提交功能,重置功能,加入到 Modal,并配合接口传输数据