Skip to content

Commit 624c6b9

Browse files
author
梁朝飞
committed
feat: 增加单测
1 parent a5e4c62 commit 624c6b9

File tree

5 files changed

+92
-18
lines changed

5 files changed

+92
-18
lines changed

docs/demo/basic.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default function App() {
1313
</div>
1414
<div className="wrapper">
1515
<Segmented
16-
mode="vertical"
16+
vertical
1717
options={['iOS', 'Android', 'Web']}
1818
onChange={(value) => console.log(value, typeof value)}
1919
/>

src/MotionThumb.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ export interface MotionThumbInterface {
2323
onMotionStart: VoidFunction;
2424
onMotionEnd: VoidFunction;
2525
direction?: 'ltr' | 'rtl';
26-
mode?: 'horizontal' | 'vertical';
26+
vertical?: boolean;
2727
}
2828

2929
const calcThumbStyle = (
3030
targetElement: HTMLElement | null | undefined,
31-
mode: 'horizontal' | 'vertical',
31+
vertical?: boolean,
3232
): ThumbReact => {
3333
if (!targetElement) return null;
3434

@@ -47,7 +47,7 @@ const calcThumbStyle = (
4747
height: targetElement.clientHeight,
4848
};
4949

50-
if (mode === 'vertical') {
50+
if (vertical) {
5151
return {
5252
left: 0,
5353
right: 0,
@@ -81,7 +81,7 @@ export default function MotionThumb(props: MotionThumbInterface) {
8181
onMotionStart,
8282
onMotionEnd,
8383
direction,
84-
mode = 'horizontal',
84+
vertical = false,
8585
} = props;
8686

8787
const thumbRef = React.useRef<HTMLDivElement>(null);
@@ -103,8 +103,8 @@ export default function MotionThumb(props: MotionThumbInterface) {
103103
const prev = findValueElement(prevValue);
104104
const next = findValueElement(value);
105105

106-
const calcPrevStyle = calcThumbStyle(prev, mode);
107-
const calcNextStyle = calcThumbStyle(next, mode);
106+
const calcPrevStyle = calcThumbStyle(prev, vertical);
107+
const calcNextStyle = calcThumbStyle(next, vertical);
108108

109109
setPrevValue(value);
110110
setPrevStyle(calcPrevStyle);
@@ -120,26 +120,26 @@ export default function MotionThumb(props: MotionThumbInterface) {
120120

121121
const thumbStart = React.useMemo(
122122
() =>
123-
mode === 'vertical'
123+
vertical
124124
? toPX(prevStyle?.top ?? 0)
125125
: direction === 'rtl'
126126
? toPX(-(prevStyle?.right as number))
127127
: toPX(prevStyle?.left as number),
128-
[mode, direction, prevStyle],
128+
[vertical, direction, prevStyle],
129129
);
130130

131131
const thumbActive = React.useMemo(
132132
() =>
133-
mode === 'vertical'
133+
vertical
134134
? toPX(nextStyle?.top ?? 0)
135135
: direction === 'rtl'
136136
? toPX(-(nextStyle?.right as number))
137137
: toPX(nextStyle?.left as number),
138-
[mode, direction, nextStyle],
138+
[vertical, direction, nextStyle],
139139
);
140140

141141
const onAppearStart = () =>
142-
mode === 'vertical'
142+
vertical
143143
? {
144144
transform: 'translateY(var(--thumb-start-top))',
145145
height: 'var(--thumb-start-height)',
@@ -150,7 +150,7 @@ export default function MotionThumb(props: MotionThumbInterface) {
150150
};
151151

152152
const onAppearActive = () =>
153-
mode === 'vertical'
153+
vertical
154154
? {
155155
transform: 'translateY(var(--thumb-active-top))',
156156
height: 'var(--thumb-active-height)',

src/index.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export interface SegmentedProps<ValueType = SegmentedValue>
3939
prefixCls?: string;
4040
direction?: 'ltr' | 'rtl';
4141
motionName?: string;
42-
mode?: 'horizontal' | 'vertical'; // Add mode prop
42+
vertical?: boolean;
4343
}
4444

4545
function getValidTitle(option: SegmentedLabeledOption) {
@@ -127,7 +127,7 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
127127
const {
128128
prefixCls = 'rc-segmented',
129129
direction,
130-
mode,
130+
vertical,
131131
options = [],
132132
disabled,
133133
defaultValue,
@@ -178,15 +178,15 @@ const Segmented = React.forwardRef<HTMLDivElement, SegmentedProps>(
178178
{
179179
[`${prefixCls}-rtl`]: direction === 'rtl',
180180
[`${prefixCls}-disabled`]: disabled,
181-
[`${prefixCls}-vertical`]: mode === 'vertical', // Apply vertical class if mode is 'vertical'
181+
[`${prefixCls}-vertical`]: vertical,
182182
},
183183
className,
184184
)}
185185
ref={mergedRef}
186186
>
187-
<div className={classNames(`${prefixCls}-group`)}>
187+
<div className={`${prefixCls}-group`}>
188188
<MotionThumb
189-
mode={mode}
189+
vertical={vertical}
190190
prefixCls={prefixCls}
191191
value={rawValue}
192192
containerRef={containerRef}

tests/__snapshots__/index.test.tsx.snap

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,3 +699,65 @@ exports[`rc-segmented render segmented: disabled 1`] = `
699699
</div>
700700
</div>
701701
`;
702+
703+
exports[`rc-segmented should render vertical segmented 1`] = `
704+
<div
705+
aria-label="segmented control"
706+
class="rc-segmented rc-segmented-vertical"
707+
role="listbox"
708+
>
709+
<div
710+
class="rc-segmented-group"
711+
>
712+
<label
713+
class="rc-segmented-item rc-segmented-item-selected"
714+
>
715+
<input
716+
checked=""
717+
class="rc-segmented-item-input"
718+
type="radio"
719+
/>
720+
<div
721+
aria-selected="true"
722+
class="rc-segmented-item-label"
723+
role="option"
724+
title="iOS"
725+
>
726+
iOS
727+
</div>
728+
</label>
729+
<label
730+
class="rc-segmented-item"
731+
>
732+
<input
733+
class="rc-segmented-item-input"
734+
type="radio"
735+
/>
736+
<div
737+
aria-selected="false"
738+
class="rc-segmented-item-label"
739+
role="option"
740+
title="Android"
741+
>
742+
Android
743+
</div>
744+
</label>
745+
<label
746+
class="rc-segmented-item"
747+
>
748+
<input
749+
class="rc-segmented-item-input"
750+
type="radio"
751+
/>
752+
<div
753+
aria-selected="false"
754+
class="rc-segmented-item-label"
755+
role="option"
756+
title="Web"
757+
>
758+
Web
759+
</div>
760+
</label>
761+
</div>
762+
</div>
763+
`;

tests/index.test.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,4 +555,16 @@ describe('rc-segmented', () => {
555555

556556
offsetParentSpy.mockRestore();
557557
});
558+
559+
it('should render vertical segmented', () => {
560+
const { container, asFragment } = render(
561+
<Segmented options={['iOS', 'Android', 'Web']} vertical />,
562+
);
563+
564+
expect(asFragment().firstChild).toMatchSnapshot();
565+
expect(container.querySelector('.rc-segmented')).toHaveClass(
566+
'rc-segmented-vertical',
567+
);
568+
expectMatchChecked(container, [true, false, false]);
569+
});
558570
});

0 commit comments

Comments
 (0)