inputNumber.stories.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. import React, { useRef, useState } from 'react';
  2. // import { withKnobs, text, boolean } from '@storybook/addon-knobs';
  3. import './inputNumber.scss';
  4. import InputNumber from '../index';
  5. import Button from '../../button/index';
  6. import { withField, Form } from '../../index';
  7. import { useFormApi } from '../../form';
  8. export default {
  9. title: 'InputNumber',
  10. }
  11. function log(v, e) {
  12. const type = typeof v;
  13. console.log(type, v);
  14. }
  15. const createOnChange = changeFn => {
  16. return (...args) => {
  17. log(...args);
  18. if (typeof changeFn === 'function') {
  19. changeFn(...args);
  20. }
  21. };
  22. };
  23. export const _InputNumber = () => {
  24. const Demo = () => {
  25. const [controlledValue, setControlledValue] = useState(10.1);
  26. const controlledOnChange = createOnChange(setControlledValue);
  27. const [controlledValue2, setControlledValue2] = useState(9);
  28. const controlledOnChange2 = createOnChange(setControlledValue2);
  29. const [decimal, setDecimal] = useState(10.01);
  30. const decimalOnChange = createOnChange(setDecimal);
  31. const [formattedVal, setFormattedVal] = useState(10.02);
  32. const formattedValOnChange = createOnChange(setFormattedVal);
  33. const [formattedDecimal, setFormattedDecimal] = useState(10.03);
  34. const formattedDecimalOnChange = createOnChange(setFormattedDecimal);
  35. return (
  36. <div className="inputNumber">
  37. <label>简单数字输入框</label>
  38. <InputNumber onChange={log} />
  39. <br />
  40. <label>限定上下界与整数步长</label>
  41. <InputNumber max={10} min={0} step={1} />
  42. <br />
  43. <label>限定上下界与小数步长</label>
  44. <InputNumber max={10} min={0} step={0.1} defaultValue={0.2} precision={2} />
  45. <br />
  46. <label>格式化</label>
  47. <InputNumber
  48. defaultValue={1000}
  49. onChange={log}
  50. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  51. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  52. />
  53. <br />
  54. <label>小数(没有初始化值)</label>
  55. <InputNumber precision={2} onChange={log} />
  56. <br />
  57. <label>小数</label>
  58. <InputNumber defaultValue={10.08} precision={2} onChange={log} />
  59. <br />
  60. <label>格式化+小数</label>
  61. <InputNumber
  62. defaultValue={1000}
  63. precision={2}
  64. onChange={log}
  65. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  66. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  67. />
  68. <br />
  69. <label>受控</label>
  70. <InputNumber value={controlledValue} onChange={controlledOnChange} />
  71. <br />
  72. <label>受控+上下界</label>
  73. <InputNumber min={1} max={10} value={controlledValue2} onChange={controlledOnChange2} />
  74. <br />
  75. <label>小数+受控</label>
  76. <InputNumber value={decimal} precision={2} onChange={decimalOnChange} />
  77. <br />
  78. <label>格式化+受控</label>
  79. <InputNumber
  80. defaultValue={1000}
  81. precision={0}
  82. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  83. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  84. onChange={formattedValOnChange}
  85. value={formattedVal}
  86. />
  87. <br />
  88. <label>格式化+小数+受控</label>
  89. <InputNumber
  90. precision={2}
  91. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  92. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  93. onChange={formattedDecimalOnChange}
  94. value={formattedDecimal}
  95. />
  96. </div>
  97. );
  98. };
  99. return <Demo />;
  100. };
  101. _InputNumber.story = {
  102. name: 'Input number',
  103. };
  104. export const InputnumberUseRefCallFocus = () => {
  105. const Demo = () => {
  106. const ref = useRef();
  107. const focus = () => {
  108. ref.current && ref.current.focus();
  109. };
  110. const blur = () => ref.current && ref.current.blur();
  111. return (
  112. <>
  113. <InputNumber ref={ref} />
  114. <Button onClick={focus}>focus</Button>
  115. <Button onClick={blur}>blur</Button>
  116. </>
  117. );
  118. };
  119. return <Demo />;
  120. };
  121. InputnumberUseRefCallFocus.story = {
  122. name: 'inputnumber use ref call focus',
  123. };
  124. export const UncontrolledInputNumber = () => {
  125. const Demo = function Demo(props = {}) {
  126. return (
  127. <div style={{ width: 450, padding: 20 }}>
  128. <h5>defaultValue</h5>
  129. <InputNumber defaultValue={1020} onChange={log} />
  130. <br />
  131. <h5>defaultValue + formatter + parser</h5>
  132. <InputNumber
  133. defaultValue={1020}
  134. onChange={log}
  135. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  136. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  137. />
  138. <br />
  139. <h5>defaultValue + precision + formatter + parser</h5>
  140. <InputNumber
  141. defaultValue={1020}
  142. precision={2}
  143. onChange={log}
  144. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  145. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  146. />
  147. <br />
  148. <h5>defaultValue + precision + max + min + formatter + parser</h5>
  149. <InputNumber
  150. defaultValue={1020}
  151. precision={2}
  152. onChange={log}
  153. max={1000}
  154. min={500}
  155. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  156. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  157. />
  158. <br />
  159. </div>
  160. );
  161. };
  162. return <Demo />;
  163. };
  164. UncontrolledInputNumber.story = {
  165. name: 'uncontrolled InputNumber',
  166. };
  167. export const ControlledInputNumber = () => {
  168. const ControlledDemo = function ControlledDemo(props = {}) {
  169. const [value, setValue] = useState(0);
  170. const _setValue = createOnChange(setValue);
  171. const [value1, setValue1] = useState(0.234);
  172. const _setValue1 = createOnChange(setValue1);
  173. const [value2, setValue2] = useState(1000);
  174. const _setValue2 = createOnChange(setValue2);
  175. const [value3, setValue3] = useState(0.21);
  176. const _setValue3 = createOnChange(setValue3);
  177. const [value4, setValue4] = useState(3);
  178. const randomSetValue4 = createOnChange(v => {
  179. setValue4(Math.random() * 3 + 1);
  180. });
  181. const [value5, setValue5] = useState(5);
  182. const randomSetValue5 = createOnChange(v => {
  183. setValue5(Math.random() * 5 + 1);
  184. });
  185. const [value6, setValue6] = useState(6);
  186. const randomSetValue6 = createOnChange(v => {
  187. const num = Math.random() * 10 + 9;
  188. console.log('random set: ', num);
  189. setValue6(num);
  190. });
  191. const _setValue6 = createOnChange(setValue6);
  192. return (
  193. <div style={{ width: 450, padding: 20 }}>
  194. <h5>defaultValue</h5>
  195. <InputNumber defaultValue={1020} onChange={log} />
  196. <br />
  197. <h5>value</h5>
  198. <InputNumber value={1000} onChange={log} />
  199. <br />
  200. <h5>value + onChange</h5>
  201. <InputNumber value={value} onChange={_setValue} onBlur={() => console.log('blur')} />
  202. <br />
  203. <h5>value + precision + onChange</h5>
  204. <InputNumber value={value1} onChange={_setValue1} precision={2} />
  205. <br />
  206. <h5>value + step + precision + onChange</h5>
  207. <InputNumber step={0.2} value={value3} onChange={_setValue3} precision={2} />
  208. <br />
  209. <h5>value + precision + onChange + formatter + parser</h5>
  210. <Button onClick={() => setValue2(undefined)}>Empty</Button>
  211. <InputNumber
  212. value={value2}
  213. precision={2}
  214. onChange={_setValue2}
  215. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  216. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  217. />
  218. <br />
  219. <h5>random set value + precision</h5>
  220. <Button onClick={randomSetValue4}>Random Set Value</Button>
  221. <InputNumber value={value4} precision={2} onChange={log} />
  222. <br />
  223. <h5>random set value + precision + formatter + parser</h5>
  224. <Button onClick={randomSetValue5}>Random Set Value</Button>
  225. <Button onClick={() => setValue5(undefined)}>Empty</Button>
  226. <InputNumber
  227. value={value5}
  228. precision={2}
  229. onChange={log}
  230. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  231. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  232. />
  233. <br />
  234. <h5>random set value + max + min + precision + onChange</h5>
  235. <Button onClick={randomSetValue6}>Random Set Value</Button>
  236. <Button onClick={() => setValue6(undefined)}>Empty</Button>
  237. <InputNumber max={18} min={-8} value={value6} precision={2} onChange={_setValue6} />
  238. <br />
  239. </div>
  240. );
  241. };
  242. return <ControlledDemo />;
  243. };
  244. ControlledInputNumber.story = {
  245. name: 'controlled InputNumber',
  246. };
  247. export const InnnerButtons = () => {
  248. const Demo = () => {
  249. return (
  250. <div style={{ width: 450 }}>
  251. <label>innerButtons=false</label>
  252. <div>
  253. <InputNumber innerButtons={false} />
  254. </div>
  255. <br />
  256. <label>innerButtons=true</label>
  257. <div>
  258. <InputNumber innerButtons={true} suffix={'小时'} min={0} />
  259. </div>
  260. </div>
  261. );
  262. };
  263. return <Demo />;
  264. };
  265. InnnerButtons.story = {
  266. name: 'innnerButtons',
  267. };
  268. export const ShiftStep = () => {
  269. const Demo = () => {
  270. return (
  271. <div style={{ width: 450 }}>
  272. <label>shiftStep=100,可长按</label>
  273. <div>
  274. <InputNumber shiftStep={100} />
  275. </div>
  276. </div>
  277. );
  278. };
  279. return <Demo />;
  280. };
  281. ShiftStep.story = {
  282. name: 'shiftStep',
  283. };
  284. export const OnChangeLimit = () => {
  285. const Demo = () => {
  286. const [disabled, setDisabled] = useState(true);
  287. const [disabled2, setDisabled2] = useState(false);
  288. const [val, setVal] = useState(2);
  289. return (
  290. <>
  291. <h3>数值没有持续变化说明正常,v1.10.0修复</h3>
  292. <br />
  293. <br />
  294. <div>点击2后点击输入框,然后点击按钮会触发</div>
  295. {disabled ? (
  296. <div
  297. onClick={() => {
  298. setDisabled(false);
  299. }}
  300. >
  301. {val}
  302. </div>
  303. ) : (
  304. <InputNumber
  305. style={{ width: 120 }}
  306. val={val}
  307. innerButtons
  308. onChange={res => setVal(res)}
  309. />
  310. )}
  311. <br />
  312. <br />
  313. <div>点击按钮后切换 disabled 状态</div>
  314. <div>disablde: {String(disabled2)}</div>
  315. <div>
  316. <InputNumber
  317. defaultValue={12}
  318. innerButtons
  319. disabled={disabled2}
  320. onChange={() => setDisabled2(true)}
  321. />
  322. </div>
  323. </>
  324. );
  325. };
  326. return <Demo />;
  327. };
  328. OnChangeLimit.story = {
  329. name: 'onChange无限触发问题',
  330. };
  331. export const ClearIconPosition = () => {
  332. const Demo = () => {
  333. return <InputNumber autoFocus defaultValue={12} innerButtons showClear />;
  334. };
  335. return <Demo />;
  336. };
  337. ClearIconPosition.story = {
  338. name: 'clear icon 位置',
  339. };
  340. export const UncontrolledKeepFocus = () => {
  341. const Demo = () => {
  342. const [val, setVal] = useState(2);
  343. const [val2, setVal2] = useState(2);
  344. return (
  345. <div style={{ width: 450, padding: 20 }}>
  346. <h5>defaultValue</h5>
  347. <InputNumber defaultValue={1020} onChange={log} keepFocus={true} />
  348. <br />
  349. <h5>defaultValue + formatter + parser</h5>
  350. <InputNumber
  351. keepFocus={true}
  352. defaultValue={1020}
  353. onChange={log}
  354. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  355. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  356. />
  357. <br />
  358. <h5>defaultValue + precision + formatter + parser</h5>
  359. <InputNumber
  360. keepFocus={true}
  361. defaultValue={1020}
  362. precision={2}
  363. onChange={log}
  364. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  365. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  366. />
  367. <br />
  368. <h5>defaultValue + precision + max + min + formatter + parser</h5>
  369. <InputNumber
  370. keepFocus={true}
  371. defaultValue={1020}
  372. precision={2}
  373. onChange={log}
  374. max={1000}
  375. min={500}
  376. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  377. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  378. />
  379. <br />
  380. </div>
  381. );
  382. };
  383. return <Demo />;
  384. };
  385. UncontrolledKeepFocus.story = {
  386. name: 'uncontrolled keepFocus',
  387. };
  388. export const ControlledKeepFocus = () => {
  389. const Demo = () => {
  390. const [value, setValue] = useState(0);
  391. const _setValue = createOnChange(setValue);
  392. const [value1, setValue1] = useState(0.234);
  393. const _setValue1 = createOnChange(setValue1);
  394. const [value2, setValue2] = useState(1000);
  395. const _setValue2 = createOnChange(setValue2);
  396. const [value3, setValue3] = useState(0.21);
  397. const _setValue3 = createOnChange(setValue3);
  398. const [value4, setValue4] = useState(3);
  399. const randomSetValue4 = createOnChange(v => {
  400. setValue4(Math.random() * 3 + 1);
  401. });
  402. const [value5, setValue5] = useState(5);
  403. const randomSetValue5 = createOnChange(v => {
  404. setValue5(Math.random() * 5 + 1);
  405. });
  406. const [value6, setValue6] = useState(6);
  407. const randomSetValue6 = createOnChange(v => {
  408. const num = Math.random() * 10 + 9;
  409. console.log('random set: ', num);
  410. setValue6(num);
  411. });
  412. const _setValue6 = createOnChange(setValue6);
  413. return (
  414. <div style={{ width: 450, padding: 20 }}>
  415. <h5>defaultValue</h5>
  416. <InputNumber keepFocus={true} defaultValue={1020} onChange={log} />
  417. <br />
  418. <h5>value</h5>
  419. <InputNumber keepFocus={true} value={1000} onChange={log} />
  420. <br />
  421. <h5>value + onChange</h5>
  422. <InputNumber
  423. keepFocus={true}
  424. value={value}
  425. onChange={_setValue}
  426. onBlur={() => console.log('blur')}
  427. />
  428. <br />
  429. <h5>value + precision + onChange</h5>
  430. <InputNumber keepFocus={true} value={value1} onChange={_setValue1} precision={2} />
  431. <br />
  432. <h5>value + step + precision + onChange</h5>
  433. <InputNumber
  434. keepFocus={true}
  435. step={0.2}
  436. value={value3}
  437. onChange={_setValue3}
  438. precision={2}
  439. />
  440. <br />
  441. <h5>value + precision + onChange + formatter + parser</h5>
  442. <Button onClick={() => setValue2(undefined)}>Empty</Button>
  443. <InputNumber
  444. keepFocus={true}
  445. value={value2}
  446. precision={2}
  447. onChange={_setValue2}
  448. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  449. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  450. />
  451. <br />
  452. <h5>random set value + precision</h5>
  453. <Button onClick={randomSetValue4}>Random Set Value</Button>
  454. <InputNumber keepFocus={true} value={value4} precision={2} onChange={log} />
  455. <br />
  456. <h5>random set value + precision + formatter + parser</h5>
  457. <Button onClick={randomSetValue5}>Random Set Value</Button>
  458. <Button onClick={() => setValue5(undefined)}>Empty</Button>
  459. <InputNumber
  460. keepFocus={true}
  461. value={value5}
  462. precision={2}
  463. onChange={log}
  464. formatter={value => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  465. parser={value => value.replace(/\$\s?|(,*)/g, '')}
  466. />
  467. <br />
  468. <h5>random set value + max + min + precision + onChange</h5>
  469. <Button onClick={randomSetValue6}>Random Set Value</Button>
  470. <Button onClick={() => setValue6(undefined)}>Empty</Button>
  471. <InputNumber
  472. keepFocus={true}
  473. max={18}
  474. min={-8}
  475. value={value6}
  476. precision={2}
  477. onChange={_setValue6}
  478. />
  479. <br />
  480. </div>
  481. );
  482. };
  483. return <Demo />;
  484. };
  485. ControlledKeepFocus.story = {
  486. name: 'controlled keepFocus',
  487. };
  488. export const DisabledStyle = () => {
  489. const Demo = () => {
  490. return (
  491. <>
  492. <label>prop disabled</label>
  493. <InputNumber disabled />
  494. <br />
  495. <br />
  496. <label>max limit</label>
  497. <InputNumber min={1} max={10} defaultValue={10} />
  498. <br />
  499. <br />
  500. <label>min limit</label>
  501. <InputNumber min={1} max={10} defaultValue={1} />
  502. <br />
  503. <br />
  504. </>
  505. );
  506. };
  507. return <Demo />;
  508. };
  509. DisabledStyle.story = {
  510. name: 'disabled style',
  511. };
  512. export const FormCustomInput = () => {
  513. const Demo = () => {
  514. const CustomInput = withField(InputNumber, { onKeyChangeFnName: 'onNumberChange' });
  515. return (
  516. <>
  517. <h4>not controlled + without formatter</h4>
  518. <InputNumber
  519. onChange={(...args) => console.log('inputNumber change', ...args)}
  520. onNumberChange={(...args) => console.log('inputNumber number change', ...args)}
  521. />
  522. <h4>not controlled + formatter(onChange会包括英文字符,onNumberChange不包括)</h4>
  523. <InputNumber
  524. formatter={value => `${value}`.replace(/\D/g, '')}
  525. onChange={(...args) => console.log('inputNumber change', ...args)}
  526. onNumberChange={(...args) => console.log('inputNumber number change', ...args)}
  527. />
  528. <Form onValueChange={v => console.log(v)}>
  529. <h4>
  530. Form + Form.InputNumber + formatter + onChange(onChange包括英文字符,显示没有英文字符)
  531. </h4>
  532. <Form.InputNumber
  533. field="formOriginalInputNumber"
  534. noLabel
  535. formatter={value => `${value}`.replace(/\D/g, '')}
  536. onChange={(...args) => console.log('form inputNumber change', ...args)}
  537. />
  538. <h4>
  539. Form + withField InputNumber + formatter +
  540. onNumberChange(onNumberChange不包括英文字符,显示也不包括英文字符)
  541. </h4>
  542. <CustomInput
  543. field="formCustomInputNumber"
  544. noLabel
  545. formatter={value => `${value}`.replace(/\D/g, '')}
  546. />
  547. </Form>
  548. <h4>
  549. type=number (TODO:需要关注内置的按钮+不同浏览器对type=number的支持情况,比如 safari
  550. 貌似就不支持)
  551. </h4>
  552. <InputNumber
  553. type="number"
  554. onChange={(...args) => console.log('inputNumber change', ...args)}
  555. onNumberChange={(...args) => console.log('inputNumber number change', ...args)}
  556. />
  557. <h4>测试 formatter + parser 是否正常</h4>
  558. <InputNumber
  559. onChange={v => console.log(`Changed to: [${typeof v}] ${v}`)}
  560. defaultValue={1000}
  561. min={0}
  562. formatter={value => `¥ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}
  563. parser={value => value.replace(/\¥\s?|(,*)/g, '')}
  564. />
  565. </>
  566. );
  567. };
  568. return <Demo />;
  569. };
  570. FormCustomInput.story = {
  571. name: 'Form.CustomInput',
  572. };
  573. export const FixPrecision = () => {
  574. const [value, setValue] = useState(5.12);
  575. const [value2, setValue2] = useState(5.12);
  576. return (
  577. <div>
  578. <InputNumber onChange={v => setValue(v)} value={value} style={{ width: 190 }} precision={2} />
  579. <InputNumber keepFocus onBlur={() => console.log('blur')} onChange={v => setValue2(v)} value={value2} style={{ width: 190 }} precision={2} />
  580. </div>
  581. );
  582. }
  583. /**
  584. * 受控传超出 min value 的值,需要触发 onChange
  585. * 不然在 Form 中使用可能会导致 Form State 与 InputNumber 展示的值不同问题
  586. */
  587. export const FixMinValue = () => {
  588. const [value, setValue] = useState();
  589. const formRef = useFormApi();
  590. return (
  591. <div style={{ width: 280 }}>
  592. <Button onClick={() => setValue(0)}>min=1, setValue=0</Button>
  593. <InputNumber
  594. min={1}
  595. value={value}
  596. onChange={(v, e) => {
  597. console.log('inputNumber1 change', `'${v}'`, e);
  598. setValue(v);
  599. }}
  600. />
  601. <InputNumber
  602. min={1}
  603. value={0}
  604. onChange={(v, e) => {
  605. console.log('inputNumber2 change', v, e);
  606. }}
  607. />
  608. <Form initValues={{ minControlled: 0 }}>
  609. <Form.InputNumber
  610. field='minControlled'
  611. min={1}
  612. onChange={(v, e) => {
  613. console.log('form inputNumber change', v, e);
  614. }}
  615. />
  616. </Form>
  617. <Button onClick={() => formRef.current.setValue('minControlled', 0) }>set form value</Button>
  618. <Button onClick={() => { console.log('form value', JSON.stringify(formRef.current.getValues()))}}>get form values</Button>
  619. </div>
  620. );
  621. }
  622. FixMinValue.storyName = 'fix min value';
  623. /**
  624. * fix InputNumber precision 删除后,输入非法字符显示 0.00
  625. * https://github.com/DouyinFE/semi-design/issues/786
  626. */
  627. export const FixPrecision786 = () => {
  628. return (
  629. <div data-cy="fix-precision-786">
  630. <InputNumber defaultValue={10.00} precision={2} />
  631. </div>
  632. );
  633. }
  634. FixPrecision786.storyName = 'fix precision 删除后输入非法值会显示 0.00';