ant design form组件简单封装与使用

2021-03-02  本文已影响0人  ticktackkk

封装

import React, { useEffect, useState } from "react";
import { Button, Form, Input, Select, InputNumber, Radio, Modal, Checkbox, DatePicker, Switch } from "antd";
import { Uploader } from "react-single-app";
const { Option } = Select;
const { TextArea } = Input;
function NewModal({ formItem, title, visible, onCancel, onOk, rowValue, formItemLayout }) {
    const [form] = Form.useForm();
    useEffect(() => {
        form.resetFields();
        rowValue && form.setFieldsValue({ ...rowValue });
    }, [visible])
    function initFromItem() {
        if (!formItem || formItem.length === 0) return false;
        const fromList = [];
        formItem.map((item) => {
            switch (item.type) {
                case "Text":
                    fromList.push(TextEle(item));
                    break;
                case "Input":
                    fromList.push(InputEle(item));
                    break;
                case "Select":
                    fromList.push(SelectEle(item));
                    break;
                case "InputNumber":
                    fromList.push(InputNumberEle(item));
                    break;
                case "Radio":
                    fromList.push(RadioEle(item));
                    break;
                case "TextArea":
                    fromList.push(TextAreaEle(item));
                    break;
                case "CheckBox":
                    fromList.push(CheckboxEle(item));
                    break;
                case "Date":
                    fromList.push(DateEle(item));
                    break;
                case "Switch":
                    fromList.push(SwitchEle(item));
                    break;
                case "Uploder":
                    fromList.push(UploderEle(item));
                    break;
            }
        });
        return fromList;
    }
    //rules 验证
    function rulesEle(item) {
        let rules = [];
        let messages = `${item.label}不能为空`;
        let type = ["Select", "Radio"];
        if (type.includes(item.type)) {
            messages = `请选择${item.label}`;
        }
        if (item.required) {
            let message = item.message || messages;
            rules.push({ required: true, message });
        }
        if (item.rules && item.rules.length > 0) {
            rules = rules.concat(item.rules);
        }
        return rules;
    }
    //test
    function TextEle(item) {
        const rules = rulesEle(item);
        return (
            <Form.Item
                label={item.label}
                name={item.name}
                key={item.name}
                rules={rules}
            >
                {item.text}
            </Form.Item>
        );
    }

    //input
    function InputEle(item) {
        const rules = rulesEle(item);
        return (
            <Form.Item
                label={item.label}
                name={item.name}
                key={item.name}
                rules={rules}
            >
                <Input
                    placeholder={item.placeholder}
                />
            </Form.Item>
        );
    }

    //   select
    function SelectEle(item) {
        const rules = rulesEle(item);
        return (
            <Form.Item
                label={item.label}
                name={item.name}
                key={item.name}
                rules={rules}
            >
                <Select
                    style={{ width: '100%' }}
                    placeholder={item.placeholder}
                    optionFilterProp="children"
                    showSearch
                    allowClear
                >
                    {item.option &&
                        item.option.map((ite, index) => {
                            return (
                                <Option value={ite.name} key={ite.id}>
                                    {ite.id}
                                </Option>
                            );
                        })}
                </Select>
            </Form.Item>
        );
    }
    //   InputNumber
    function InputNumberEle(item) {
        const rules = rulesEle(item);
        return (
            <Form.Item
                label={item.label}
                name={item.name}
                key={item.name}
                rules={rules}
            >
                <InputNumber
                    style={{ width: '100%' }}
                />
            </Form.Item>
        );
    }

    //Radio
    function RadioEle(item) {
        const rules = rulesEle(item);
        return (
            <Form.Item
                label={item.label}
                name={item.name}
                key={item.name}
                rules={rules}
            >
                <Radio.Group defaultChecked>
                    {item.option &&
                        item.option.map((ite, index) => {
                            return <Radio value={ite.name}key={ite.id}>{ite.id}</Radio>;
                        })}
                </Radio.Group>
            </Form.Item>
        );
    }
    //  TextArea
    function TextAreaEle(item) {
        const rules = rulesEle(item);
        return (
            <Form.Item
                label={item.label}
                name={item.name}
                key={item.name}
                rules={rules}
            >
                <Input.TextArea />
            </Form.Item>
        );
    }
    // CheckBox
    function CheckboxEle(item) {
        const rules = rulesEle(item);
        return (
            <Form.Item
                label={item.label}
                name={item.name}
                key={item.name}
                rules={rules}
            >
                <Checkbox.Group options={item.option} />
            </Form.Item>
        );

    }
    // Date
    function DateEle(item) {
        const rules = rulesEle(item);
        return (
            <Form.Item
                label={item.label}
                name={item.name}
                key={item.name}
                rules={rules}
            >
                <DatePicker showTime format="YYYY-MM-DD HH:mm:ss" />
            </Form.Item>
        );
    }
    //Switch
    function SwitchEle(item) {
        const rules = rulesEle(item);
        return (
            <Form.Item
                label={item.label}
                name={item.name}
                key={item.name}
                rules={rules}
            >
                <Switch />
            </Form.Item>
        );
    }
    //Uploder
    function UploderEle(item) {
        const rules = rulesEle(item);
        return (
            <Form.Item
                label={item.label}
                name={item.name}
                key={item.name}
                extra={item.extra}
                rules={rules}
            >
                <Uploader
                    style={{ width: 100, height: 100 }}
                    allowTypes={item.Types}
                    onChange={src=>{
                        src ? modalForm.setFieldsValue({ [item.name]: src.src }) : modalForm.setFieldsValue({ [item.name]: null })
                    }}
                />
            </Form.Item>
        )

    }

    // 提交表单
    function Submit() {
        // console.log(props);
        form.validateFields().then((values) => {
            onOk(values);
        });
    }

    let formLayout = formItemLayout || {
        labelCol: { span: 6 },
        wrapperCol: { span: 14 },
    };

    return (
        <div>
            <Modal
                title={title}
                visible={visible}
                onCancel={onCancel}
                onOk={Submit}
                maskClosable={false}
                destroyOnClose={true}
                getContainer={false}
                width={700}
            >
                <Form form={form} {...formLayout}  >
                    {initFromItem()}
                </Form>
            </Modal>
        </div >
    );
}

export default NewModal;

使用

import React, { useEffect, useState } from "react";
import NewModal "./components/NewModal";

function App() {
 const [deValue, setDevalue] = useState({
        title: 123,
        visible: false,
        rowValue:''
    })
  const [visible, setVisible] = useState(true);

 function getOptions() {
        formItem.map(item => {
            if (item.request && !item.option.length) {
                lib.request({
                    url: item.request,
                    needMask: false,
                    data: item.data,
                    success: res => {
                        console.log(res);
                        item.option = res || []
                        setFormItem(formItem)
                    }
                })
            }
        })
        return formItem;
    }
const [formItem, setFormItem] = useState([
        {
            type: "Input",
            label: "你好",
            name: "a",
            width: "200px",
            placeholder: "aaaaaa",
            required: true,
            rules: [
                { required: true, message: "bitian" },
                { max: 5, message: "5" },
                ({ getFieldValue }) => {
                    // console.log(getFieldValue("aaa"));
                    return Promise.resolve();
                },
            ],
        },
        {
            type: "Select",
            label: "中文",
            name: "b",
            required: true,
            width: "200px",
            placeholder: "请选择语言",
            request: "/account-web/....",
            data: { },
            option: [ ],
        },
        {
            type: "InputNumber",
            label: "中文",
            name: "c",
            required: true,
            width: "200px",
            rules: [],
        },
        {
            type: "Radio",
            label: "kbdsfj",
            name: "d",
            required: true,
            width: "200px",
            option: [

            ],
        },
        {
            type: "TextArea",
            label: "中文",
            name: "e",
            required: true,
            width: "200px",
            rules: [],
        },
    ])

  //提交表单,关闭Modal
 function onOk(props) {
        console.log(props, 1);
        setDevalue({ ...deValue, visible: false });
    }
    function onCancel(props) {
        setDevalue({ ...deValue, visible: false });
    }
    let rowValue = {
        'a': '123',
        c: 123,
        d: 'aa',
        e: 123
    }

    let Myprops = {
        title: deValue.title,
        visible: deValue.visible,
        formItem: getOptions(),
        rowValue:deValue.rowValue
        onCancel,
        onOk
    }
  return (
    <div>
      <NewModal {...Myprops} />
    </div>
  );
}

export default App;

上一篇下一篇

猜你喜欢

热点阅读