Skip to content

Commit 218f061

Browse files
刘欢claude
andcommitted
fix: properly detect global disabled when all handles are disabled
Use value prop to determine expected length instead of rawValues. This ensures disabled=[true,true,true] correctly applies global disabled styling. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 4f28cc4 commit 218f061

File tree

2 files changed

+56
-27
lines changed

2 files changed

+56
-27
lines changed

docs/examples/disabled-handle.tsx

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,53 @@ const style: React.CSSProperties = {
88
margin: 50,
99
};
1010

11+
// Basic editable with disabled handles
12+
const EditableWithDisabled = () => {
13+
const [value, setValue] = useState<number[]>([0, 30, 100]);
14+
const [disabled, setDisabled] = useState<boolean[]>([true, false, true]);
15+
16+
return (
17+
<div>
18+
<Slider
19+
range={{
20+
editable: true,
21+
minCount: 2,
22+
maxCount: 5,
23+
}}
24+
value={value}
25+
onChange={(v) => setValue(v as number[])}
26+
disabled={disabled}
27+
/>
28+
<div style={{ marginTop: 16 }}>
29+
{value.map((val, index) => (
30+
<label key={index} style={{ marginRight: 16 }}>
31+
<input
32+
type="checkbox"
33+
checked={disabled[index]}
34+
onChange={() => {
35+
const newDisabled = [...disabled];
36+
newDisabled[index] = !newDisabled[index];
37+
setDisabled(newDisabled);
38+
}}
39+
/>
40+
Handle {index + 1} ({val}) {disabled[index] ? 'Disabled' : 'Enabled'}
41+
</label>
42+
))}
43+
</div>
44+
<p style={{ marginTop: 8, color: '#999', fontSize: 12 }}>
45+
Try: Click track to add handle • Drag handle to edge to delete • Toggle checkboxes to disable handles
46+
</p>
47+
</div>
48+
);
49+
};
50+
1151
const BasicDisabledHandle = () => {
1252
const [value, setValue] = useState<number[]>([0, 30, 60, 100]);
13-
const [disabled, setDisabled] = useState([true, false, false, true]);
53+
const [disabled, setDisabled] = useState([true]);
1454

1555
return (
1656
<div>
17-
<Slider range value={value} onChange={(v) => setValue(v as number[])} disabled={disabled} />
57+
<Slider range={{ draggableTrack: true }} value={value} onChange={(v) => setValue(v as number[])} disabled={disabled} />
1858
<div style={{ marginTop: 16 }}>
1959
{value.map((val, index) => (
2060
<label key={index} style={{ marginRight: 16 }}>
@@ -50,36 +90,24 @@ const DisabledHandleAsBoundary = () => {
5090
);
5191
};
5292

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-
6793
export default () => (
6894
<div>
6995
<div style={style}>
70-
<h3>Basic Disabled Handle</h3>
71-
<p>Toggle checkboxes to disable/enable specific handles</p>
96+
<h3>Disabled Handle + Draggable Track</h3>
97+
<p>Toggle checkboxes to disable/enable specific handles. Drag the track area to move the range.</p>
7298
<BasicDisabledHandle />
7399
</div>
74100

75101
<div style={style}>
76102
<h3>Disabled Handle as Boundary</h3>
77103
<DisabledHandleAsBoundary />
78104
</div>
79-
80-
<div style={style}>
81-
<h3>Multiple Disabled Boundaries</h3>
82-
<MultipleDisabledBoundaries />
105+
<div>
106+
<div style={style}>
107+
<h3>Editable + Disabled Array</h3>
108+
<p>Toggle checkboxes to enable/disable handles in editable mode</p>
109+
<EditableWithDisabled />
110+
</div>
83111
</div>
84112
</div>
85113
);

src/Slider.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,10 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
191191
const disabled = React.useMemo(() => {
192192
if (typeof rawDisabled === 'boolean') {
193193
return rawDisabled;
194-
}
195-
return rawDisabled.every((d) => d);
196-
}, [rawDisabled]);
194+
};
195+
196+
return Array.isArray(value) && value.length === rawDisabled.length && rawDisabled.every(Boolean);
197+
}, [rawDisabled, value]);
197198

198199
const isHandleDisabled = React.useCallback(
199200
(index: number) => {
@@ -275,8 +276,8 @@ const Slider = React.forwardRef<SliderRef, SliderProps<number | number[]>>((prop
275276
mergedValue === null || mergedValue === undefined
276277
? []
277278
: Array.isArray(mergedValue)
278-
? mergedValue
279-
: [mergedValue];
279+
? mergedValue
280+
: [mergedValue];
280281

281282
const [val0 = mergedMin] = valueList;
282283
let returnValues = mergedValue === null ? [] : [val0];

0 commit comments

Comments
 (0)