nestArrayField.jsx 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import React, { useState, useLayoutEffect, Component } from 'react';
  2. import { storiesOf } from '@storybook/react';
  3. import { Button, Modal, TreeSelect, Row, Col, Avatar, Select as BasicSelect,
  4. Form,
  5. useFormState,
  6. useFormApi,
  7. useFieldApi,
  8. useFieldState,
  9. withFormState,
  10. withFormApi,
  11. withField,
  12. ArrayField,
  13. } from '../../../index';
  14. import { format } from 'date-fns';
  15. import { ComponentUsingFormState } from '../Hook/hookDemo';
  16. const { Input, Select, DatePicker, Switch, Slider, CheckboxGroup, Checkbox, RadioGroup, Radio, TimePicker, InputNumber, InputGroup } = Form;
  17. class NestArrayField extends React.Component {
  18. constructor() {
  19. super();
  20. this.state = {
  21. data: {
  22. group: [
  23. {
  24. name: '0',
  25. // name: '0', items: [ { itemName: 'form', type: '0-1' } ],
  26. },
  27. // {
  28. // name: '1', items: [ { itemName: 'form', type: '1-1' } ],
  29. // }
  30. ],
  31. },
  32. flag: true
  33. };
  34. this.getFormApi = this.getFormApi.bind(this);
  35. this.change = this.change.bind(this);
  36. }
  37. change = () => {
  38. let number = this.formApi.getValue('number');
  39. let newData = {
  40. group: [
  41. { name: Math.random().toString().slice(0, 3), items: [ { itemName: Math.random(), type: '0-1' } ] },
  42. // { name: Math.random(), items: [ { itemName: Math.random(), type: '0-1' } ] },
  43. ]
  44. };
  45. this.formApi.setValues(newData, { isOverride: true });
  46. }
  47. getFormApi(formApi) {
  48. this.formApi = formApi;
  49. }
  50. render() {
  51. return (
  52. <Form
  53. onValueChange={(values)=>console.log(values)}
  54. getFormApi={this.getFormApi}
  55. initValues={this.state.data}
  56. >
  57. <Row>
  58. <Col span={12}>
  59. <ArrayField field='group'>
  60. {({ add, arrayFields, addWithInitValue }) => (
  61. <React.Fragment>
  62. <Button onClick={() => addWithInitValue({ name: 1 })} type='primary'>Add level-1</Button>
  63. <Button onClick={this.change}>改变</Button>
  64. {
  65. arrayFields.map(({ field, key, remove }, i) => (
  66. <div key={key} style={{ width: 1000 }}>
  67. <Input
  68. field={`${field}[name]`}
  69. label={`${field}.name`}
  70. style={{ width: 200 }}
  71. >
  72. </Input>
  73. <ArrayField field={`${field}.items`}>
  74. {({ add, arrayFields, addWithInitValue }) => (
  75. <div style={{ marginLeft: 50 }}>
  76. <Button onClick={() => addWithInitValue({ itemName: '2-1' })} type='primary'>add via api</Button>
  77. <Button onClick={add} type='primary'>add via props.initvalues</Button>
  78. {
  79. arrayFields.map(({ field, key, remove }, i) => (
  80. <div key={key}>
  81. <Input
  82. style={{ width: 150 }}
  83. field={`${field}.itemName`}
  84. label={`${field}.itemName`}
  85. initValue='2d'
  86. >
  87. </Input>
  88. <Button type='danger' onClick={remove}>remove level-2</Button>
  89. </div>
  90. ))
  91. }
  92. </div>
  93. )}
  94. </ArrayField>
  95. <Button type='danger' onClick={remove}>remove level-1</Button>
  96. </div>
  97. ))
  98. }
  99. </React.Fragment>
  100. )}
  101. </ArrayField>
  102. </Col>
  103. <Col span={12}>
  104. <ComponentUsingFormState/>
  105. </Col>
  106. </Row>
  107. </Form>
  108. );
  109. }
  110. }
  111. class Child extends React.Component {
  112. constructor(props) {
  113. super(props);
  114. this.state = {
  115. ts: format(new Date(), 'yyyy-MM-dd HH:mm:ss')
  116. };
  117. }
  118. render() {
  119. return <div>
  120. {this.state.ts}
  121. </div>;
  122. }
  123. }
  124. class Parent extends React.Component {
  125. constructor(props) {
  126. super(props);
  127. this.click = this.click.bind(this);
  128. }
  129. click() {
  130. this.forceUpdate();
  131. }
  132. render() {
  133. return <div>
  134. {[1, 2, 3].map(i => (
  135. <div key={i}>
  136. <Child></Child>
  137. </div>
  138. ))}
  139. <Button onClick={this.click}>change</Button>
  140. </div>;
  141. }
  142. }
  143. export { NestArrayField, Parent };