RelModal.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import { useEffect, useMemo, useState } from 'react';
  2. import { Modal, Select, Table } from 'antd';
  3. const RelModal = (props) => {
  4. const { item, formList = [], visible, onCancel, onChange } = props;
  5. // const [linked, setLined] = useState([]);
  6. const [data, setData] = useState([]);
  7. useEffect(() => {
  8. let result = [];
  9. if (!item) {
  10. result = [];
  11. } else {
  12. const { componentName, props } = item;
  13. const selects = formList
  14. .filter(
  15. (curItem) => curItem.props?.required && curItem.props.id !== props.id,
  16. )
  17. .map((item) => item.props);
  18. result = props.options?.map((cur) => {
  19. const linked = props.linked[cur] || [];
  20. return { name: cur, selects, linked };
  21. });
  22. }
  23. setData(result);
  24. }, [item, formList]);
  25. const columns = [
  26. {
  27. title: '当选项为',
  28. dataIndex: 'name',
  29. key: 'name',
  30. width: '30%',
  31. },
  32. {
  33. title: '显示以下控件',
  34. render: (record) => (
  35. <Select
  36. value={record.linked}
  37. mode="multiple"
  38. placeholder="请选择"
  39. style={{ width: '100%' }}
  40. onChange={(value) => {
  41. const item = { ...record, linked: value };
  42. const newData = JSON.parse(JSON.stringify(data));
  43. const index = data.findIndex((item) => item.name == record.name);
  44. newData[index] = item;
  45. setData(newData);
  46. }}
  47. options={record.selects.map((item) => {
  48. return { label: item.label, value: item.id };
  49. })}
  50. />
  51. ),
  52. },
  53. ];
  54. return (
  55. <Modal
  56. title="单选框-选项关联"
  57. open={visible}
  58. onCancel={onCancel}
  59. onOk={() => {
  60. const linked = {};
  61. data?.forEach((cur) => {
  62. linked[cur.name] = cur.linked;
  63. });
  64. onChange?.({ linked });
  65. }}
  66. width={1000}
  67. pagination={false}
  68. >
  69. <div>根据选择的选项,显示其他控件,当前控件和上级选项不能被关联显示</div>
  70. <Table dataSource={data} columns={columns}></Table>
  71. </Modal>
  72. );
  73. };
  74. export default RelModal;