知与行后台管理端

WrapperItem.jsx 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import React from 'react';
  2. import {
  3. Form,
  4. Input,
  5. InputNumber,
  6. Checkbox,
  7. Radio,
  8. DatePicker,
  9. TimePicker,
  10. Select,
  11. } from 'antd';
  12. import ImageUploader from './ImageUpload';
  13. const Item = Form.Item
  14. const { Option } = Select;
  15. const { MonthPicker, RangePicker } = DatePicker
  16. const FieldTypes = {
  17. Text: 'Text',
  18. Password: 'Password',
  19. Number: 'Number',
  20. Switch: 'Switch',
  21. TimePicker: 'TimePicker',
  22. DatePicker: 'DatePicker',
  23. RangePicker: 'RangePicker',
  24. MonthPicker: 'MonthPicker',
  25. Select: 'Select',
  26. ImageUploader: 'ImageUploader',
  27. }
  28. const tailFormItemLayout = {
  29. wrapperCol: {
  30. xs: {
  31. span: 24,
  32. offset: 0,
  33. },
  34. sm: {
  35. span: 16,
  36. offset: 8,
  37. },
  38. },
  39. };
  40. const WrapperItem = (props) => {
  41. const {
  42. form,
  43. label,
  44. name,
  45. type,
  46. placeholder,
  47. render,
  48. rules,
  49. value,
  50. dict,
  51. action,
  52. props: fieldProps,
  53. ...restProps
  54. } = props;
  55. const { getFieldDecorator } = form || {};
  56. let config = {
  57. rules,
  58. initialValue: value
  59. }
  60. if (type === FieldTypes.Switch) {
  61. config = {
  62. ...config,
  63. valuePropName: 'checked',
  64. };
  65. }
  66. if (type === FieldTypes.ImageUploader) {
  67. config = {
  68. ...config,
  69. getValueFromEvent: x => x,
  70. };
  71. }
  72. // 没有类型与组件, 生成隐藏字段
  73. if (!type && !render) {
  74. getFieldDecorator(name, config);
  75. return <></>;
  76. }
  77. const SelectOpts = (dict || []).map((item, index) => (<Option value={item.value}>{item.name}</Option>))
  78. let Field = <></>;
  79. if (render) {
  80. Field = typeof render === 'function' ? render(props) : render
  81. } else {
  82. switch (type) {
  83. case FieldTypes.Text:
  84. Field = <Input placeholder={placeholder} style={{ width: '100%' }} {...fieldProps}/>;
  85. break;
  86. case FieldTypes.Password:
  87. Field = <Input.Password placeholder={placeholder} style={{ width: '100%' }} {...fieldProps}/>;
  88. break;
  89. case FieldTypes.Number:
  90. Field = <InputNumber placeholder={placeholder} style={{ width: '100%' }} {...fieldProps}/>;
  91. break;
  92. case FieldTypes.Switch:
  93. Field = <Switch {...fieldProps} />;
  94. break;
  95. case FieldTypes.TimePicker:
  96. Field = <TimePicker {...fieldProps} style={{ width: '100%' }}/>;
  97. break;
  98. case FieldTypes.DatePicker:
  99. Field = <DatePicker {...fieldProps} style={{ width: '100%' }}/>;
  100. break;
  101. case FieldTypes.RangePicker:
  102. Field = <RangePicker {...fieldProps} style={{ width: '100%' }}/>;
  103. break;
  104. case FieldTypes.MonthPicker:
  105. Field = <MonthPicker {...fieldProps} style={{ width: '100%' }}/>;
  106. break;
  107. case FieldTypes.Select:
  108. Field = <Select placeholder={placeholder} style={{ width: '100%' }} {...fieldProps}>{SelectOpts}</Select>
  109. break;
  110. case FieldTypes.ImageUploader:
  111. Field = <ImageUploader {...fieldProps}/>
  112. break;
  113. default:
  114. throw new Error(`暂时不支持的组件类型: ${type}`)
  115. }
  116. }
  117. if (!label && !name && !action) return Field;
  118. const itemProps = action ? { ...restProps, ...tailFormItemLayout } : restProps
  119. return (
  120. <Item label={label} {...itemProps}>
  121. {action ? Field : getFieldDecorator(name, config)(Field)}
  122. </Item>
  123. )
  124. };
  125. export default WrapperItem;
  126. export { FieldTypes };