Skip to content

Commit f8acf87

Browse files
authored
fix: Control dynamic change value when user typing should work (#362)
* test: Test driven * test: Test driven * fix: check diff logic
1 parent 83e3c22 commit f8acf87

File tree

4 files changed

+72
-1
lines changed

4 files changed

+72
-1
lines changed

docs/demo/debug.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
## debug
2+
3+
<code src="../examples/debug.tsx">

docs/examples/debug.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/* eslint no-console:0 */
2+
import React, { useEffect } from 'react';
3+
import InputNumber from 'rc-input-number';
4+
import '../../assets/index.less';
5+
6+
export default () => {
7+
const [value, setValue] = React.useState<string | number>(5);
8+
9+
useEffect(() => {
10+
function keyDown(event: KeyboardEvent) {
11+
if ((event.ctrlKey === true || event.metaKey) && event.keyCode === 90) {
12+
setValue(3);
13+
}
14+
}
15+
document.addEventListener('keydown', keyDown);
16+
17+
return () => document.removeEventListener('keydown', keyDown);
18+
}, []);
19+
20+
return (
21+
<>
22+
<InputNumber
23+
style={{ width: 100 }}
24+
onChange={(nextValue) => {
25+
console.log('Change:', nextValue);
26+
setValue(nextValue);
27+
}}
28+
value={value}
29+
/>
30+
{value}
31+
<button
32+
onClick={() => {
33+
setValue(99);
34+
}}
35+
>
36+
Change
37+
</button>
38+
</>
39+
);
40+
};

src/InputNumber.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,9 +477,11 @@ const InputNumber = React.forwardRef(
477477
const newValue = getMiniDecimal(value);
478478
setDecimalValue(newValue);
479479

480+
const currentParsedValue = getMiniDecimal(mergedParser(inputValue));
481+
480482
// When user typing from `1.2` to `1.`, we should not convert to `1` immediately.
481483
// But let it go if user set `formatter`
482-
if (newValue.isNaN() || !userTypingRef.current || formatter) {
484+
if (!newValue.equals(currentParsedValue) || !userTypingRef.current || formatter) {
483485
// Update value as effect
484486
setInputValue(newValue, userTypingRef.current);
485487
}

tests/github.test.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,4 +475,30 @@ describe('InputNumber.Github', () => {
475475

476476
expect(wrapper.getInputValue()).toEqual('-0');
477477
});
478+
479+
// https://github.com/ant-design/ant-design/issues/32274
480+
it('global modify when typing', () => {
481+
const Demo = ({ value }: { value?: number }) => {
482+
const [val, setVal] = React.useState<string | number>(7);
483+
484+
React.useEffect(() => {
485+
if (value) {
486+
setVal(value);
487+
}
488+
}, [value]);
489+
490+
return <InputNumber value={val} onChange={setVal} />;
491+
};
492+
const wrapper = mount(<Demo />);
493+
494+
// Click
495+
wrapper.find('.rc-input-number-handler-up').simulate('mouseDown');
496+
expect(wrapper.find('input').prop('value')).toEqual('8');
497+
498+
// Keyboard change
499+
wrapper.find('input').simulate('keyDown');
500+
wrapper.setProps({ value: 3 });
501+
wrapper.update();
502+
expect(wrapper.find('input').prop('value')).toEqual('3');
503+
});
478504
});

0 commit comments

Comments
 (0)