nestArrayField.jsx 6.4 KB

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