arrayFieldDemo.jsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /* eslint-disable */
  2. import React, { useState, useLayoutEffect, Component } from 'react';
  3. import { storiesOf } from '@storybook/react';
  4. import { Button, Modal, TreeSelect, Row, Col, Avatar, Select as BasicSelect,
  5. Form,
  6. useFormState,
  7. useFormApi,
  8. useFieldApi,
  9. useFieldState,
  10. withFormState,
  11. withFormApi,
  12. withField,
  13. ArrayField,
  14. AutoComplete,
  15. Collapse,
  16. Space,
  17. Icon } from '../../../index';
  18. import { ComponentUsingFormState } from '../Hook/hookDemo';
  19. const { Input, Select, DatePicker, Switch, Slider, CheckboxGroup, Checkbox, RadioGroup, Radio, TimePicker, InputNumber, InputGroup } = Form;
  20. class ArrayFieldCollapseDemo extends React.Component {
  21. constructor() {
  22. super();
  23. this.state = {
  24. actions: [],
  25. };
  26. }
  27. renderItems(arrayFields, values) {
  28. console.log(values);
  29. return (
  30. <Collapse keepDOM>
  31. {JSON.stringify(values)}
  32. {arrayFields.map(({ field, key, remove }, i) => (
  33. <Collapse.Panel header="触发条件" itemKey={i.toString()} key={key}>
  34. <Form.Input
  35. field={`${field}[name]`}
  36. label={`特效类型:(${field}.name)`}
  37. style={{ width: 200, marginRight: 16 }}
  38. />
  39. <Button type="danger" onClick={remove} style={{ margin: 16 }}>
  40. remove
  41. </Button>
  42. </Collapse.Panel>
  43. ))}
  44. {/* {arrayFields.length && values.actions[0].name ? '2' : '1'} */}
  45. </Collapse>
  46. );
  47. }
  48. render() {
  49. let { actions } = this.state;
  50. return (
  51. <Form style={{ width: 500 }} labelPosition="left" labelWidth="220px" allowEmpty>
  52. {({ values }) => (
  53. <ArrayField field="actions" initValue={actions}>
  54. {({ add, arrayFields }) => (
  55. <React.Fragment>
  56. <Button onClick={add}>Add</Button>
  57. {this.renderItems(arrayFields, values)}
  58. </React.Fragment>
  59. )}
  60. </ArrayField>
  61. )}
  62. </Form>
  63. );
  64. }
  65. }
  66. // 使用Form Props设置 ArrayField的initValues
  67. class ArrayFieldWithFormInitValues extends React.Component {
  68. constructor() {
  69. super();
  70. this.state = {
  71. data: {
  72. c: 'c',
  73. effects: [
  74. { name: 'form-level-init-sugar', time: 'form-level-init-3min', otherKey: 1 },
  75. { name: 'form-level-init-bacon', time: 'form-level-init-6min', otherKey: 2, key: 343 },
  76. ],
  77. },
  78. flag: true
  79. };
  80. this.getFormApi = this.getFormApi.bind(this);
  81. this.change = this.change.bind(this);
  82. }
  83. change = () => {
  84. let number = this.formApi.getValue('number');
  85. let newData = Array.from({ length: number }, (v, i) => ({
  86. name: `${i}-name`,
  87. time: `${i}-time`
  88. }));
  89. console.log(newData);
  90. this.formApi.setValue('effects', newData);
  91. }
  92. getFormApi(formApi) {
  93. this.formApi = formApi;
  94. }
  95. render() {
  96. return (
  97. <Form
  98. onChange={(...v) => console.log('onchange:' + v)}
  99. onValueChange={(...v) => console.log('onValueChange:' + v)}
  100. getFormApi={this.getFormApi}
  101. initValues={this.state.data}
  102. >
  103. {/* <Button onClick={this.setValues}>setValues</Button> */}
  104. <Row>
  105. <Col span={12}>
  106. <ArrayField field="effects">
  107. {({ add, arrayFields }) => (
  108. <React.Fragment>
  109. <Button onClick={add} type="primary">Add</Button>
  110. {
  111. arrayFields.map(({ field, key, remove }, i) => (
  112. <div key={key}>
  113. <Input
  114. field={`${field}[name]`}
  115. label={`${field}.name`}
  116. // initValue="field-level-init-2D"
  117. />
  118. <Input
  119. field={`${field}[time]`}
  120. label={`${field}.time`}
  121. />
  122. <Button type="danger" onClick={remove}>remove</Button>
  123. </div>
  124. ))
  125. }
  126. </React.Fragment>
  127. )}
  128. </ArrayField>
  129. <Button htmlType="submit">submit</Button>
  130. <Button htmlType='reset'>Reset</Button>
  131. <Form.InputNumber field="number" label="期望个数" />
  132. <Button onClick={this.change}>改变</Button>
  133. </Col>
  134. <Col span={12}>
  135. <ComponentUsingFormState />
  136. </Col>
  137. </Row>
  138. </Form>
  139. );
  140. }
  141. }
  142. // 使用 ArrayField props initValue来设置初始值
  143. class ArrayFieldWithInitValue extends React.Component {
  144. constructor() {
  145. super();
  146. this.state = {
  147. data: {
  148. effects: [
  149. { name: 'arrayField-props.initValue-0-name', time: 'arrayField-props.initValue-0-time', otherKey: 1 },
  150. { name: 'arrayField-props.initValue-1-name', time: 'arrayField-props.initValue-1-time', otherKey: 453 },
  151. ],
  152. },
  153. flag: true
  154. };
  155. this.getFormApi = this.getFormApi.bind(this);
  156. this.change = this.change.bind(this);
  157. }
  158. change = () => {
  159. let number = this.formApi.getValue('number');
  160. let newData = Array.from({ length: 2 }, (v, i) => ({
  161. name: `${i}-name`,
  162. time: `${i}-time`
  163. }));
  164. console.log(newData);
  165. this.formApi.setValue('effects', newData);
  166. }
  167. getFormApi(formApi) {
  168. this.formApi = formApi;
  169. }
  170. render() {
  171. const { effects } = this.state.data;
  172. return (
  173. <Form
  174. onChange={(...v) => console.log('onchange:' + v)}
  175. onValueChange={(...v) => console.log('onValueChange:' + v)}
  176. getFormApi={this.getFormApi}
  177. >
  178. {/* <Button onClick={this.setValues}>setValues</Button> */}
  179. <Row>
  180. <Col span={12}>
  181. <ArrayField field="effects" initValue={effects}>
  182. {({ add, arrayFields }) => (
  183. <React.Fragment>
  184. <Button onClick={add} type="primary">Add</Button>
  185. {
  186. arrayFields.map(({ field, key, remove }, i) => (
  187. <div key={key}>
  188. <Input
  189. field={`${field}[name]`}
  190. label={`${field}.name`}
  191. // initValue="field-level-init-2D"
  192. />
  193. <Input
  194. field={`${field}[time]`}
  195. label={`${field}.time`}
  196. />
  197. <Button type="danger" onClick={remove}>remove</Button>
  198. </div>
  199. ))
  200. }
  201. </React.Fragment>
  202. )}
  203. </ArrayField>
  204. <Button htmlType="submit">submit</Button>
  205. <Button htmlType='reset'>Reset</Button>
  206. {/* <Form.InputNumber field="number" label="期望个数" /> */}
  207. {/* <Button onClick={this.change}>改变</Button> */}
  208. </Col>
  209. <Col span={12}>
  210. <ComponentUsingFormState />
  211. </Col>
  212. </Row>
  213. </Form>
  214. );
  215. }
  216. }
  217. /* basic usage */
  218. class ArrayFieldDemo extends React.Component {
  219. constructor() {
  220. super();
  221. this.state = {
  222. data: {
  223. c: 'c',
  224. test: [
  225. // {},
  226. // {},
  227. { name: 'sugar', time: '3min' },
  228. // { name: 'bacon', time: '6min', key: 'c2' },
  229. { name: 'bacon', time: '6min' },
  230. ],
  231. },
  232. flag: true
  233. };
  234. this.getFormApi = this.getFormApi.bind(this);
  235. }
  236. change = () => {
  237. let number = this.formApi.getValue('number');
  238. let newData = Array.from({ length: number }, (v, i) => ({
  239. name: `${i}-name`,
  240. time: `${i}-time`
  241. }));
  242. this.formApi.setValue('effects', newData);
  243. }
  244. clear = () => {
  245. // this.formApi.setValues({ number: 3 });
  246. // this.formApi.setValues({}, { isOverride: true });
  247. this.formApi.setValues({ number: 3 }, { isOverride: true });
  248. }
  249. getFormApi(formApi) {
  250. this.formApi = formApi;
  251. }
  252. render() {
  253. return (
  254. <Form
  255. // onChange={(...v) => console.log(v)}
  256. onValueChange={(...v) => console.log(v)}
  257. getFormApi={this.getFormApi}>
  258. <Row>
  259. <Col span={12}>
  260. <ArrayField field="effects" initValue={this.state.data.test}>
  261. {({ add, arrayFields }) => (
  262. <React.Fragment>
  263. <Button onClick={add} type="primary">Add</Button>
  264. <Button onClick={this.clear} type="primary">Clear by setValues empty Object</Button>
  265. {
  266. arrayFields.map(({ field, key, remove }, i) => (
  267. <div key={key}>
  268. <Input
  269. field={`${field}[name]`}
  270. label={`${field}.name`}
  271. // initValue='test'
  272. />
  273. <Input
  274. field={`${field}[time]`}
  275. label={`${field}.time`}
  276. />
  277. <Button type="danger" onClick={remove}>remove</Button>
  278. </div>
  279. ))
  280. }
  281. </React.Fragment>
  282. )}
  283. </ArrayField>
  284. <Form.InputNumber field="number" label="期望个数" />
  285. <Space>
  286. <Button onClick={this.change}>改变</Button>
  287. <Button htmlType="submit">submit</Button>
  288. <Button htmlType='reset'>Reset</Button>
  289. </Space>
  290. </Col>
  291. <Col span={12}>
  292. <ComponentUsingFormState />
  293. </Col>
  294. </Row>
  295. </Form>
  296. );
  297. }
  298. }
  299. export { ArrayFieldCollapseDemo, ArrayFieldDemo, ArrayFieldWithFormInitValues, ArrayFieldWithInitValue };