Skip to content

Commit b456606

Browse files
刘欢claude
andcommitted
fix: properly compute global disabled state with array disabled
- Fix disabled array [true] incorrectly disabling entire slider - Only return true when array length matches values length AND all are true - Fix isHandleDisabled to check specific index instead of global state - Add safety check for rawValues being undefined at memo time 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 4f28cc4 commit b456606

File tree

2 files changed

+11
-26
lines changed

2 files changed

+11
-26
lines changed

docs/examples/disabled-handle.tsx

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const BasicDisabledHandle = () => {
1414

1515
return (
1616
<div>
17-
<Slider range value={value} onChange={(v) => setValue(v as number[])} disabled={disabled} />
17+
<Slider range={{ draggableTrack: true }} value={value} onChange={(v) => setValue(v as number[])} disabled={disabled} />
1818
<div style={{ marginTop: 16 }}>
1919
{value.map((val, index) => (
2020
<label key={index} style={{ marginRight: 16 }}>
@@ -50,36 +50,17 @@ const DisabledHandleAsBoundary = () => {
5050
);
5151
};
5252

53-
const MultipleDisabledBoundaries = () => {
54-
const [value, setValue] = useState<number[]>([10, 30, 50, 70, 90]);
55-
56-
return (
57-
<div>
58-
<Slider range value={value} onChange={(v) => setValue(v as number[])} disabled={[true, false, true, false, true]} />
59-
<p style={{ marginTop: 8, color: '#999' }}>
60-
Handles at 10, 50, 90 are disabled.
61-
Handle at 30 can only move between 10-50, handle at 70 can only move between 50-90.
62-
</p>
63-
</div>
64-
);
65-
};
66-
6753
export default () => (
6854
<div>
6955
<div style={style}>
70-
<h3>Basic Disabled Handle</h3>
71-
<p>Toggle checkboxes to disable/enable specific handles</p>
56+
<h3>Disabled Handle + Draggable Track</h3>
57+
<p>Toggle checkboxes to disable/enable specific handles. Drag the track area to move the range.</p>
7258
<BasicDisabledHandle />
7359
</div>
7460

7561
<div style={style}>
7662
<h3>Disabled Handle as Boundary</h3>
7763
<DisabledHandleAsBoundary />
7864
</div>
79-
80-
<div style={style}>
81-
<h3>Multiple Disabled Boundaries</h3>
82-
<MultipleDisabledBoundaries />
83-
</div>
8465
</div>
8566
);

src/Slider.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,12 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
192192
if (typeof rawDisabled === 'boolean') {
193193
return rawDisabled;
194194
}
195-
return rawDisabled.every((d) => d);
196-
}, [rawDisabled]);
195+
// rawValues might not be defined yet at this point
196+
if (!rawDisabled?.length) {
197+
return false;
198+
}
199+
return rawDisabled.length === rawValues?.length && rawDisabled.every(Boolean);
200+
}, [rawDisabled, rawValues]);
197201

198202
const isHandleDisabled = React.useCallback(
199203
(index: number) => {
@@ -275,8 +279,8 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
275279
mergedValue === null || mergedValue === undefined
276280
? []
277281
: Array.isArray(mergedValue)
278-
? mergedValue
279-
: [mergedValue];
282+
? mergedValue
283+
: [mergedValue];
280284

281285
const [val0 = mergedMin] = valueList;
282286
let returnValues = mergedValue === null ? [] : [val0];

0 commit comments

Comments
 (0)