asyncNested.jsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { IconPlusCircle } from "@douyinfe/semi-icons";
  2. import { ArrayField, Button, Card, Form } from "@douyinfe/semi-ui";
  3. import React, { useEffect, useState } from "react";
  4. const AsyncComponent = ({ field }) => {
  5. const [done, setDone] = useState(false);
  6. useEffect(() => {
  7. setTimeout(() => {
  8. setDone(true);
  9. }, 10);
  10. }, []);
  11. const ret = done ? (
  12. <Form.Input
  13. field={field}
  14. style={{ width: 100, marginRight: 12 }}
  15. ></Form.Input>
  16. ) : null;
  17. return <>{ret} 这里是异步组件</>;
  18. };
  19. const NestedField = (props) => {
  20. const rowStyle = {
  21. marginTop: 12,
  22. marginLeft: 12,
  23. };
  24. return (
  25. <Form.Slot label="内层">
  26. <ArrayField field={`${props.field}.rules`}>
  27. {({ add, arrayFields }) => (
  28. <React.Fragment>
  29. {arrayFields.map(({ field, key }) => (
  30. <div style={{ display: "flex" }} key={key}>
  31. <AsyncComponent field={`${field}[itemName]`} />
  32. </div>
  33. ))}
  34. <Button
  35. icon={<IconPlusCircle />}
  36. style={rowStyle}
  37. onClick={() => {
  38. return add();
  39. }}
  40. />
  41. </React.Fragment>
  42. )}
  43. </ArrayField>
  44. </Form.Slot>
  45. );
  46. };
  47. const AsyncNestArrayField = () => {
  48. return (
  49. <Form labelPosition="left" style={{ textAlign: "left" }}>
  50. <Form.Slot label="外层">
  51. <ArrayField field="group">
  52. {({ add, arrayFields }) => (
  53. <React.Fragment>
  54. <Button
  55. icon={<IconPlusCircle />}
  56. theme="solid"
  57. onClick={() => {
  58. return add();
  59. }}
  60. >
  61. 新增收信规则
  62. </Button>
  63. {arrayFields.map(({ field, key, remove }, i) => (
  64. <div
  65. key={key}
  66. style={{ width: 1000, display: "flex", flexWrap: "wrap" }}
  67. >
  68. <Card
  69. shadow="hover"
  70. style={{
  71. width: 620,
  72. margin: "12px 0 0 24px",
  73. }}
  74. >
  75. <NestedField field={field} />
  76. </Card>
  77. </div>
  78. ))}
  79. </React.Fragment>
  80. )}
  81. </ArrayField>
  82. </Form.Slot>
  83. </Form>
  84. );
  85. };
  86. export default AsyncNestArrayField;