From 6e517eab0bef06db4fa1405950e7a274604818ac Mon Sep 17 00:00:00 2001
From: qiuxchao <2915241235@qq.com>
Date: Mon, 29 May 2023 23:33:10 +0800
Subject: [PATCH] fix: Controlled mode, do not select the first one by default
---
docs/demo/controlled.tsx | 15 +++++++++++++--
src/MotionThumb.tsx | 21 +++++++++++++--------
src/index.tsx | 11 +++++++----
3 files changed, 33 insertions(+), 14 deletions(-)
diff --git a/docs/demo/controlled.tsx b/docs/demo/controlled.tsx
index 2546819..ccc41d2 100644
--- a/docs/demo/controlled.tsx
+++ b/docs/demo/controlled.tsx
@@ -5,10 +5,11 @@ import type { SegmentedValue } from 'rc-segmented';
export default class Demo extends React.Component<
unknown,
- { value: SegmentedValue }
+ { value: SegmentedValue; value2?: SegmentedValue }
> {
state = {
value: 'Web3',
+ value2: undefined,
};
render() {
@@ -23,7 +24,7 @@ export default class Demo extends React.Component<
})
}
/>
-
+
+
+
+ this.setState({
+ value2,
+ })
+ }
+ />
);
}
diff --git a/src/MotionThumb.tsx b/src/MotionThumb.tsx
index a2e26cc..4cdf769 100644
--- a/src/MotionThumb.tsx
+++ b/src/MotionThumb.tsx
@@ -13,7 +13,7 @@ type ThumbReact = {
export interface MotionThumbInterface {
containerRef: React.RefObject;
- value: SegmentedValue;
+ value?: SegmentedValue;
getValueIndex: (value: SegmentedValue) => number;
prefixCls: string;
motionName: string;
@@ -55,7 +55,8 @@ export default function MotionThumb(props: MotionThumbInterface) {
const [prevValue, setPrevValue] = React.useState(value);
// =========================== Effect ===========================
- const findValueElement = (val: SegmentedValue) => {
+ const findValueElement = (val?: SegmentedValue) => {
+ if (!val) return null;
const index = getValueIndex(val);
const ele = containerRef.current?.querySelectorAll(
@@ -90,16 +91,20 @@ export default function MotionThumb(props: MotionThumbInterface) {
const thumbStart = React.useMemo(
() =>
- direction === 'rtl'
- ? toPX(-(prevStyle?.right as number))
- : toPX(prevStyle?.left as number),
+ prevStyle
+ ? direction === 'rtl'
+ ? toPX(-(prevStyle?.right as number))
+ : toPX(prevStyle?.left as number)
+ : 'auto',
[direction, prevStyle],
);
const thumbActive = React.useMemo(
() =>
- direction === 'rtl'
- ? toPX(-(nextStyle?.right as number))
- : toPX(nextStyle?.left as number),
+ nextStyle
+ ? direction === 'rtl'
+ ? toPX(-(nextStyle?.right as number))
+ : toPX(nextStyle?.left as number)
+ : 'auto',
[direction, nextStyle],
);
diff --git a/src/index.tsx b/src/index.tsx
index 2541a6c..0c0bcaf 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -142,10 +142,13 @@ const Segmented = React.forwardRef(
// Note: We should not auto switch value when value not exist in options
// which may break single source of truth.
- const [rawValue, setRawValue] = useMergedState(segmentedOptions[0]?.value, {
- value,
- defaultValue,
- });
+ const [rawValue, setRawValue] = useMergedState(
+ props.hasOwnProperty('value') ? value : segmentedOptions[0]?.value,
+ {
+ value,
+ defaultValue,
+ },
+ );
// ======================= Change ========================
const [thumbShow, setThumbShow] = React.useState(false);