arrayFieldDemo.jsx 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. /* eslint-disable */
  2. import React, { useState, useLayoutEffect, Component } from '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. Space,
  16. TextArea,
  17. Icon } from '../../../index';
  18. import { IconPlusCircle, IconMinusCircle, } from '@douyinfe/semi-icons';
  19. import { ComponentUsingFormState } from '../Hook/hookDemo';
  20. const { Input, Select, DatePicker, Switch, Slider, CheckboxGroup, Checkbox, RadioGroup, Radio, TimePicker, InputNumber, InputGroup } = Form;
  21. class ArrayFieldCollapseDemo extends React.Component {
  22. constructor() {
  23. super();
  24. this.state = {
  25. actions: [],
  26. };
  27. }
  28. renderItems(arrayFields, values) {
  29. console.log(values);
  30. return (
  31. <Collapse keepDOM>
  32. {JSON.stringify(values)}
  33. {arrayFields.map(({ field, key, remove }, i) => (
  34. <Collapse.Panel header="触发条件" itemKey={i.toString()} key={key}>
  35. <Form.Input
  36. field={`${field}[name]`}
  37. label={`特效类型:(${field}.name)`}
  38. style={{ width: 200, marginRight: 16 }}
  39. />
  40. <Button type="danger" onClick={remove} style={{ margin: 16 }}>
  41. remove
  42. </Button>
  43. </Collapse.Panel>
  44. ))}
  45. {/* {arrayFields.length && values.actions[0].name ? '2' : '1'} */}
  46. </Collapse>
  47. );
  48. }
  49. render() {
  50. let { actions } = this.state;
  51. return (
  52. <Form style={{ width: 500 }} labelPosition="left" labelWidth="220px" allowEmpty>
  53. {({ values }) => (
  54. <ArrayField field="actions" initValue={actions}>
  55. {({ add, arrayFields }) => (
  56. <React.Fragment>
  57. <Button onClick={add}>Add</Button>
  58. {this.renderItems(arrayFields, values)}
  59. </React.Fragment>
  60. )}
  61. </ArrayField>
  62. )}
  63. </Form>
  64. );
  65. }
  66. }
  67. // 使用Form Props设置 ArrayField的initValues
  68. class ArrayFieldWithFormInitValues extends React.Component {
  69. constructor() {
  70. super();
  71. this.state = {
  72. data: {
  73. c: 'c',
  74. effects: [
  75. { name: 'form-level-init-sugar', time: 'form-level-init-3min', otherKey: 1 },
  76. { name: 'form-level-init-bacon', time: 'form-level-init-6min', otherKey: 2, key: 343 },
  77. ],
  78. },
  79. flag: true
  80. };
  81. this.getFormApi = this.getFormApi.bind(this);
  82. this.change = this.change.bind(this);
  83. }
  84. change = () => {
  85. let number = this.formApi.getValue('number');
  86. let newData = Array.from({ length: number }, (v, i) => ({
  87. name: `${i}-name`,
  88. time: `${i}-time`
  89. }));
  90. console.log(newData);
  91. this.formApi.setValue('effects', newData);
  92. }
  93. getFormApi(formApi) {
  94. this.formApi = formApi;
  95. }
  96. render() {
  97. return (
  98. <Form
  99. onChange={(...v) => console.log('onchange:' + v)}
  100. onValueChange={(...v) => console.log('onValueChange:' + v)}
  101. getFormApi={this.getFormApi}
  102. initValues={this.state.data}
  103. >
  104. {/* <Button onClick={this.setValues}>setValues</Button> */}
  105. <Row>
  106. <Col span={12}>
  107. <ArrayField field="effects">
  108. {({ add, arrayFields }) => (
  109. <React.Fragment>
  110. <Button onClick={add} type="primary">Add</Button>
  111. {
  112. arrayFields.map(({ field, key, remove }, i) => (
  113. <div key={key}>
  114. <Input
  115. field={`${field}[name]`}
  116. label={`${field}.name`}
  117. // initValue="field-level-init-2D"
  118. />
  119. <Input
  120. field={`${field}[time]`}
  121. label={`${field}.time`}
  122. />
  123. <Button type="danger" onClick={remove}>remove</Button>
  124. </div>
  125. ))
  126. }
  127. </React.Fragment>
  128. )}
  129. </ArrayField>
  130. <Button htmlType="submit">submit</Button>
  131. <Button htmlType='reset'>Reset</Button>
  132. <Form.InputNumber field="number" label="期望个数" />
  133. <Button onClick={this.change}>改变</Button>
  134. </Col>
  135. <Col span={12}>
  136. <ComponentUsingFormState />
  137. </Col>
  138. </Row>
  139. </Form>
  140. );
  141. }
  142. }
  143. // 使用 ArrayField props initValue来设置初始值
  144. class ArrayFieldWithInitValue extends React.Component {
  145. constructor() {
  146. super();
  147. this.state = {
  148. data: {
  149. effects: [
  150. { name: 'arrayField-props.initValue-0-name', time: 'arrayField-props.initValue-0-time', otherKey: 1 },
  151. { name: 'arrayField-props.initValue-1-name', time: 'arrayField-props.initValue-1-time', otherKey: 453 },
  152. ],
  153. },
  154. flag: true
  155. };
  156. this.getFormApi = this.getFormApi.bind(this);
  157. this.change = this.change.bind(this);
  158. }
  159. componentDidMount() {
  160. this.formApi.setValues({
  161. effects: [
  162. { name: "脸部贴纸", type: "2D" },
  163. { name: "前景贴纸", type: "3D" },
  164. ],
  165. test: 'fff'
  166. })
  167. }
  168. change = () => {
  169. let number = this.formApi.getValue('number');
  170. let newData = Array.from({ length: 2 }, (v, i) => ({
  171. name: `${i}-name`,
  172. time: `${i}-time`
  173. }));
  174. console.log(newData);
  175. this.formApi.setValue('effects', newData);
  176. }
  177. getFormApi(formApi) {
  178. this.formApi = formApi;
  179. }
  180. render() {
  181. const { effects } = this.state.data;
  182. return (
  183. <Form
  184. onChange={(...v) => console.log('onchange:' + v)}
  185. onValueChange={(...v) => console.log('onValueChange:' + v)}
  186. getFormApi={this.getFormApi}
  187. >
  188. {/* <Button onClick={this.setValues}>setValues</Button> */}
  189. <Row>
  190. <Col span={12}>
  191. <ArrayField field="effects">
  192. {({ add, arrayFields }) => (
  193. <React.Fragment>
  194. <Button onClick={add} type="primary">Add</Button>
  195. {
  196. arrayFields.map(({ field, key, remove }, i) => (
  197. <div key={key}>
  198. <Input
  199. field={`${field}[name]`}
  200. label={`${field}.name`}
  201. // initValue="field-level-init-2D"
  202. />
  203. <Input
  204. field={`${field}[time]`}
  205. label={`${field}.time`}
  206. />
  207. <Button type="danger" onClick={remove}>remove</Button>
  208. </div>
  209. ))
  210. }
  211. </React.Fragment>
  212. )}
  213. </ArrayField>
  214. <Button htmlType="submit">submit</Button>
  215. <Button htmlType='reset'>Reset</Button>
  216. {/* <Form.InputNumber field="number" label="期望个数" /> */}
  217. {/* <Button onClick={this.change}>改变</Button> */}
  218. </Col>
  219. <Col span={12}>
  220. <ComponentUsingFormState />
  221. </Col>
  222. </Row>
  223. </Form>
  224. );
  225. }
  226. }
  227. /* basic usage */
  228. class ArrayFieldDemo extends React.Component {
  229. constructor() {
  230. super();
  231. this.state = {
  232. data: {
  233. c: 'c',
  234. test: [
  235. // {},
  236. // {},
  237. { name: 'sugar', time: '3min' },
  238. // { name: 'bacon', time: '6min', key: 'c2' },
  239. { name: 'bacon', time: '6min' },
  240. ],
  241. },
  242. flag: true
  243. };
  244. this.getFormApi = this.getFormApi.bind(this);
  245. }
  246. change = () => {
  247. let number = this.formApi.getValue('number');
  248. let newData = Array.from({ length: number }, (v, i) => ({
  249. name: `${i}-name`,
  250. time: `${i}-time`
  251. }));
  252. this.formApi.setValue('effects', newData);
  253. }
  254. clear = () => {
  255. // this.formApi.setValues({ number: 3 });
  256. // this.formApi.setValues({}, { isOverride: true });
  257. this.formApi.setValues({ number: 3 }, { isOverride: true });
  258. }
  259. getFormApi(formApi) {
  260. this.formApi = formApi;
  261. }
  262. render() {
  263. return (
  264. <Form
  265. // onChange={(...v) => console.log(v)}
  266. onValueChange={(...v) => console.log(v)}
  267. getFormApi={this.getFormApi}>
  268. <Row>
  269. <Col span={12}>
  270. <ArrayField field="effects" initValue={this.state.data.test}>
  271. {({ add, arrayFields }) => (
  272. <React.Fragment>
  273. <Button onClick={add} type="primary">Add</Button>
  274. <Button onClick={this.clear} type="primary">Clear by setValues empty Object</Button>
  275. {
  276. arrayFields.map(({ field, key, remove }, i) => (
  277. <div key={key}>
  278. <Input
  279. field={`${field}[name]`}
  280. label={`${field}.name`}
  281. // initValue='test'
  282. />
  283. <Input
  284. field={`${field}[time]`}
  285. label={`${field}.time`}
  286. />
  287. <Button type="danger" onClick={remove}>remove</Button>
  288. </div>
  289. ))
  290. }
  291. </React.Fragment>
  292. )}
  293. </ArrayField>
  294. <Form.InputNumber field="number" label="期望个数" />
  295. <Space>
  296. <Button onClick={this.change}>改变</Button>
  297. <Button htmlType="submit">submit</Button>
  298. <Button htmlType='reset'>Reset</Button>
  299. </Space>
  300. </Col>
  301. <Col span={12}>
  302. <ComponentUsingFormState />
  303. </Col>
  304. </Row>
  305. </Form>
  306. );
  307. }
  308. }
  309. // Fix 1409
  310. class ArrayFieldSetValues extends React.Component {
  311. constructor() {
  312. super();
  313. this.state = {
  314. data: {
  315. },
  316. };
  317. this.getFormApi = this.getFormApi.bind(this);
  318. }
  319. componentDidMount() {
  320. this.formApi.setValues({
  321. effects: [
  322. { name: "Semi D2C", role: "Engineer" },
  323. { name: "Semi DSM", role: "Designer" },
  324. ],
  325. test: 'fff'
  326. })
  327. }
  328. getFormApi(formApi) {
  329. this.formApi = formApi;
  330. }
  331. render() {
  332. return (
  333. <Form
  334. // onChange={(...v) => console.log(v)}
  335. onValueChange={(...v) => console.log(v)}
  336. getFormApi={this.getFormApi}>
  337. <Row>
  338. <Col span={12}>
  339. <ArrayField field="effects">
  340. {({ add, arrayFields }) => (
  341. <React.Fragment>
  342. <Button onClick={add} type="primary">Add</Button>
  343. {
  344. arrayFields.map(({ field, key, remove }, i) => (
  345. <div key={key}>
  346. <Input
  347. field={`${field}[name]`}
  348. label={`${field}.name`}
  349. // initValue='test'
  350. />
  351. <Input
  352. field={`${field}[role]`}
  353. label={`${field}.role`}
  354. />
  355. <Button type="danger" onClick={remove}>remove</Button>
  356. </div>
  357. ))
  358. }
  359. </React.Fragment>
  360. )}
  361. </ArrayField>
  362. <Form.Input field="test" label="Test" />
  363. <Space>
  364. <Button htmlType='reset'>Reset</Button>
  365. </Space>
  366. </Col>
  367. <Col span={12}>
  368. <ComponentUsingFormState />
  369. </Col>
  370. </Row>
  371. </Form>
  372. );
  373. }
  374. }
  375. class AsyncSetArrayField extends React.Component {
  376. constructor() {
  377. super();
  378. this.state = {
  379. data: [
  380. { name: 'Semi D2C', role: 'Engineer' },
  381. { name: 'Semi C2D', role: 'Designer' },
  382. ]
  383. };
  384. }
  385. getFormApi = (formApi) => {
  386. this.formApi = formApi;
  387. }
  388. change = () => {
  389. let rules = this.formApi.getValue('rules');
  390. if (!rules) {
  391. efferulests = [];
  392. }
  393. rules.push({ name: `Semi ${new Date().valueOf()}`, role: 'Designer', key: rules.length + 1 });
  394. setTimeout(() => {
  395. this.formApi.setValue('rules', rules);
  396. }, 300);
  397. }
  398. render() {
  399. let { data } = this.state;
  400. const ComponentUsingFormState = () => {
  401. const formState = useFormState();
  402. return (
  403. <TextArea style={{ marginTop: 10 }} value={JSON.stringify(formState)} />
  404. );
  405. };
  406. return (
  407. <Form style={{ width: 800 }} labelPosition='left' labelWidth='100px' allowEmpty getFormApi={this.getFormApi}>
  408. <ArrayField field='rules' initValue={data}>
  409. {({ add, arrayFields, addWithInitValue }) => (
  410. <React.Fragment>
  411. <Button onClick={this.change} theme='light'>change</Button>
  412. <Button onClick={add} icon={<IconPlusCircle />} theme='light'>Add new line</Button>
  413. <Button icon={<IconPlusCircle />} onClick={() => {addWithInitValue({ name: `Semi DSM ${arrayFields.length + 1}`, role: 'Designer' });}} style={{ marginLeft: 8 }}>Add new line with init value</Button>
  414. {
  415. arrayFields.map(({ field, key, remove }, i) => (
  416. <div key={key} style={{ width: 1000, display: 'flex' }}>
  417. <Form.Input
  418. field={`${field}[name]`}
  419. label={`${field}.name`}
  420. style={{ width: 200, marginRight: 16 }}
  421. >
  422. </Form.Input>
  423. <Form.Select
  424. field={`${field}[role]`}
  425. label={`${field}.role`}
  426. style={{ width: 120 }}
  427. optionList={[
  428. { label: 'Engineer', value: 'Engineer' },
  429. { label: 'Designer', value: 'Designer' },
  430. ]}
  431. >
  432. </Form.Select>
  433. <Button
  434. type='danger'
  435. theme='borderless'
  436. icon={<IconMinusCircle />}
  437. onClick={remove}
  438. style={{ margin: 12 }}
  439. />
  440. </div>
  441. ))
  442. }
  443. </React.Fragment>
  444. )}
  445. </ArrayField>
  446. <ComponentUsingFormState />
  447. </Form>
  448. );
  449. }
  450. }
  451. export { ArrayFieldCollapseDemo, ArrayFieldDemo, ArrayFieldWithFormInitValues, ArrayFieldWithInitValue, ArrayFieldSetValues, AsyncSetArrayField };