demo

发布时间 2023-12-23 07:51:42作者: koikoa
import React, { useState, useEffect } from 'react';
import { Modal, Button, Form, Checkbox } from 'antd';
import { useForm } from 'antd/lib/form/Form';

interface ResourceSelectProps {
  form: ReturnType<typeof useForm>;
}

const ResourceSelect: React.FC<ResourceSelectProps> = ({ form }) => {
  const [modalVisible, setModalVisible] = useState(false);
  const [selectItem, setSelectItem] = useState<string[]>([]);

  const showModal = () => {
    setModalVisible(true);
  };

  const handleOk = () => {
    form.setFieldsValue({ professionKnowledge: selectItem });
    setModalVisible(false);
  };

  const handleCancel = () => {
    setModalVisible(false);
  };

  const handleCheckboxChange = (value: string) => {
    const updatedSelectItem = [...selectItem];
    if (updatedSelectItem.includes(value)) {
      updatedSelectItem.splice(updatedSelectItem.indexOf(value), 1);
    } else {
      updatedSelectItem.push(value);
    }
    setSelectItem(updatedSelectItem);
  };

  useEffect(() => {
    form.setFieldsValue({ professionKnowledge: selectItem });
  }, [selectItem, form]);

  return (
    <>
      <Form.Item
        label="涉及专业知识"
        name="professionKnowledge"
        rules={[{ required: true, message: '请选择涉及专业知识' }]}
      >
        <Button type="primary" onClick={showModal}>
          选择资源
        </Button>
      </Form.Item>

      <Modal title="选择资源" visible={modalVisible} onOk={handleOk} onCancel={handleCancel}>
        <Checkbox value="A" onChange={() => handleCheckboxChange('A')}>
          A
        </Checkbox>
        <Checkbox value="B" onChange={() => handleCheckboxChange('B')}>
          B
        </Checkbox>
        <Checkbox value="C" onChange={() => handleCheckboxChange('C')}>
          C
        </Checkbox>
      </Modal>
    </>
  );
};

export default ResourceSelect;
父组件
import React from 'react';
import { Form, Button, Space } from 'antd';
import ResourceSelect from './ResourceSelect';

const ParentForm: React.FC = () => {
  const [form] = Form.useForm();

  const onFinish = async (values: any) => {
    // 在这里可以进行提交表单的操作
    console.log('Form values:', values);
  };

  const validateSelectItem = () => {
    // 自定义校验规则,检查是否选择了盒子
    if (!form.getFieldValue('professionKnowledge')?.length) {
      return Promise.reject('请完成选择');
    }
    return Promise.resolve();
  };

  return (
    <Form form={form} onFinish={onFinish}>
      <ResourceSelect form={form} />

      <Form.Item
        label="其他字段"
        name="otherField"
        rules={[{ required: true, message: '其他字段不能为空' }]}
      >
        <Input />
      </Form.Item>

      <Form.Item
        label="创建场景"
        shouldUpdate
        rules={[{ validator: validateSelectItem }]}
      >
        {() => (
          <Space>
            <Button type="primary" htmlType="submit">
              完成
            </Button>
          </Space>
        )}
      </Form.Item>
    </Form>
  );
};

export default ParentForm;