Skip to content

Commit dd24990

Browse files
HaixingOoOgithub-actions[bot]Heising
authored
feat(Rate): Rate component support clearable (#3114)
* feat(rate): rate support clearable * test(rate): fix test snapshot * chore: update snapshot * chore: update description --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Heising <[email protected]>
1 parent ab0b227 commit dd24990

File tree

9 files changed

+502
-3
lines changed

9 files changed

+502
-3
lines changed

src/rate/Rate.tsx

+11-3
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,14 @@ const RateIcon: React.FC<RateIconProps> = ({ icon, ...props }) => {
3333
const Rate = React.forwardRef<HTMLDivElement, RateProps>((originalProps, ref) => {
3434
const props = useDefaultProps<RateProps>(originalProps, rateDefaultProps);
3535

36-
const { allowHalf, color, count, disabled, gap, showText, size, icon, className, style, onChange, texts } = props;
36+
const { allowHalf, color, count, disabled, gap, showText, size, icon, className, style, onChange, texts, clearable } =
37+
props;
3738
const [locale, t] = useLocaleReceiver('rate');
3839

3940
const displayTexts = texts.length ? texts : t(locale.rateText);
4041

4142
const { classPrefix } = useConfig();
42-
const [starValue = 0, setStarValue] = useControlled(props, 'value', onChange);
43+
const [starValue, setStarValue] = useControlled(props, 'value', onChange);
4344

4445
const [hoverValue, setHoverValue] = useState<number | undefined>(undefined);
4546
const displayValue = hoverValue || starValue;
@@ -86,7 +87,14 @@ const Rate = React.forwardRef<HTMLDivElement, RateProps>((originalProps, ref) =>
8687
if (disabled) {
8788
return;
8889
}
89-
setStarValue(getStarValue(event, index));
90+
91+
let value = getStarValue(event, index);
92+
if (clearable && value === starValue) {
93+
value = 0;
94+
setHoverValue(undefined);
95+
}
96+
97+
setStarValue(value);
9098
};
9199

92100
const getStarCls = (index: number) => {

src/rate/__tests__/rate.test.tsx

+16
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,21 @@ describe('Rate 组件测试', () => {
7878
});
7979
expect(document.querySelector('.t-rate__item--half')).toBeTruthy();
8080
});
81+
82+
test('clearable', () => {
83+
const { container } = render(<Rate defaultValue={1} clearable />);
84+
85+
// 默认展示
86+
expect(container.querySelectorAll('.t-rate__item--full')).toHaveLength(1);
87+
88+
// 点击不同区域选中
89+
fireEvent.click(container.querySelectorAll('.t-rate__item')[1]);
90+
expect(container.querySelectorAll('.t-rate__item--full')).toHaveLength(2);
91+
92+
// 点击相同区域清除选中
93+
fireEvent.click(container.querySelectorAll('.t-rate__item')[1]);
94+
95+
expect(container.querySelectorAll('.t-rate__item--full')).toHaveLength(0);
96+
});
8197
});
8298
});

src/rate/_example/clearable.tsx

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import React from 'react';
2+
import { Rate, Space } from 'tdesign-react';
3+
4+
export default function BasicRate() {
5+
return (
6+
<Space direction="vertical">
7+
<h3>clearable: true</h3>
8+
<Rate defaultValue={3} clearable />
9+
<h3>clearable: false</h3>
10+
<Rate defaultValue={3} />
11+
</Space>
12+
);
13+
}

src/rate/defaultProps.ts

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { TdRateProps } from './type';
66

77
export const rateDefaultProps: TdRateProps = {
88
allowHalf: false,
9+
clearable: false,
910
color: '#ED7B2F',
1011
count: 5,
1112
disabled: undefined,

src/rate/rate.en-US.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ name | type | default | description | required
99
className | String | - | className of component | N
1010
style | Object | - | CSS(Cascading Style Sheets),Typescript:`React.CSSProperties` | N
1111
allowHalf | Boolean | false | \- | N
12+
clearable | Boolean | false | \- | N
1213
color | String / Array | '#ED7B2F' | Typescript:`string \| Array<string>` | N
1314
count | Number | 5 | \- | N
1415
disabled | Boolean | undefined | \- | N

src/rate/rate.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
className | String | - | 类名 | N
1010
style | Object | - | 样式,TS 类型:`React.CSSProperties` | N
1111
allowHalf | Boolean | false | 是否允许半选 | N
12+
clearable | Boolean | false | 是否允许清除评分,如果允许,重新点击当前评分清除 | N
1213
color | String / Array | '#ED7B2F' | 评分图标的颜色,样式中默认为 #ED7B2F。一个值表示设置选中高亮的五角星颜色,示例:[选中颜色]。数组则表示分别设置 选中高亮的五角星颜色 和 未选中暗灰的五角星颜色,[选中颜色,未选中颜色]。示例:['#ED7B2F', '#E3E6EB']。TS 类型:`string \| Array<string>` | N
1314
count | Number | 5 | 评分的数量 | N
1415
disabled | Boolean | undefined | 是否禁用评分 | N

src/rate/type.ts

+5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ export interface TdRateProps {
1212
* @default false
1313
*/
1414
allowHalf?: boolean;
15+
/**
16+
* 是否允许清除评分,如果允许,重新点击当前评分清除
17+
* @default false
18+
*/
19+
clearable?: boolean;
1520
/**
1621
* 评分图标的颜色,样式中默认为 #ED7B2F。一个值表示设置选中高亮的五角星颜色,示例:[选中颜色]。数组则表示分别设置 选中高亮的五角星颜色 和 未选中暗灰的五角星颜色,[选中颜色,未选中颜色]。示例:['#ED7B2F', '#E3E6EB']
1722
* @default '#ED7B2F'

0 commit comments

Comments
 (0)