Skip to content

Commit ff8d342

Browse files
authored
feat: Move xxStyle & xxClassName into styles & classNames (#945)
* chore: styles & classNames * test: add test case
1 parent 2c47708 commit ff8d342

File tree

11 files changed

+205
-45
lines changed

11 files changed

+205
-45
lines changed

assets/index.less

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
border-radius: @border-radius-base;
3939
}
4040

41-
&-track {
41+
&-track,
42+
&-tracks {
4243
position: absolute;
4344
height: 4px;
4445
background-color: tint(@primary-color, 60%);

docs/demo/mulitple.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
title: Multiple
3+
nav:
4+
title: Demo
5+
path: /demo
6+
---
7+
8+
<code src="../examples/multiple.tsx"></code>

docs/examples/multiple.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/* eslint react/no-multi-comp: 0, no-console: 0 */
2+
import Slider from 'rc-slider';
3+
import React from 'react';
4+
import '../../assets/index.less';
5+
6+
const style = { width: 400, margin: 50 };
7+
8+
function log(value) {
9+
console.log(value);
10+
}
11+
12+
export default () => (
13+
<div>
14+
<div style={style}>
15+
<Slider
16+
range
17+
defaultValue={[0, 10, 30]}
18+
onChange={log}
19+
styles={{
20+
tracks: {
21+
background: `linear-gradient(to right, blue, red)`,
22+
},
23+
track: {
24+
background: 'transparent',
25+
},
26+
}}
27+
/>
28+
</div>
29+
</div>
30+
);

src/Handles/Handle.tsx

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import * as React from 'react';
2-
import classNames from 'classnames';
1+
import cls from 'classnames';
32
import KeyCode from 'rc-util/lib/KeyCode';
3+
import * as React from 'react';
44
import SliderContext from '../context';
5-
import { getDirectionStyle, getIndex } from '../util';
65
import type { OnStartMove } from '../interface';
6+
import { getDirectionStyle, getIndex } from '../util';
77

88
interface RenderProps {
99
index: number;
@@ -48,6 +48,8 @@ const Handle = React.forwardRef((props: HandleProps, ref: React.Ref<HTMLDivEleme
4848
ariaLabelForHandle,
4949
ariaLabelledByForHandle,
5050
ariaValueTextFormatterForHandle,
51+
styles,
52+
classNames,
5153
} = React.useContext(SliderContext);
5254
const handlePrefixCls = `${prefixCls}-handle`;
5355

@@ -114,13 +116,18 @@ const Handle = React.forwardRef((props: HandleProps, ref: React.Ref<HTMLDivEleme
114116
let handleNode = (
115117
<div
116118
ref={ref}
117-
className={classNames(handlePrefixCls, {
118-
[`${handlePrefixCls}-${valueIndex + 1}`]: range,
119-
[`${handlePrefixCls}-dragging`]: dragging,
120-
})}
119+
className={cls(
120+
handlePrefixCls,
121+
{
122+
[`${handlePrefixCls}-${valueIndex + 1}`]: range,
123+
[`${handlePrefixCls}-dragging`]: dragging,
124+
},
125+
classNames.handle,
126+
)}
121127
style={{
122128
...positionStyle,
123129
...style,
130+
...styles.handle,
124131
}}
125132
onMouseDown={onInternalStartMove}
126133
onTouchStart={onInternalStartMove}

src/Slider.tsx

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
1-
import * as React from 'react';
2-
import classNames from 'classnames';
3-
import isEqual from 'rc-util/lib/isEqual';
1+
import cls from 'classnames';
42
import useMergedState from 'rc-util/lib/hooks/useMergedState';
5-
import type { HandlesRef } from './Handles';
3+
import isEqual from 'rc-util/lib/isEqual';
4+
import warning from 'rc-util/lib/warning';
5+
import * as React from 'react';
6+
import type { SliderContextProps } from './context';
7+
import SliderContext from './context';
8+
import type { HandlesProps, HandlesRef } from './Handles';
69
import Handles from './Handles';
7-
import type { HandlesProps } from './Handles';
810
import useDrag from './hooks/useDrag';
9-
import SliderContext from './context';
10-
import type { SliderContextProps } from './context';
11-
import Tracks from './Tracks';
12-
import type { AriaValueFormat, Direction, OnStartMove } from './interface';
11+
import useOffset from './hooks/useOffset';
12+
import type {
13+
AriaValueFormat,
14+
Direction,
15+
OnStartMove,
16+
SliderClassNames,
17+
SliderStyles,
18+
} from './interface';
19+
import type { InternalMarkObj, MarkObj } from './Marks';
1320
import Marks from './Marks';
14-
import type { MarkObj } from './Marks';
15-
import type { InternalMarkObj } from './Marks';
1621
import Steps from './Steps';
17-
import useOffset from './hooks/useOffset';
18-
import warning from 'rc-util/lib/warning';
22+
import Tracks from './Tracks';
1923

2024
/**
2125
* New:
@@ -36,6 +40,9 @@ export interface SliderProps<ValueType = number | number[]> {
3640
className?: string;
3741
style?: React.CSSProperties;
3842

43+
classNames?: SliderClassNames;
44+
styles?: SliderStyles;
45+
3946
// Status
4047
disabled?: boolean;
4148
keyboard?: boolean;
@@ -70,8 +77,11 @@ export interface SliderProps<ValueType = number | number[]> {
7077
// Style
7178
included?: boolean;
7279
startPoint?: number;
80+
/** @deprecated Please use `styles.track` instead */
7381
trackStyle?: React.CSSProperties | React.CSSProperties[];
82+
/** @deprecated Please use `styles.handle` instead */
7483
handleStyle?: React.CSSProperties | React.CSSProperties[];
84+
/** @deprecated Please use `styles.rail` instead */
7585
railStyle?: React.CSSProperties;
7686
dotStyle?: React.CSSProperties | ((dotValue: number) => React.CSSProperties);
7787
activeDotStyle?: React.CSSProperties | ((dotValue: number) => React.CSSProperties);
@@ -100,6 +110,8 @@ const Slider = React.forwardRef((props: SliderProps, ref: React.Ref<SliderRef>)
100110
prefixCls = 'rc-slider',
101111
className,
102112
style,
113+
classNames,
114+
styles,
103115

104116
// Status
105117
disabled = false,
@@ -456,6 +468,8 @@ const Slider = React.forwardRef((props: SliderProps, ref: React.Ref<SliderRef>)
456468
ariaLabelForHandle,
457469
ariaLabelledByForHandle,
458470
ariaValueTextFormatterForHandle,
471+
styles: styles || {},
472+
classNames: classNames || {},
459473
}),
460474
[
461475
mergedMin,
@@ -472,6 +486,8 @@ const Slider = React.forwardRef((props: SliderProps, ref: React.Ref<SliderRef>)
472486
ariaLabelForHandle,
473487
ariaLabelledByForHandle,
474488
ariaValueTextFormatterForHandle,
489+
styles,
490+
classNames,
475491
],
476492
);
477493

@@ -480,7 +496,7 @@ const Slider = React.forwardRef((props: SliderProps, ref: React.Ref<SliderRef>)
480496
<SliderContext.Provider value={context}>
481497
<div
482498
ref={containerRef}
483-
className={classNames(prefixCls, className, {
499+
className={cls(prefixCls, className, {
484500
[`${prefixCls}-disabled`]: disabled,
485501
[`${prefixCls}-vertical`]: vertical,
486502
[`${prefixCls}-horizontal`]: !vertical,
@@ -489,7 +505,13 @@ const Slider = React.forwardRef((props: SliderProps, ref: React.Ref<SliderRef>)
489505
style={style}
490506
onMouseDown={onSliderMouseDown}
491507
>
492-
<div className={`${prefixCls}-rail`} style={railStyle} />
508+
<div
509+
className={cls(`${prefixCls}-rail`, classNames?.rail)}
510+
style={{
511+
...railStyle,
512+
...styles?.rail,
513+
}}
514+
/>
493515

494516
<Tracks
495517
prefixCls={prefixCls}

src/Tracks/Track.tsx

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
1+
import cls from 'classnames';
12
import * as React from 'react';
2-
import classNames from 'classnames';
33
import SliderContext from '../context';
4-
import { getOffset } from '../util';
54
import type { OnStartMove } from '../interface';
5+
import { getOffset } from '../util';
66

77
export interface TrackProps {
88
prefixCls: string;
99
style?: React.CSSProperties;
10+
/** Replace with origin prefix concat className */
11+
replaceCls?: string;
1012
start: number;
1113
end: number;
1214
index: number;
1315
onStartMove?: OnStartMove;
1416
}
1517

1618
export default function Track(props: TrackProps) {
17-
const { prefixCls, style, start, end, index, onStartMove } = props;
18-
const { direction, min, max, disabled, range } = React.useContext(SliderContext);
19+
const { prefixCls, style, start, end, index, onStartMove, replaceCls } = props;
20+
const { direction, min, max, disabled, range, classNames } = React.useContext(SliderContext);
1921

2022
const trackPrefixCls = `${prefixCls}-track`;
2123

@@ -53,12 +55,20 @@ export default function Track(props: TrackProps) {
5355
positionStyle.width = `${offsetEnd * 100 - offsetStart * 100}%`;
5456
}
5557

58+
const className =
59+
replaceCls ||
60+
cls(
61+
trackPrefixCls,
62+
{
63+
[`${trackPrefixCls}-${index + 1}`]: index !== null && range,
64+
[`${prefixCls}-track-draggable`]: onStartMove,
65+
},
66+
classNames.track,
67+
);
68+
5669
return (
5770
<div
58-
className={classNames(trackPrefixCls, {
59-
[`${trackPrefixCls}-${index + 1}`]: range,
60-
[`${prefixCls}-track-draggable`]: onStartMove,
61-
})}
71+
className={className}
6272
style={{
6373
...positionStyle,
6474
...style,

src/Tracks/index.tsx

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import cls from 'classnames';
12
import * as React from 'react';
23
import SliderContext from '../context';
3-
import Track from './Track';
44
import type { OnStartMove } from '../interface';
55
import { getIndex } from '../util';
6+
import Track from './Track';
67

78
export interface TrackProps {
89
prefixCls: string;
@@ -14,8 +15,9 @@ export interface TrackProps {
1415

1516
export default function Tracks(props: TrackProps) {
1617
const { prefixCls, style, values, startPoint, onStartMove } = props;
17-
const { included, range, min } = React.useContext(SliderContext);
18+
const { included, range, min, styles, classNames } = React.useContext(SliderContext);
1819

20+
// =========================== List ===========================
1921
const trackList = React.useMemo(() => {
2022
if (!range) {
2123
// null value do not have track
@@ -35,7 +37,7 @@ export default function Tracks(props: TrackProps) {
3537
}
3638

3739
// Multiple
38-
const list = [];
40+
const list: { start: number; end: number }[] = [];
3941

4042
for (let i = 0; i < values.length - 1; i += 1) {
4143
list.push({
@@ -47,17 +49,39 @@ export default function Tracks(props: TrackProps) {
4749
return list;
4850
}, [values, range, startPoint, min]);
4951

50-
return (included
51-
? trackList.map(({ start, end }, index) => (
52+
// ========================== Render ==========================
53+
let tracksNode: React.ReactElement = null;
54+
55+
if (classNames.tracks || styles.tracks) {
56+
tracksNode = (
57+
<Track
58+
index={null}
59+
prefixCls={prefixCls}
60+
start={trackList[0].start}
61+
end={trackList[trackList.length - 1].end}
62+
replaceCls={cls(classNames.tracks, `${prefixCls}-tracks`)}
63+
style={styles.tracks}
64+
/>
65+
);
66+
}
67+
68+
return (included ? (
69+
<>
70+
{tracksNode}
71+
{trackList.map(({ start, end }, index) => (
5272
<Track
5373
index={index}
5474
prefixCls={prefixCls}
55-
style={getIndex(style, index)}
75+
style={{
76+
...getIndex(style, index),
77+
...styles.track,
78+
}}
5679
start={start}
5780
end={end}
5881
key={index}
5982
onStartMove={onStartMove}
6083
/>
61-
))
62-
: null) as unknown as React.ReactElement;
84+
))}
85+
</>
86+
) : null) as unknown as React.ReactElement;
6387
}

src/context.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as React from 'react';
2-
import type { AriaValueFormat, Direction } from './interface';
2+
import type { AriaValueFormat, Direction, SliderClassNames, SliderStyles } from './interface';
33

44
export interface SliderContextProps {
55
min: number;
@@ -16,6 +16,8 @@ export interface SliderContextProps {
1616
ariaLabelForHandle?: string | string[];
1717
ariaLabelledByForHandle?: string | string[];
1818
ariaValueTextFormatterForHandle?: AriaValueFormat | AriaValueFormat[];
19+
classNames: SliderClassNames;
20+
styles: SliderStyles;
1921
}
2022

2123
const SliderContext = React.createContext<SliderContextProps>({
@@ -27,6 +29,8 @@ const SliderContext = React.createContext<SliderContextProps>({
2729
includedEnd: 0,
2830
tabIndex: 0,
2931
keyboard: true,
32+
styles: {},
33+
classNames: {},
3034
});
3135

3236
export default SliderContext;

src/interface.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,9 @@ export type Direction = 'rtl' | 'ltr' | 'ttb' | 'btt';
55
export type OnStartMove = (e: React.MouseEvent | React.TouchEvent, valueIndex: number) => void;
66

77
export type AriaValueFormat = (value: number) => string;
8+
9+
export type SemanticName = 'tracks' | 'track' | 'rail' | 'handle';
10+
11+
export type SliderClassNames = Partial<Record<SemanticName, string>>;
12+
13+
export type SliderStyles = Partial<Record<SemanticName, React.CSSProperties>>;

0 commit comments

Comments
 (0)