Skip to content

Commit 9a12e4b

Browse files
authored
fix: handler do not move when click track and move without mouseup (#948)
* fix: handle do not move when click track and move * chore: ugprade devDeps * chore: fix lint * test: add drag test case
1 parent 2b92eb4 commit 9a12e4b

File tree

5 files changed

+46
-25
lines changed

5 files changed

+46
-25
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@
7171
"less": "^3.10.3",
7272
"np": "^7.0.0",
7373
"rc-test": "^7.0.15",
74-
"rc-tooltip": "^5.0.1",
75-
"rc-trigger": "^5.0.4",
74+
"rc-tooltip": "^6.1.2",
75+
"rc-trigger": "^5.3.4",
7676
"react": "^16.0.0",
7777
"react-dom": "^16.0.0",
7878
"regenerator-runtime": "^0.13.9",

src/Slider.tsx

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,23 @@ const Slider = React.forwardRef((props: SliderProps, ref: React.Ref<SliderRef>)
288288
setValue(cloneNextValues);
289289
};
290290

291-
const changeToCloseValue = (newValue: number) => {
291+
const finishChange = () => {
292+
onAfterChange?.(getTriggerValue(rawValuesRef.current));
293+
};
294+
295+
const [draggingIndex, draggingValue, cacheValues, onStartDrag] = useDrag(
296+
containerRef,
297+
direction,
298+
rawValues,
299+
mergedMin,
300+
mergedMax,
301+
formatValue,
302+
triggerChange,
303+
finishChange,
304+
offsetValues,
305+
);
306+
307+
const changeToCloseValue = (newValue: number, e?: React.MouseEvent) => {
292308
if (!disabled) {
293309
let valueIndex = 0;
294310
let valueDist = mergedMax - mergedMin;
@@ -314,6 +330,9 @@ const Slider = React.forwardRef((props: SliderProps, ref: React.Ref<SliderRef>)
314330
onBeforeChange?.(getTriggerValue(cloneNextValues));
315331
triggerChange(cloneNextValues);
316332
onAfterChange?.(getTriggerValue(cloneNextValues));
333+
if (e) {
334+
onStartDrag(e, valueIndex, cloneNextValues);
335+
}
317336
}
318337
};
319338

@@ -344,7 +363,7 @@ const Slider = React.forwardRef((props: SliderProps, ref: React.Ref<SliderRef>)
344363
}
345364

346365
const nextValue = mergedMin + percent * (mergedMax - mergedMin);
347-
changeToCloseValue(formatValue(nextValue));
366+
changeToCloseValue(formatValue(nextValue), e);
348367
};
349368

350369
// =========================== Keyboard ===========================
@@ -384,22 +403,6 @@ const Slider = React.forwardRef((props: SliderProps, ref: React.Ref<SliderRef>)
384403
return draggableTrack;
385404
}, [draggableTrack, mergedStep]);
386405

387-
const finishChange = () => {
388-
onAfterChange?.(getTriggerValue(rawValuesRef.current));
389-
};
390-
391-
const [draggingIndex, draggingValue, cacheValues, onStartDrag] = useDrag(
392-
containerRef,
393-
direction,
394-
rawValues,
395-
mergedMin,
396-
mergedMax,
397-
formatValue,
398-
triggerChange,
399-
finishChange,
400-
offsetValues,
401-
);
402-
403406
const onStartMove: OnStartMove = (e, valueIndex) => {
404407
onStartDrag(e, valueIndex);
405408

src/hooks/useDrag.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,16 @@ export default function useDrag(
9393
const updateCacheValueRef = React.useRef(updateCacheValue);
9494
updateCacheValueRef.current = updateCacheValue;
9595

96-
const onStartMove: OnStartMove = (e, valueIndex) => {
96+
const onStartMove: OnStartMove = (e, valueIndex, startValues?: number[]) => {
9797
e.stopPropagation();
9898

99-
const originValue = rawValues[valueIndex];
99+
// 如果是点击 track 触发的,需要传入变化后的初始值,而不能直接用 rawValues
100+
const initialValues = startValues || rawValues;
101+
const originValue = initialValues[valueIndex];
100102

101103
setDraggingIndex(valueIndex);
102104
setDraggingValue(originValue);
103-
setOriginValues(rawValues);
105+
setOriginValues(initialValues);
104106

105107
const { pageX: startX, pageY: startY } = getPosition(e);
106108

src/interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type React from 'react';
22

33
export type Direction = 'rtl' | 'ltr' | 'ttb' | 'btt';
44

5-
export type OnStartMove = (e: React.MouseEvent | React.TouchEvent, valueIndex: number) => void;
5+
export type OnStartMove = (e: React.MouseEvent | React.TouchEvent, valueIndex: number, startValues?: number[]) => void;
66

77
export type AriaValueFormat = (value: number) => string;
88

tests/Slider.test.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22
import classNames from 'classnames';
3-
import { render, fireEvent } from '@testing-library/react';
3+
import { render, fireEvent, createEvent } from '@testing-library/react';
44
import '@testing-library/jest-dom';
55
import keyCode from 'rc-util/lib/KeyCode';
66
import { spyElementPrototypes } from 'rc-util/lib/test/domHook';
@@ -609,4 +609,20 @@ describe('Slider', () => {
609609
});
610610
expect(onAfterChange).toHaveBeenCalledWith(20);
611611
});
612+
613+
// https://github.com/react-component/slider/pull/948
614+
it('could drag handler after click tracker', () => {
615+
const onChange = jest.fn();
616+
const { container } = render(<Slider onChange={onChange} />);
617+
fireEvent.mouseDown(container.querySelector('.rc-slider'), {
618+
clientX: 20,
619+
});
620+
expect(onChange).toHaveBeenLastCalledWith(20);
621+
622+
// Drag
623+
const mouseMove = createEvent.mouseMove(document);
624+
mouseMove.pageX = 100;
625+
fireEvent(document, mouseMove);
626+
expect(onChange).toHaveBeenLastCalledWith(100);
627+
});
612628
});

0 commit comments

Comments
 (0)