Skip to content

Commit 6647474

Browse files
authored
Merge pull request #888 from thundersdata-frontend/rn-issue
feat: 使用reanimated和gesture-handler重写滚动选择组件
2 parents 2ba7a8c + 0dded2b commit 6647474

File tree

18 files changed

+528
-611
lines changed

18 files changed

+528
-611
lines changed

.changeset/spotty-bats-leave.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@td-design/react-native-picker': major
3+
---
4+
5+
feat: 使用reanimated和gesture-handler重写滚动选择组件

packages/react-native-picker/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@
2525
"dependencies": {
2626
"array-tree-filter": "^2.1.0",
2727
"dayjs": "^1.11.9",
28-
"lodash-es": "^4.17.21",
29-
"react-native-redash": "^18.1.0"
28+
"lodash-es": "^4.17.21"
3029
},
3130
"devDependencies": {
3231
"@shopify/restyle": "2.4.2",
@@ -36,6 +35,8 @@
3635
"@types/react": "^18.2.15",
3736
"@types/react-native": "^0.72.2",
3837
"react-native-builder-bob": "^0.21.3",
38+
"react-native-gesture-handler": "^2.12.0",
39+
"react-native-reanimated": "^3.3.0",
3940
"typescript": "^5.1.6"
4041
},
4142
"react-native-builder-bob": {

packages/react-native-picker/src/components/DatePicker/index.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ const DatePicker: FC<
3232
{...restProps}
3333
data={col}
3434
value={values[index]}
35-
index={index}
36-
onChange={onValueChange}
35+
onChange={value => onValueChange(value, index)}
3736
/>
3837
);
3938
})}

packages/react-native-picker/src/components/DatePicker/useDatePicker.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import { useMemo } from 'react';
33
import { useMemoizedFn } from '@td-design/rn-hooks';
44
import dayjs, { Dayjs } from 'dayjs';
55

6-
import { ItemValue } from '../WheelPicker/type';
6+
import { PickerData } from '../WheelPicker/type';
77
import { CascadePickerItemProps, DatePickerPropsBase } from './type';
88

9-
export default function useDatePicker({
9+
export default function useDatePicker<T>({
1010
mode,
1111
labelUnit,
1212
format,
@@ -81,18 +81,18 @@ export default function useDatePicker({
8181
const minDateDay = getMinDay();
8282
const maxDateDay = getMaxDay();
8383

84-
const years: CascadePickerItemProps[] = [];
84+
const years: CascadePickerItemProps<T>[] = [];
8585
for (let i = minDateYear; i <= maxDateYear; i++) {
8686
years.push({
87-
value: i + '',
87+
value: (i + '') as T,
8888
label: i + labelUnit.year,
8989
});
9090
}
9191
if (mode === 'year') {
9292
return [years];
9393
}
9494

95-
const months: CascadePickerItemProps[] = [];
95+
const months: CascadePickerItemProps<T>[] = [];
9696
let minMonth = 0;
9797
let maxMonth = 11;
9898
if (minDateYear === selYear) {
@@ -104,15 +104,15 @@ export default function useDatePicker({
104104

105105
for (let i = minMonth; i <= maxMonth; i++) {
106106
months.push({
107-
value: i + '',
107+
value: (i + '') as T,
108108
label: i + 1 + labelUnit.month,
109109
});
110110
}
111111
if (mode === 'month') {
112112
return [years, months];
113113
}
114114

115-
const days: CascadePickerItemProps[] = [];
115+
const days: CascadePickerItemProps<T>[] = [];
116116
let minDay = 1;
117117
let maxDay = getDaysInMonth(date.toDate());
118118

@@ -124,7 +124,7 @@ export default function useDatePicker({
124124
}
125125
for (let i = minDay; i <= maxDay; i++) {
126126
days.push({
127-
value: i + '',
127+
value: (i + '') as T,
128128
label: i + labelUnit.day,
129129
});
130130
}
@@ -137,24 +137,24 @@ export default function useDatePicker({
137137
let minMinute = 0;
138138
let maxMinute = 59;
139139

140-
const hours: CascadePickerItemProps[] = [];
140+
const hours: CascadePickerItemProps<T>[] = [];
141141
for (let i = minHour; i <= maxHour; i++) {
142142
hours.push({
143-
value: i + '',
143+
value: (i + '') as T,
144144
label: labelUnit.hour ? i + labelUnit.hour + '' : pad(i),
145145
});
146146
}
147147

148-
const minutes: CascadePickerItemProps[] = [];
148+
const minutes: CascadePickerItemProps<T>[] = [];
149149
const selMinute = date.get('minute');
150150
for (let i = minMinute; i <= maxMinute; i += 1) {
151151
minutes.push({
152-
value: i + '',
152+
value: (i + '') as T,
153153
label: labelUnit.minute ? i + labelUnit.minute + '' : pad(i),
154154
});
155155
if (selMinute > i && selMinute < i + 1) {
156156
minutes.push({
157-
value: selMinute + '',
157+
value: (selMinute + '') as T,
158158
label: labelUnit.minute ? selMinute + labelUnit.minute + '' : pad(selMinute),
159159
});
160160
}
@@ -166,7 +166,7 @@ export default function useDatePicker({
166166

167167
const getValueCols = () => {
168168
const date = getDate();
169-
let cols: CascadePickerItemProps[][] = [];
169+
let cols: CascadePickerItemProps<T>[][] = [];
170170
let values: string[] = [];
171171

172172
if (mode === 'year') {
@@ -247,8 +247,8 @@ export default function useDatePicker({
247247
return clipDate(newValue!.toDate());
248248
};
249249

250-
const onValueChange = (value: ItemValue, index: number) => {
251-
const newDate = getNewDate(parseInt(value + '', 10), index);
250+
const onValueChange = (data: PickerData<T>, index: number) => {
251+
const newDate = getNewDate(parseInt(data.value + '', 10), index);
252252
onChange?.(newDate.toDate(), newDate.format(format));
253253
};
254254

packages/react-native-picker/src/components/WheelPicker/WheelPickerItem.tsx

Lines changed: 0 additions & 62 deletions
This file was deleted.

0 commit comments

Comments
 (0)