React动态组件

82 阅读3分钟

FormDyNew

const formItem1 = {
  type: 'radio',
  payload: {
    label: '业务领域',
    name: 'service',
    // value: '1';这里面不能穿死value的值
    options: [
      {label:'智能光伏', value:'1'},
      {label:'站点能源', value:'2'},
      {label:'数据中心', value:'3'},
      {label:'充电网络', value:'4'},
    ],
    deFaultValue: JSON.parse(sessionStorage.getItem('service'))||'',
    rules:[
      {
        required: true,
        message: 'Please input your password!',
      },
    ]
  },
  nextItem: (currentValue) => {
    if (currentValue === null || currentValue === '') {
      return null;
    }
    console.log("firstCurrentValue",currentValue,currentValue===1);
    if (currentValue === '1') {
      console.log("formItem1里面的2",formItem2);
      return formItem2;
    } else if (currentValue === '2') {
      return formItem3;
    }else if (currentValue === '3') {
      return formItem4;
    } else if (currentValue === '4') {
      return formItem5;
    } else {
      return null;
    }
  }
}

const formItem2 = {
  type: 'radio',
  payload: {
    label: '产品类型',
    name: 'product',
    // value: '1';这里面不能穿死value的值
    options: [
      {label:'BCU',value:'1'},
      {label:'CMU',value:'2'},
      {label:'PCS',value:'3'},
      {label:'数采',value:'4'},
      {label:'STS',value:'5'},
      {label:'户用单项逆变器',value:'6'},
      {label:'EMMA',value:'7'},
      {label:'户用储能',value:'8'},
      {label:'储能液冷',value:'9'},
    ],
    rules:[
      {
        required: true,
        message: 'Please input your password!',
      },
    ],
    deFaultValue: JSON.parse(sessionStorage.getItem('product'))||'',

  },
  nextItem: (currentValue) => {
    if(currentValue === null || currentValue === '') {
      return null;
    }
    console.log(currentValue);
    if (currentValue === '1') {
      return formItem6;
    } else if (currentValue === '2') {
      return formItem7;
    } else {
      return formItem7;
    }
  }
}

const formItem3 = {
  type: 'radio',
  name: 'product',
  payload: {
    label: '产品类型',
    name: 'product',
    // value: '1';这里面不能穿死value的值
    options: [
      {label:'CMU',value:'1'},
      {label:'锂电CAN',value:'2'},
      {label:'锂电MODBUS',value:'3'},
    ],
    rules:[
      {
        required: true,
        message: 'Please input your password!',
      },
    ],
    deFaultValue: JSON.parse(sessionStorage.getItem('product'))||'',

  },
  nextItem: (currentValue) => null
}

const formItem4 = {
  type: 'radio',
  payload: {
    label: '产品类型',
    name: 'product',
    // value: '1';这里面不能穿死value的值
    options: [
      {label:'锂电',value:'1'},
      {label:'UPS',value:'2'},
    ],
    rules:[
      {
        required: true,
        message: 'Please input your password!',
      },
    ],
    deFaultValue: JSON.parse(sessionStorage.getItem('product'))||'',

  },
  nextItem: (currentValue) => null
}

const formItem5 = {
  type: 'radio',
  payload: {
    label: '产品类型',
    name: 'product',
    // value: '1';这里面不能穿死value的值
    options: [
      {label:'直流',value:'1'},
      {label:'充电模块',value:'2'},
    ],
    rules:[
      {
        required: true,
        message: 'Please input your password!',
      },
    ],
    deFaultValue: JSON.parse(sessionStorage.getItem('product'))||'',

  },
  nextItem: (currentValue) => null
}

const formItem6 = {
  type: 'checkbox',
  payload: {
    label: '产品类型',
    name: 'logType',
    // value: '1';这里面不能穿死value的值
    options: [
      {label:'性能',value:'1'},
      {label:'告警',value:'2'},
      {label:'5分钟研发数据',value:'3'},
      {label:'故障录波',value:'4'},
      {label:'告警快照',value:'5'},
      {label:'旁路日志',value:'6'},
      {label:'操作日志',value:'7'},
    ],
    rules:[
      {
        required: true,
        message: 'Please input your password!',
      },
    ],
    deFaultValue: JSON.parse(sessionStorage.getItem('logType'))||'',

  },
  nextItem: (currentValue) => null
}

const formItem7 = {
  type: 'checkbox',
  payload: {
    label: '产品类型',
    name: 'logType',
    // value: '1';这里面不能穿死value的值
    options: [
      {label:'性能',value:'1'},
      {label:'告警',value:'2'},
      {label:'5分钟研发数据',value:'2'},
      {label:'故障录波',value:'2'},
    ],
    deFaultValue: '1',
    rules:[
      {
        required: true,
        message: 'Please input your password!',
      },
    ],
    deFaultValue: JSON.parse(sessionStorage.getItem('logType'))||'',
  },
  nextItem: (currentValue) => null
}

export {
  formItem1
}

FromItemDyNew:

import { useEffect,useState } from 'react';
import {Radio, Select ,Checkbox, Form, Button} from 'antd';
import {formItem1} from './Item.config';
function FromItemDyNew() {
  const [useform] = Form.useForm();


  const onFinish = (values) => {
    console.log('Success:', values);

  };
  const onFinishFailed = (errorInfo) => {
    console.log('Failed:', errorInfo);
  };

  return (<>
    FormDyNew动态表单:
    <br />
    <Form
    form={useform}
    name="basic"
    labelCol={{
      span: 8,
    }}
    wrapperCol={{
      span: 16,
    }}
    style={{
      maxWidth: 600,
    }}
    initialValues={{
      remember: true,
    }}
    // initialValues	表单默认值,只有初始化以及重置时生效	object
    onFinish={onFinish}
    onFinishFailed={onFinishFailed}
    autoComplete="off"
  >
    <DeepFormItem config ={formItem1} useform={useform}/>
    <Form.Item
      wrapperCol={{
        offset: 8,
        span: 16,
      }}
    >
      <Button type="primary" htmlType="submit">
        Submit
      </Button>
    </Form.Item>
  </Form>
  </>)
};
export default FromItemDyNew;

function DeepFormItem({config, useform}) {
  const [filedValue, setFiledValue] = useState("");
  const [nextConfig, setNextConfig] = useState(null);

  const handleInputChange = () => {

  };

  const handleSelectChange = (e) => {
    setFiledValue(e);
  };

  const handleRadioChange = (e) => {
    setFiledValue(e.target.value);
  };

  const handleCheckboxChange = (e) => {
    console.log(e);
    setFiledValue(e);
  };

  useEffect(() => {
    // config的时候第一次渲染。
    if (config === null) {
      return;
    }
    // if (config.name === 'logType') {
    //   const res = config.nextItem(filedValue);
    //   setNextConfig(res);
    //   return;
    // }

    let commonValue = '';
    
    if (filedValue === '') {
      console.log("config",config);
      commonValue = config.payload.deFaultValue;
      useform.setFieldsValue({
        [config.payload.name]: commonValue,
      });
      if(commonValue !== '') {
        sessionStorage.setItem([config.payload.name], JSON.stringify(commonValue));
      }
      // session取出字符串变成数组: 这里面需要字符串数组变成数组。取出来的时候是数组。
    } else {
      sessionStorage.setItem([config.payload.name], JSON.stringify(filedValue));
      commonValue = filedValue;
    }
    const nextI = config.nextItem(commonValue);
    setNextConfig(nextI);
  }, [config,filedValue]);
  

  return (
    <>{
      (config !== null) && (<>
        {/* <Form.Item 
          label={config.payload.label}
          name={config.payload.name}
          rules={[
            {
              required: true,
              message: 'Please input your password!',
            },
          ]}
        > */}
        {config.type === 'select' && 
                <Form.Item 
                label={config.payload.label}
                name={config.payload.name}
                // initialvalues={config?.payload?.deFaultValue} 现在不起作用了
                rules={[
                  {
                    required: true,
                    message: 'Please input your password!',
                  },
                ]}
              >
            <Select 
              value={filedValue} 
              options={config.payload.options}
              onChange={handleSelectChange}
            />
            </Form.Item>
          }
          {config.type === 'radio' && 
            <Form.Item 
            label={config.payload.label}
            name={config.payload.name}
                // initialvalues={config?.payload?.deFaultValue} 现在不起作用了
            rules={[
              {
                required: true,
                message: 'Please input your password!',
              },
            ]}
          >
            <Radio.Group 
              value={filedValue} 
              options={config.payload.options}
              onChange={handleRadioChange}
            />
            </Form.Item>
          }
          {config.type === 'checkbox' && 
            <Form.Item 
            label={config.payload.label}
            name={config.payload.name}
            // initialvalues={config?.payload?.deFaultValue} 现在不起作用了
            rules={[
              {
                required: true,
                message: 'Please input your password!',
              },
            ]}
          >
            <Checkbox.Group
              value={filedValue} 
              options={config.payload.options}
              onChange={handleCheckboxChange}
            />
            </Form.Item>
          }
        {/* </Form.Item> */}
        <DeepFormItem config={nextConfig} useform={useform}/>
      </>)
    }
    </>
  );
}
// 我现在的想法是。如果选择到了,产品类型,给你默认全部选择。
// 能不能给产品类型初始化呢?啥意思呢。就是给产品类型。useState进行初始化。
// 那我在config 里面进行传值就行了。如果config里面配置一个。