nestArrayField.jsx 6.2 KB

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