Skip to content

Commit 3742a02

Browse files
authored
refactor: changeOnWheel (#619)
* refactor: changeOnWheel * chore: code optimize * chore: code opt
1 parent 3323fbb commit 3742a02

File tree

4 files changed

+56
-24
lines changed

4 files changed

+56
-24
lines changed

docs/demo/wheel.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/* eslint no-console:0 */
2+
import InputNumber from 'rc-input-number';
3+
import React from 'react';
4+
import '../../assets/index.less';
5+
6+
export default () => {
7+
return (
8+
<div style={{ margin: 10 }}>
9+
<InputNumber
10+
style={{ width: 100 }}
11+
defaultValue={10}
12+
changeOnBlur={false}
13+
changeOnWheel
14+
/>
15+
</div>
16+
);
17+
};

docs/example.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,8 @@ nav:
4141

4242
<code src="./demo/small-step.tsx"></code>
4343

44+
## wheel
45+
46+
<code src="./demo/wheel.tsx"></code>
47+
4448

src/InputNumber.tsx

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export interface InputNumberProps<T extends ValueType = ValueType>
7676
upHandler?: React.ReactNode;
7777
downHandler?: React.ReactNode;
7878
keyboard?: boolean;
79-
wheel?: boolean;
79+
changeOnWheel?: boolean;
8080

8181
/** Parse display value to validate number */
8282
parser?: (displayValue: string | undefined) => T;
@@ -118,7 +118,7 @@ const InternalInputNumber = React.forwardRef(
118118
upHandler,
119119
downHandler,
120120
keyboard,
121-
wheel,
121+
changeOnWheel = false,
122122
controls = true,
123123

124124
classNames,
@@ -510,24 +510,23 @@ const InternalInputNumber = React.forwardRef(
510510
};
511511

512512
React.useEffect(() => {
513-
const onWheel = (event) => {
514-
if (wheel === false) {
515-
return;
513+
if (changeOnWheel && focus) {
514+
const onWheel = (event) => {
515+
// moving mouse wheel rises wheel event with deltaY < 0
516+
// scroll value grows from top to bottom, as screen Y coordinate
517+
onInternalStep(event.deltaY < 0);
518+
event.preventDefault();
519+
};
520+
const input = inputRef.current;
521+
if (input) {
522+
// React onWheel is passive and we can't preventDefault() in it.
523+
// That's why we should subscribe with DOM listener
524+
// https://stackoverflow.com/questions/63663025/react-onwheel-handler-cant-preventdefault-because-its-a-passive-event-listenev
525+
input.addEventListener('wheel', onWheel, { passive: false });
526+
return () => input.removeEventListener('wheel', onWheel);
516527
}
517-
// moving mouse wheel rises wheel event with deltaY < 0
518-
// scroll value grows from top to bottom, as screen Y coordinate
519-
onInternalStep(event.deltaY < 0);
520-
event.preventDefault();
521-
};
522-
const input = inputRef.current;
523-
if (input) {
524-
// React onWheel is passive and we can't preventDefault() in it.
525-
// That's why we should subscribe with DOM listener
526-
// https://stackoverflow.com/questions/63663025/react-onwheel-handler-cant-preventdefault-because-its-a-passive-event-listenev
527-
input.addEventListener('wheel', onWheel, { passive: false });
528-
return () => input.removeEventListener('wheel', onWheel);
529528
}
530-
}, [onInternalStep]);
529+
});
531530

532531
// >>> Focus & Blur
533532
const onBlur = () => {

tests/wheel.test.tsx

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ import { fireEvent, render } from './util/wrapper';
55
describe('InputNumber.Wheel', () => {
66
it('wheel up', () => {
77
const onChange = jest.fn();
8-
const { container } = render(<InputNumber onChange={onChange} />);
8+
const { container } = render(<InputNumber onChange={onChange} changeOnWheel />);
9+
fireEvent.focus(container.firstChild);
910
fireEvent.wheel(container.querySelector('input'), {deltaY: -1});
1011
expect(onChange).toHaveBeenCalledWith(1);
1112
});
1213

1314
it('wheel up with pressing shift key', () => {
1415
const onChange = jest.fn();
15-
const { container } = render(<InputNumber onChange={onChange} step={0.01} value={1.2} />);
16+
const { container } = render(<InputNumber onChange={onChange} step={0.01} value={1.2} changeOnWheel />);
17+
fireEvent.focus(container.firstChild);
1618
fireEvent.keyDown(container.querySelector('input'), {
1719
which: KeyCode.SHIFT,
1820
key: 'Shift',
@@ -25,14 +27,16 @@ describe('InputNumber.Wheel', () => {
2527

2628
it('wheel down', () => {
2729
const onChange = jest.fn();
28-
const { container } = render(<InputNumber onChange={onChange} />);
30+
const { container } = render(<InputNumber onChange={onChange} changeOnWheel />);
31+
fireEvent.focus(container.firstChild);
2932
fireEvent.wheel(container.querySelector('input'), {deltaY: 1});
3033
expect(onChange).toHaveBeenCalledWith(-1);
3134
});
3235

3336
it('wheel down with pressing shift key', () => {
3437
const onChange = jest.fn();
35-
const { container } = render(<InputNumber onChange={onChange} step={0.01} value={1.2} />);
38+
const { container } = render(<InputNumber onChange={onChange} step={0.01} value={1.2} changeOnWheel />);
39+
fireEvent.focus(container.firstChild);
3640
fireEvent.keyDown(container.querySelector('input'), {
3741
which: KeyCode.SHIFT,
3842
key: 'Shift',
@@ -45,18 +49,26 @@ describe('InputNumber.Wheel', () => {
4549

4650
it('disabled wheel', () => {
4751
const onChange = jest.fn();
48-
const { container } = render(<InputNumber wheel={false} onChange={onChange} />);
52+
const { container, rerender } = render(<InputNumber onChange={onChange} />);
53+
fireEvent.focus(container.firstChild);
4954

5055
fireEvent.wheel(container.querySelector('input'), {deltaY: -1});
5156
expect(onChange).not.toHaveBeenCalled();
5257

5358
fireEvent.wheel(container.querySelector('input'), {deltaY: 1});
5459
expect(onChange).not.toHaveBeenCalled();
60+
61+
rerender(<InputNumber onChange={onChange} changeOnWheel />);
62+
fireEvent.focus(container.firstChild);
63+
64+
fireEvent.wheel(container.querySelector('input'), {deltaY: 1});
65+
expect(onChange).toHaveBeenCalledWith(-1);
5566
});
5667

5768
it('wheel is limited to range', () => {
5869
const onChange = jest.fn();
59-
const { container } = render(<InputNumber onChange={onChange} min={-3} max={3} />);
70+
const { container } = render(<InputNumber onChange={onChange} min={-3} max={3} changeOnWheel />);
71+
fireEvent.focus(container.firstChild);
6072
fireEvent.keyDown(container.querySelector('input'), {
6173
which: KeyCode.SHIFT,
6274
key: 'Shift',

0 commit comments

Comments
 (0)