taro-uno-ui 0.9.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/dist/js/{index-DffLRSro.js → index-CDFsvu80.js} +15369 -10741
- package/dist/js/index-CDFsvu80.js.map +1 -0
- package/dist/js/index-DFdcksbe.js.map +1 -1
- package/dist/js/index-DXRIkWX1.js.map +1 -1
- package/dist/js/{index-6NJ3A1Dn.js → index-JffnTUrv.js} +15430 -10801
- package/dist/js/index-JffnTUrv.js.map +1 -0
- package/dist/utils/http/request.d.ts +280 -0
- package/package.json +14 -10
- package/src/components/basic/Button/Button.tsx +53 -13
- package/src/components/basic/Button/Button.types.ts +45 -9
- package/src/components/basic/Divider/Divider.tsx +60 -29
- package/src/components/basic/Icon/Icon.data.ts +474 -0
- package/src/components/basic/Icon/Icon.test.tsx +2 -2
- package/src/components/basic/Icon/Icon.tsx +48 -35
- package/src/components/basic/Icon/IconManager.ts +229 -0
- package/src/components/basic/Text/Text.styles.ts +3 -3
- package/src/components/basic/Text/Text.types.ts +14 -4
- package/src/components/basic/Typography/Typography.styles.ts +10 -9
- package/src/components/basic/Typography/Typography.tsx +15 -13
- package/src/components/basic/Typography/Typography.types.ts +41 -41
- package/src/components/basic/Typography/index.tsx +1 -1
- package/src/components/basic/Video/Video.styles.ts +777 -0
- package/src/components/basic/Video/Video.test.tsx +490 -0
- package/src/components/basic/Video/Video.tsx +1468 -0
- package/src/components/basic/Video/Video.types.ts +500 -0
- package/src/components/basic/Video/index.tsx +26 -0
- package/src/components/basic/index.tsx +13 -15
- package/src/components/common/ErrorBoundary.tsx +1 -1
- package/src/components/common/LazyComponent.tsx +9 -8
- package/src/components/common/SecurityProvider.tsx +2 -14
- package/src/components/common/ThemeProvider.tsx +43 -56
- package/src/components/common/VirtualList.tsx +187 -205
- package/src/components/common/index.tsx +25 -0
- package/src/components/display/Avatar/Avatar.styles.ts +1 -1
- package/src/components/display/Avatar/Avatar.tsx +6 -19
- package/src/components/display/Avatar/Avatar.types.ts +1 -1
- package/src/components/display/Avatar/index.ts +1 -1
- package/src/components/display/Badge/Badge.tsx +3 -16
- package/src/components/display/Badge/Badge.types.ts +1 -1
- package/src/components/display/Badge/index.ts +1 -1
- package/src/components/display/Calendar/Calendar.styles.ts +36 -36
- package/src/components/display/Calendar/Calendar.test.tsx +27 -15
- package/src/components/display/Calendar/Calendar.tsx +56 -35
- package/src/components/display/Calendar/Calendar.types.ts +1 -1
- package/src/components/display/Calendar/index.ts +1 -1
- package/src/components/display/Card/Card.styles.ts +2 -2
- package/src/components/display/Card/Card.test.tsx +6 -4
- package/src/components/display/Card/Card.tsx +1 -1
- package/src/components/display/Card/Card.types.ts +4 -4
- package/src/components/display/Card/index.ts +1 -1
- package/src/components/display/Carousel/Carousel.styles.ts +31 -31
- package/src/components/display/Carousel/Carousel.tsx +34 -39
- package/src/components/display/Carousel/Carousel.types.ts +1 -1
- package/src/components/display/Carousel/index.ts +1 -1
- package/src/components/display/List/List.styles.ts +3 -3
- package/src/components/display/List/List.tsx +0 -1
- package/src/components/display/List/index.ts +1 -1
- package/src/components/display/Rate/Rate.styles.ts +5 -17
- package/src/components/display/Rate/Rate.tsx +6 -14
- package/src/components/display/Rate/Rate.types.ts +4 -3
- package/src/components/display/Rate/index.ts +3 -11
- package/src/components/display/Table/Table.test.tsx +2 -0
- package/src/components/display/Table/Table.tsx +3 -7
- package/src/components/display/Table/Table.types.ts +3 -2
- package/src/components/display/Tag/Tag.styles.ts +31 -31
- package/src/components/display/Tag/Tag.tsx +9 -26
- package/src/components/display/Tag/Tag.types.ts +1 -1
- package/src/components/display/Tag/index.ts +1 -1
- package/src/components/display/Timeline/Timeline.styles.ts +32 -32
- package/src/components/display/Timeline/Timeline.tsx +23 -42
- package/src/components/display/Timeline/Timeline.types.ts +1 -1
- package/src/components/display/Timeline/index.ts +1 -1
- package/src/components/display/index.tsx +33 -29
- package/src/components/feedback/Loading/Loading.tsx +6 -1
- package/src/components/feedback/Loading/index.ts +2 -5
- package/src/components/feedback/Message/Message.styles.ts +3 -3
- package/src/components/feedback/Message/index.ts +2 -5
- package/src/components/feedback/Modal/Modal.styles.ts +1 -1
- package/src/components/feedback/Modal/Modal.tsx +9 -31
- package/src/components/feedback/Modal/Modal.types.ts +12 -2
- package/src/components/feedback/Notification/Notification.styles.ts +49 -39
- package/src/components/feedback/Notification/Notification.test.tsx +1 -1
- package/src/components/feedback/Notification/Notification.tsx +97 -120
- package/src/components/feedback/Notification/Notification.types.ts +11 -8
- package/src/components/feedback/Notification/NotificationManager.tsx +135 -106
- package/src/components/feedback/Notification/index.ts +10 -3
- package/src/components/feedback/Notification/index.tsx +16 -26
- package/src/components/feedback/Progress/Progress.styles.ts +23 -14
- package/src/components/feedback/Progress/Progress.tsx +93 -113
- package/src/components/feedback/Progress/Progress.types.ts +1 -1
- package/src/components/feedback/Progress/index.ts +1 -1
- package/src/components/feedback/Progress/utils/animation.ts +12 -23
- package/src/components/feedback/Progress/utils/index.ts +2 -2
- package/src/components/feedback/Progress/utils/progress-calculator.ts +14 -32
- package/src/components/feedback/Result/Result.styles.ts +29 -29
- package/src/components/feedback/Result/Result.tsx +8 -20
- package/src/components/feedback/Result/Result.types.ts +7 -7
- package/src/components/feedback/Result/index.tsx +1 -1
- package/src/components/feedback/Toast/Toast.styles.ts +1 -1
- package/src/components/feedback/Toast/Toast.tsx +25 -13
- package/src/components/feedback/Tooltip/Tooltip.examples.tsx +21 -44
- package/src/components/feedback/Tooltip/Tooltip.styles.ts +16 -22
- package/src/components/feedback/Tooltip/Tooltip.test.tsx +1 -1
- package/src/components/feedback/Tooltip/Tooltip.tsx +65 -46
- package/src/components/feedback/Tooltip/Tooltip.types.ts +14 -20
- package/src/components/feedback/Tooltip/index.ts +1 -1
- package/src/components/feedback/Tooltip/index.tsx +12 -24
- package/src/components/feedback/index.tsx +54 -42
- package/src/components/form/Cascader/Cascader.styles.ts +2 -2
- package/src/components/form/Cascader/Cascader.tsx +84 -88
- package/src/components/form/Cascader/Cascader.types.ts +49 -50
- package/src/components/form/Cascader/hooks/useCascaderFieldNames.ts +11 -8
- package/src/components/form/Cascader/hooks/useCascaderOptions.ts +73 -55
- package/src/components/form/Cascader/hooks/useCascaderState.ts +31 -25
- package/src/components/form/Cascader/index.ts +1 -1
- package/src/components/form/Cascader/utils/formatDisplayValue.ts +4 -4
- package/src/components/form/Checkbox/Checkbox.styles.ts +83 -84
- package/src/components/form/Checkbox/Checkbox.tsx +2 -9
- package/src/components/form/Checkbox/CheckboxGroup.tsx +7 -7
- package/src/components/form/DatePicker/DatePicker.test.tsx +1 -1
- package/src/components/form/DatePicker/DatePicker.tsx +91 -75
- package/src/components/form/DatePicker/DatePicker.types.ts +4 -1
- package/src/components/form/Form/Form.tsx +66 -504
- package/src/components/form/Form/Form.types.ts +16 -1
- package/src/components/form/Form/useFormLogic.ts +497 -0
- package/src/components/form/Input/Input.styles.ts +8 -1
- package/src/components/form/Input/Input.tsx +55 -291
- package/src/components/form/Input/Input.types.ts +13 -1
- package/src/components/form/Input/useInputLogic.test.ts +82 -0
- package/src/components/form/Input/useInputLogic.ts +260 -0
- package/src/components/form/InputNumber/InputNumber.styles.ts +76 -25
- package/src/components/form/InputNumber/InputNumber.tsx +53 -21
- package/src/components/form/InputNumber/InputNumber.types.ts +21 -3
- package/src/components/form/InputNumber/components/InputNumberClearButton.tsx +3 -11
- package/src/components/form/InputNumber/components/InputNumberControls.tsx +3 -12
- package/src/components/form/InputNumber/hooks/index.ts +1 -1
- package/src/components/form/InputNumber/hooks/useInputNumberState.ts +7 -9
- package/src/components/form/InputNumber/hooks/useInputNumberValidation.ts +18 -17
- package/src/components/form/InputNumber/index.ts +7 -7
- package/src/components/form/Radio/Radio.styles.ts +1 -8
- package/src/components/form/Radio/Radio.tsx +3 -9
- package/src/components/form/Radio/Radio.types.ts +5 -1
- package/src/components/form/Select/Select.styles.ts +5 -1
- package/src/components/form/Select/Select.tsx +15 -15
- package/src/components/form/Select/Select.types.ts +2 -1
- package/src/components/form/Slider/Slider.styles.ts +13 -13
- package/src/components/form/Slider/Slider.tsx +19 -33
- package/src/components/form/Slider/Slider.types.ts +14 -12
- package/src/components/form/Slider/index.tsx +2 -9
- package/src/components/form/Switch/Switch.styles.ts +1 -7
- package/src/components/form/Switch/Switch.tsx +7 -13
- package/src/components/form/Textarea/Textarea.styles.ts +4 -4
- package/src/components/form/Textarea/Textarea.tsx +7 -1
- package/src/components/form/Textarea/Textarea.types.ts +4 -1
- package/src/components/form/TimePicker/TimePicker.styles.ts +8 -12
- package/src/components/form/TimePicker/TimePicker.tsx +122 -100
- package/src/components/form/TimePicker/TimePicker.types.ts +2 -2
- package/src/components/form/TimePicker/index.ts +1 -1
- package/src/components/form/Transfer/Transfer.styles.ts +3 -15
- package/src/components/form/Transfer/Transfer.tsx +146 -134
- package/src/components/form/Transfer/Transfer.types.ts +34 -26
- package/src/components/form/Transfer/components/TransferItem.tsx +55 -62
- package/src/components/form/Transfer/components/TransferList.tsx +212 -199
- package/src/components/form/Transfer/components/TransferOperations.tsx +52 -55
- package/src/components/form/Transfer/components/TransferPagination.tsx +115 -111
- package/src/components/form/Transfer/components/TransferSearch.tsx +52 -55
- package/src/components/form/Transfer/hooks/useTransferData.ts +91 -81
- package/src/components/form/Transfer/hooks/useTransferState.ts +22 -16
- package/src/components/form/Transfer/index.ts +2 -8
- package/src/components/form/Upload/Upload.styles.ts +21 -21
- package/src/components/form/Upload/Upload.tsx +189 -142
- package/src/components/form/Upload/Upload.types.ts +31 -31
- package/src/components/form/Upload/index.tsx +1 -1
- package/src/components/form/index.tsx +60 -29
- package/src/components/index.tsx +0 -1
- package/src/components/layout/Affix/Affix.styles.ts +16 -11
- package/src/components/layout/Affix/Affix.tsx +67 -75
- package/src/components/layout/Affix/Affix.types.ts +18 -18
- package/src/components/layout/Affix/index.tsx +1 -1
- package/src/components/layout/Col/Col.styles.ts +17 -17
- package/src/components/layout/Col/Col.test.tsx +7 -5
- package/src/components/layout/Col/Col.tsx +3 -21
- package/src/components/layout/Col/Col.types.ts +1 -1
- package/src/components/layout/Container/Container.styles.ts +3 -1
- package/src/components/layout/Container/Container.tsx +2 -11
- package/src/components/layout/Grid/Grid.tsx +3 -53
- package/src/components/layout/Layout/Content.tsx +24 -32
- package/src/components/layout/Layout/Footer.tsx +24 -32
- package/src/components/layout/Layout/Header.tsx +24 -32
- package/src/components/layout/Layout/Layout.styles.ts +17 -17
- package/src/components/layout/Layout/Layout.tsx +14 -25
- package/src/components/layout/Layout/Layout.types.ts +29 -29
- package/src/components/layout/Layout/Sider.tsx +44 -56
- package/src/components/layout/Layout/index.tsx +16 -2
- package/src/components/layout/Row/Row.tsx +15 -43
- package/src/components/layout/Space/Space.tsx +3 -11
- package/src/components/layout/Space/Space.types.ts +1 -1
- package/src/components/layout/index.tsx +29 -19
- package/src/components/navigation/Menu/Menu.constants.ts +69 -0
- package/src/components/navigation/Menu/Menu.stories.tsx +107 -0
- package/src/components/navigation/Menu/Menu.styles.ts +25 -37
- package/src/components/navigation/Menu/Menu.tsx +8 -11
- package/src/components/navigation/Menu/Menu.types.ts +2 -2
- package/src/components/navigation/Menu/Menu.utils.ts +17 -17
- package/src/components/navigation/Menu/MenuItem.tsx +9 -11
- package/src/components/navigation/Menu/SubMenu.tsx +8 -6
- package/src/components/navigation/Menu/index.tsx +4 -69
- package/src/components/navigation/NavBar/NavBar.styles.ts +1 -1
- package/src/components/navigation/NavBar/NavBar.tsx +7 -10
- package/src/components/navigation/NavBar/NavBar.types.ts +3 -3
- package/src/components/navigation/NavBar/index.tsx +1 -1
- package/src/components/navigation/Pagination/Pagination.test.tsx +2 -3
- package/src/components/navigation/Pagination/Pagination.tsx +3 -3
- package/src/components/navigation/Pagination/Pagination.types.ts +3 -2
- package/src/components/navigation/Pagination/index.ts +9 -3
- package/src/components/navigation/Steps/Step.tsx +24 -44
- package/src/components/navigation/Steps/Steps.styles.ts +28 -13
- package/src/components/navigation/Steps/Steps.test.tsx +2 -0
- package/src/components/navigation/Steps/Steps.tsx +88 -89
- package/src/components/navigation/Steps/Steps.types.ts +30 -30
- package/src/components/navigation/Steps/index.tsx +1 -1
- package/src/components/navigation/Tabs/Tabs.test.tsx +3 -2
- package/src/components/navigation/Tabs/Tabs.types.ts +4 -3
- package/src/components/navigation/index.tsx +21 -16
- package/src/constants/index.ts +1 -1
- package/src/hooks/index.ts +52 -102
- package/src/hooks/types.ts +4 -5
- package/src/hooks/useAsync.ts +46 -47
- package/src/hooks/useClickOutside.ts +52 -0
- package/src/hooks/useCounter.ts +87 -0
- package/src/hooks/useDebounce.ts +150 -0
- package/src/hooks/useDeepCompareEffect.ts +88 -0
- package/src/hooks/useEventListener.ts +77 -0
- package/src/hooks/useMediaQuery.ts +75 -0
- package/src/hooks/useMutation.ts +233 -0
- package/src/hooks/usePerformance.ts +1 -64
- package/src/hooks/usePlatform.ts +3 -1
- package/src/hooks/usePrevious.ts +25 -0
- package/src/hooks/useRequest.ts +12 -7
- package/src/hooks/useStateManagement.ts +1 -1
- package/src/hooks/useStorage.ts +169 -0
- package/src/hooks/useStyle.ts +8 -2
- package/src/hooks/useToggle.ts +54 -0
- package/src/index.ts +34 -9
- package/src/theme/ThemeProvider.tsx +3 -7
- package/src/theme/ThemeProvider.types.ts +1 -1
- package/src/theme/defaults.ts +1 -1
- package/src/theme/design-system.ts +2 -2
- package/src/theme/design-tokens.ts +85 -99
- package/src/theme/generated/dark-theme.scss +1 -1
- package/src/theme/generated/tokens.scss +82 -18
- package/src/theme/index.ts +8 -29
- package/src/theme/responsive.tsx +36 -34
- package/src/theme/styles.ts +1 -1
- package/src/theme/useThemeUtils.ts +43 -43
- package/src/theme/utils.ts +32 -32
- package/src/theme/variables.ts +70 -51
- package/src/types/accessibility.ts +36 -37
- package/src/types/button.ts +25 -27
- package/src/types/component-props.ts +6 -1
- package/src/types/glob.d.ts +4 -0
- package/src/types/index.ts +2 -2
- package/src/types/standardized-components.ts +9 -3
- package/src/types/utils.ts +13 -23
- package/src/utils/__tests__/responsiveUtils.test.ts +5 -4
- package/src/utils/abort-controller.ts +48 -0
- package/src/utils/cache.ts +2 -6
- package/src/utils/createNamespace.ts +4 -4
- package/src/utils/environment.ts +26 -6
- package/src/utils/error-handler.ts +2 -2
- package/src/utils/errorLogger.ts +16 -20
- package/src/utils/formatUtils.ts +38 -70
- package/src/utils/http/error-codes.ts +314 -0
- package/src/utils/http/http-client.test.ts +63 -0
- package/src/utils/{network → http}/http-client.ts +45 -35
- package/src/utils/http/request-cache.ts +127 -0
- package/src/utils/http/request.ts +954 -0
- package/src/utils/http/taro-adapter.test.ts +74 -0
- package/src/utils/http/taro-adapter.ts +24 -0
- package/src/utils/http/types.ts +414 -0
- package/src/utils/http/web-adapter.ts +33 -0
- package/src/utils/index.ts +5 -8
- package/src/utils/inputValidator.ts +17 -14
- package/src/utils/performance/performance.ts +60 -71
- package/src/utils/responsiveUtils.ts +7 -16
- package/src/utils/rtl-support.ts +29 -19
- package/src/utils/security/api-security.ts +47 -39
- package/src/utils/securityHeaders.ts +61 -67
- package/src/utils/typeHelpers.ts +10 -10
- package/src/utils/types/dataProcessing.ts +93 -92
- package/src/utils/types/typeHelpers.ts +31 -21
- package/src/utils/xssProtection.ts +96 -48
- package/dist/js/index-6NJ3A1Dn.js.map +0 -1
- package/dist/js/index-DffLRSro.js.map +0 -1
- package/src/components/form/Input/Input.enhanced.tsx +0 -732
- package/src/components/navigation/Menu/__tests__/Menu.test.tsx +0 -687
- package/src/components/navigation/Tree/Tree.styles.ts +0 -553
- package/src/components/navigation/Tree/Tree.test.basic.tsx +0 -7
- package/src/components/navigation/Tree/Tree.test.functional.tsx +0 -496
- package/src/components/navigation/Tree/Tree.test.import.check.tsx +0 -6
- package/src/components/navigation/Tree/Tree.test.import.tsx +0 -6
- package/src/components/navigation/Tree/Tree.test.minimal.tsx +0 -5
- package/src/components/navigation/Tree/Tree.test.simple.tsx +0 -30
- package/src/components/navigation/Tree/Tree.test.tsx +0 -908
- package/src/components/navigation/Tree/Tree.test.working.tsx +0 -673
- package/src/components/navigation/Tree/Tree.tsx +0 -600
- package/src/components/navigation/Tree/Tree.types.ts +0 -909
- package/src/components/navigation/Tree/Tree.utils.ts +0 -452
- package/src/components/navigation/Tree/index.ts +0 -33
- package/src/components/navigation/Tree/index.tsx +0 -23
- package/src/utils/network/http-client.test.ts +0 -18
|
@@ -64,136 +64,145 @@ export const TransferComponent = forwardRef<TransferRef, TransferProps>((props,
|
|
|
64
64
|
setSearchValue,
|
|
65
65
|
setPage,
|
|
66
66
|
reset,
|
|
67
|
-
} = useTransferState(
|
|
68
|
-
controlledTargetKeys,
|
|
69
|
-
defaultTargetKeys,
|
|
70
|
-
controlledSelectedKeys,
|
|
71
|
-
defaultSelectedKeys,
|
|
72
|
-
disabled
|
|
73
|
-
);
|
|
67
|
+
} = useTransferState(controlledTargetKeys, defaultTargetKeys, controlledSelectedKeys, defaultSelectedKeys, disabled);
|
|
74
68
|
|
|
75
69
|
// 处理选项点击
|
|
76
|
-
const handleItemClick = useCallback(
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
70
|
+
const handleItemClick = useCallback(
|
|
71
|
+
(item: TransferOption, _direction: TransferDirection) => {
|
|
72
|
+
if (item.disabled || internalDisabled) return;
|
|
73
|
+
|
|
74
|
+
const itemKey = item.key;
|
|
75
|
+
const newSelectedKeys = selectedKeys.includes(itemKey)
|
|
76
|
+
? selectedKeys.filter((key) => key !== itemKey)
|
|
77
|
+
: [...selectedKeys, itemKey];
|
|
78
|
+
|
|
79
|
+
updateSelectedKeys(newSelectedKeys);
|
|
80
|
+
updateLeftRightSelectedKeys(newSelectedKeys, targetKeys);
|
|
81
|
+
|
|
82
|
+
onSelectChange?.(
|
|
83
|
+
newSelectedKeys.filter((key) => !targetKeys.includes(key)),
|
|
84
|
+
newSelectedKeys.filter((key) => targetKeys.includes(key)),
|
|
85
|
+
);
|
|
86
|
+
},
|
|
87
|
+
[selectedKeys, targetKeys, internalDisabled, updateSelectedKeys, updateLeftRightSelectedKeys, onSelectChange],
|
|
88
|
+
);
|
|
92
89
|
|
|
93
90
|
// 处理全选
|
|
94
|
-
const handleSelectAll = useCallback(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
91
|
+
const handleSelectAll = useCallback(
|
|
92
|
+
(direction: TransferDirection) => {
|
|
93
|
+
if (internalDisabled) return;
|
|
94
|
+
|
|
95
|
+
const sourceData =
|
|
96
|
+
direction === 'left'
|
|
97
|
+
? dataSource.filter((item: TransferOption) => !targetKeys.includes(item.key))
|
|
98
|
+
: dataSource.filter((item: TransferOption) => targetKeys.includes(item.key));
|
|
99
|
+
|
|
100
|
+
const searchValue = direction === 'left' ? leftSearchValue : rightSearchValue;
|
|
101
|
+
|
|
102
|
+
// 过滤数据
|
|
103
|
+
const filteredData = searchValue
|
|
104
|
+
? sourceData.filter((item: TransferOption) => {
|
|
105
|
+
if (filterOption) {
|
|
106
|
+
return filterOption(searchValue, item);
|
|
107
|
+
}
|
|
108
|
+
const searchText = searchValue.toLowerCase();
|
|
109
|
+
const title = String(item.title).toLowerCase();
|
|
110
|
+
const description = item.description ? String(item.description).toLowerCase() : '';
|
|
111
|
+
return title.includes(searchText) || description.includes(searchText);
|
|
112
|
+
})
|
|
113
|
+
: sourceData;
|
|
114
|
+
|
|
115
|
+
const enabledData = filteredData.filter((item: TransferOption) => !item.disabled);
|
|
116
|
+
const currentSelectedKeys = direction === 'left' ? leftSelectedKeys : rightSelectedKeys;
|
|
117
|
+
|
|
118
|
+
const allSelected = enabledData.every((item: TransferOption) => currentSelectedKeys.includes(item.key));
|
|
119
|
+
const newSelectedKeys = allSelected
|
|
120
|
+
? selectedKeys.filter((key) => !enabledData.some((item: TransferOption) => item.key === key))
|
|
121
|
+
: [...selectedKeys, ...enabledData.map((item: TransferOption) => item.key)];
|
|
122
|
+
|
|
123
|
+
updateSelectedKeys(newSelectedKeys);
|
|
124
|
+
updateLeftRightSelectedKeys(newSelectedKeys, targetKeys);
|
|
125
|
+
|
|
126
|
+
onSelectChange?.(
|
|
127
|
+
newSelectedKeys.filter((key) => !targetKeys.includes(key)),
|
|
128
|
+
newSelectedKeys.filter((key) => targetKeys.includes(key)),
|
|
129
|
+
);
|
|
130
|
+
},
|
|
131
|
+
[
|
|
132
|
+
dataSource,
|
|
133
|
+
targetKeys,
|
|
134
|
+
leftSearchValue,
|
|
135
|
+
rightSearchValue,
|
|
136
|
+
leftSelectedKeys,
|
|
137
|
+
rightSelectedKeys,
|
|
138
|
+
selectedKeys,
|
|
139
|
+
internalDisabled,
|
|
140
|
+
filterOption,
|
|
141
|
+
updateSelectedKeys,
|
|
142
|
+
updateLeftRightSelectedKeys,
|
|
143
|
+
onSelectChange,
|
|
144
|
+
],
|
|
145
|
+
);
|
|
145
146
|
|
|
146
147
|
// 处理移动
|
|
147
|
-
const handleMove = useCallback(
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
148
|
+
const handleMove = useCallback(
|
|
149
|
+
(direction: TransferDirection) => {
|
|
150
|
+
if (internalDisabled) return;
|
|
151
|
+
|
|
152
|
+
const moveKeys = direction === 'right' ? leftSelectedKeys : rightSelectedKeys;
|
|
153
|
+
if (moveKeys.length === 0) return;
|
|
154
|
+
|
|
155
|
+
const newTargetKeys =
|
|
156
|
+
direction === 'right' ? [...targetKeys, ...moveKeys] : targetKeys.filter((key) => !moveKeys.includes(key));
|
|
157
|
+
|
|
158
|
+
updateTargetKeys(newTargetKeys);
|
|
159
|
+
|
|
160
|
+
// 清空移动方向的选中状态
|
|
161
|
+
const newSelectedKeys = selectedKeys.filter((key) => !moveKeys.includes(key));
|
|
162
|
+
updateSelectedKeys(newSelectedKeys);
|
|
163
|
+
|
|
164
|
+
if (direction === 'right') {
|
|
165
|
+
updateLeftRightSelectedKeys(newSelectedKeys, newTargetKeys);
|
|
166
|
+
} else {
|
|
167
|
+
updateLeftRightSelectedKeys(newSelectedKeys, newTargetKeys);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
onChange?.(newTargetKeys, direction, moveKeys);
|
|
171
|
+
onSelectChange?.(
|
|
172
|
+
newSelectedKeys.filter((key) => !newTargetKeys.includes(key)),
|
|
173
|
+
newSelectedKeys.filter((key) => newTargetKeys.includes(key)),
|
|
174
|
+
);
|
|
175
|
+
},
|
|
176
|
+
[
|
|
177
|
+
targetKeys,
|
|
178
|
+
leftSelectedKeys,
|
|
179
|
+
rightSelectedKeys,
|
|
180
|
+
selectedKeys,
|
|
181
|
+
internalDisabled,
|
|
182
|
+
updateTargetKeys,
|
|
183
|
+
updateSelectedKeys,
|
|
184
|
+
updateLeftRightSelectedKeys,
|
|
185
|
+
onChange,
|
|
186
|
+
onSelectChange,
|
|
187
|
+
],
|
|
188
|
+
);
|
|
186
189
|
|
|
187
190
|
// 处理搜索
|
|
188
|
-
const handleSearch = useCallback(
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
191
|
+
const handleSearch = useCallback(
|
|
192
|
+
(direction: TransferDirection, value: string) => {
|
|
193
|
+
setSearchValue(direction, value);
|
|
194
|
+
onSearch?.(direction, value);
|
|
195
|
+
},
|
|
196
|
+
[setSearchValue, onSearch],
|
|
197
|
+
);
|
|
192
198
|
|
|
193
199
|
// 处理页码变化
|
|
194
|
-
const handlePageChange = useCallback(
|
|
195
|
-
|
|
196
|
-
|
|
200
|
+
const handlePageChange = useCallback(
|
|
201
|
+
(direction: TransferDirection, page: number) => {
|
|
202
|
+
setPage(direction, page);
|
|
203
|
+
},
|
|
204
|
+
[setPage],
|
|
205
|
+
);
|
|
197
206
|
|
|
198
207
|
// 暴露给外部的引用方法
|
|
199
208
|
React.useImperativeHandle(
|
|
@@ -202,15 +211,19 @@ export const TransferComponent = forwardRef<TransferRef, TransferProps>((props,
|
|
|
202
211
|
getTargetKeys: () => targetKeys,
|
|
203
212
|
setTargetKeys: (keys: TransferValue) => {
|
|
204
213
|
updateTargetKeys(keys);
|
|
205
|
-
onChange?.(
|
|
214
|
+
onChange?.(
|
|
215
|
+
keys,
|
|
216
|
+
'right',
|
|
217
|
+
keys.filter((key) => !targetKeys.includes(key)),
|
|
218
|
+
);
|
|
206
219
|
},
|
|
207
220
|
getSelectedKeys: () => selectedKeys,
|
|
208
221
|
setSelectedKeys: (keys: TransferValue) => {
|
|
209
222
|
updateSelectedKeys(keys);
|
|
210
223
|
updateLeftRightSelectedKeys(keys, targetKeys);
|
|
211
224
|
onSelectChange?.(
|
|
212
|
-
keys.filter(key => !targetKeys.includes(key)),
|
|
213
|
-
keys.filter(key => targetKeys.includes(key))
|
|
225
|
+
keys.filter((key) => !targetKeys.includes(key)),
|
|
226
|
+
keys.filter((key) => targetKeys.includes(key)),
|
|
214
227
|
);
|
|
215
228
|
},
|
|
216
229
|
getDataSource: () => dataSource,
|
|
@@ -220,10 +233,9 @@ export const TransferComponent = forwardRef<TransferRef, TransferProps>((props,
|
|
|
220
233
|
console.warn('setDataSource should be updated through props');
|
|
221
234
|
},
|
|
222
235
|
moveTo: (direction: TransferDirection, keys: TransferValue) => {
|
|
223
|
-
const newTargetKeys =
|
|
224
|
-
? [...targetKeys, ...keys]
|
|
225
|
-
|
|
226
|
-
|
|
236
|
+
const newTargetKeys =
|
|
237
|
+
direction === 'right' ? [...targetKeys, ...keys] : targetKeys.filter((key) => !keys.includes(key));
|
|
238
|
+
|
|
227
239
|
updateTargetKeys(newTargetKeys);
|
|
228
240
|
onChange?.(newTargetKeys, direction, keys);
|
|
229
241
|
},
|
|
@@ -231,20 +243,20 @@ export const TransferComponent = forwardRef<TransferRef, TransferProps>((props,
|
|
|
231
243
|
handleSelectAll(direction);
|
|
232
244
|
},
|
|
233
245
|
clearSelect: (direction: TransferDirection) => {
|
|
234
|
-
const newSelectedKeys = selectedKeys.filter(key => {
|
|
246
|
+
const newSelectedKeys = selectedKeys.filter((key) => {
|
|
235
247
|
if (direction === 'left') {
|
|
236
248
|
return targetKeys.includes(key);
|
|
237
249
|
} else {
|
|
238
250
|
return !targetKeys.includes(key);
|
|
239
251
|
}
|
|
240
252
|
});
|
|
241
|
-
|
|
253
|
+
|
|
242
254
|
updateSelectedKeys(newSelectedKeys);
|
|
243
255
|
updateLeftRightSelectedKeys(newSelectedKeys, targetKeys);
|
|
244
|
-
|
|
256
|
+
|
|
245
257
|
onSelectChange?.(
|
|
246
|
-
newSelectedKeys.filter(key => !targetKeys.includes(key)),
|
|
247
|
-
newSelectedKeys.filter(key => targetKeys.includes(key))
|
|
258
|
+
newSelectedKeys.filter((key) => !targetKeys.includes(key)),
|
|
259
|
+
newSelectedKeys.filter((key) => targetKeys.includes(key)),
|
|
248
260
|
);
|
|
249
261
|
},
|
|
250
262
|
search: (direction: TransferDirection, value: string) => {
|
|
@@ -286,7 +298,7 @@ export const TransferComponent = forwardRef<TransferRef, TransferProps>((props,
|
|
|
286
298
|
handleSelectAll,
|
|
287
299
|
handleSearch,
|
|
288
300
|
reset,
|
|
289
|
-
]
|
|
301
|
+
],
|
|
290
302
|
);
|
|
291
303
|
|
|
292
304
|
// 生成容器样式
|
|
@@ -399,4 +411,4 @@ TransferComponent.displayName = 'Transfer';
|
|
|
399
411
|
|
|
400
412
|
/** 导出Transfer组件 */
|
|
401
413
|
export const Transfer = TransferComponent;
|
|
402
|
-
export default Transfer;
|
|
414
|
+
export default Transfer;
|
|
@@ -262,18 +262,29 @@ export interface TransferConfig {
|
|
|
262
262
|
/** 穿梭框工具函数接口 */
|
|
263
263
|
export interface TransferUtils {
|
|
264
264
|
/** 过滤选项 */
|
|
265
|
-
filterOptions: (
|
|
265
|
+
filterOptions: (
|
|
266
|
+
options: TransferDataSource,
|
|
267
|
+
inputValue: string,
|
|
268
|
+
filterOption?: TransferProps['filterOption'],
|
|
269
|
+
) => TransferDataSource;
|
|
266
270
|
/** 查找选项 */
|
|
267
271
|
findOptions: (options: TransferDataSource, keys: TransferValue) => TransferOption[];
|
|
268
272
|
/** 验证值 */
|
|
269
273
|
validateValue: (value: TransferValue, options: TransferDataSource) => boolean;
|
|
270
274
|
/** 分割数据源 */
|
|
271
|
-
splitDataSource: (
|
|
275
|
+
splitDataSource: (
|
|
276
|
+
dataSource: TransferDataSource,
|
|
277
|
+
targetKeys: TransferValue,
|
|
278
|
+
) => {
|
|
272
279
|
leftDataSource: TransferDataSource;
|
|
273
280
|
rightDataSource: TransferDataSource;
|
|
274
281
|
};
|
|
275
282
|
/** 生成分页数据 */
|
|
276
|
-
generatePaginationData: (
|
|
283
|
+
generatePaginationData: (
|
|
284
|
+
data: TransferDataSource,
|
|
285
|
+
currentPage: number,
|
|
286
|
+
pageSize: number,
|
|
287
|
+
) => {
|
|
277
288
|
data: TransferDataSource;
|
|
278
289
|
total: number;
|
|
279
290
|
currentPage: number;
|
|
@@ -348,11 +359,11 @@ export class TransferTools {
|
|
|
348
359
|
static filterOptions(
|
|
349
360
|
options: TransferDataSource,
|
|
350
361
|
inputValue: string,
|
|
351
|
-
filterOption?: TransferProps['filterOption']
|
|
362
|
+
filterOption?: TransferProps['filterOption'],
|
|
352
363
|
): TransferDataSource {
|
|
353
364
|
if (!inputValue) return options;
|
|
354
365
|
|
|
355
|
-
return options.filter(option => {
|
|
366
|
+
return options.filter((option) => {
|
|
356
367
|
if (filterOption) {
|
|
357
368
|
return filterOption(inputValue, option);
|
|
358
369
|
}
|
|
@@ -367,19 +378,19 @@ export class TransferTools {
|
|
|
367
378
|
|
|
368
379
|
/** 查找选项 */
|
|
369
380
|
static findOptions(options: TransferDataSource, keys: TransferValue): TransferOption[] {
|
|
370
|
-
return options.filter(option => keys.includes(option.key));
|
|
381
|
+
return options.filter((option) => keys.includes(option.key));
|
|
371
382
|
}
|
|
372
383
|
|
|
373
384
|
/** 验证值 */
|
|
374
385
|
static validateValue(value: TransferValue, options: TransferDataSource): boolean {
|
|
375
|
-
const validKeys = options.map(option => option.key);
|
|
376
|
-
return value.every(key => validKeys.includes(key));
|
|
386
|
+
const validKeys = options.map((option) => option.key);
|
|
387
|
+
return value.every((key) => validKeys.includes(key));
|
|
377
388
|
}
|
|
378
389
|
|
|
379
390
|
/** 分割数据源 */
|
|
380
391
|
static splitDataSource(
|
|
381
392
|
dataSource: TransferDataSource,
|
|
382
|
-
targetKeys: TransferValue
|
|
393
|
+
targetKeys: TransferValue,
|
|
383
394
|
): {
|
|
384
395
|
leftDataSource: TransferDataSource;
|
|
385
396
|
rightDataSource: TransferDataSource;
|
|
@@ -387,7 +398,7 @@ export class TransferTools {
|
|
|
387
398
|
const leftDataSource: TransferDataSource = [];
|
|
388
399
|
const rightDataSource: TransferDataSource = [];
|
|
389
400
|
|
|
390
|
-
dataSource.forEach(option => {
|
|
401
|
+
dataSource.forEach((option) => {
|
|
391
402
|
if (targetKeys.includes(option.key)) {
|
|
392
403
|
rightDataSource.push(option);
|
|
393
404
|
} else {
|
|
@@ -402,7 +413,7 @@ export class TransferTools {
|
|
|
402
413
|
static generatePaginationData(
|
|
403
414
|
data: TransferDataSource,
|
|
404
415
|
currentPage: number,
|
|
405
|
-
pageSize: number
|
|
416
|
+
pageSize: number,
|
|
406
417
|
): {
|
|
407
418
|
data: TransferDataSource;
|
|
408
419
|
total: number;
|
|
@@ -426,23 +437,20 @@ export class TransferTools {
|
|
|
426
437
|
}
|
|
427
438
|
|
|
428
439
|
/** 获取选中的选项 */
|
|
429
|
-
static getSelectedOptions(
|
|
430
|
-
options
|
|
431
|
-
selectedKeys: TransferValue
|
|
432
|
-
): TransferOption[] {
|
|
433
|
-
return options.filter(option => selectedKeys.includes(option.key));
|
|
440
|
+
static getSelectedOptions(options: TransferDataSource, selectedKeys: TransferValue): TransferOption[] {
|
|
441
|
+
return options.filter((option) => selectedKeys.includes(option.key));
|
|
434
442
|
}
|
|
435
443
|
|
|
436
444
|
/** 获取禁用的选项 */
|
|
437
445
|
static getDisabledOptions(options: TransferDataSource): TransferOption[] {
|
|
438
|
-
return options.filter(option => option.disabled);
|
|
446
|
+
return options.filter((option) => option.disabled);
|
|
439
447
|
}
|
|
440
448
|
|
|
441
449
|
/** 排序选项 */
|
|
442
450
|
static sortOptions(
|
|
443
451
|
options: TransferDataSource,
|
|
444
452
|
sortBy: keyof TransferOption,
|
|
445
|
-
order: 'asc' | 'desc' = 'asc'
|
|
453
|
+
order: 'asc' | 'desc' = 'asc',
|
|
446
454
|
): TransferDataSource {
|
|
447
455
|
return [...options].sort((a, b) => {
|
|
448
456
|
const aValue = a[sortBy];
|
|
@@ -457,7 +465,7 @@ export class TransferTools {
|
|
|
457
465
|
/** 去重选项 */
|
|
458
466
|
static uniqueOptions(options: TransferDataSource): TransferDataSource {
|
|
459
467
|
const seen = new Set();
|
|
460
|
-
return options.filter(option => {
|
|
468
|
+
return options.filter((option) => {
|
|
461
469
|
if (seen.has(option.key)) {
|
|
462
470
|
return false;
|
|
463
471
|
}
|
|
@@ -469,10 +477,10 @@ export class TransferTools {
|
|
|
469
477
|
/** 批量更新选项状态 */
|
|
470
478
|
static updateOptionsStatus(
|
|
471
479
|
options: TransferDataSource,
|
|
472
|
-
updates: { key: string | number; disabled?: boolean; selected?: boolean }[]
|
|
480
|
+
updates: { key: string | number; disabled?: boolean; selected?: boolean }[],
|
|
473
481
|
): TransferDataSource {
|
|
474
|
-
return options.map(option => {
|
|
475
|
-
const update = updates.find(u => u.key === option.key);
|
|
482
|
+
return options.map((option) => {
|
|
483
|
+
const update = updates.find((u) => u.key === option.key);
|
|
476
484
|
if (update) {
|
|
477
485
|
return { ...option, ...update };
|
|
478
486
|
}
|
|
@@ -483,7 +491,7 @@ export class TransferTools {
|
|
|
483
491
|
/** 计算选中状态 */
|
|
484
492
|
static calculateSelectionState(
|
|
485
493
|
options: TransferDataSource,
|
|
486
|
-
selectedKeys: TransferValue
|
|
494
|
+
selectedKeys: TransferValue,
|
|
487
495
|
): {
|
|
488
496
|
allSelected: boolean;
|
|
489
497
|
partiallySelected: boolean;
|
|
@@ -491,9 +499,9 @@ export class TransferTools {
|
|
|
491
499
|
selectedCount: number;
|
|
492
500
|
totalCount: number;
|
|
493
501
|
} {
|
|
494
|
-
const enabledOptions = options.filter(option => !option.disabled);
|
|
502
|
+
const enabledOptions = options.filter((option) => !option.disabled);
|
|
495
503
|
const totalCount = enabledOptions.length;
|
|
496
|
-
const selectedCount = enabledOptions.filter(option => selectedKeys.includes(option.key)).length;
|
|
504
|
+
const selectedCount = enabledOptions.filter((option) => selectedKeys.includes(option.key)).length;
|
|
497
505
|
|
|
498
506
|
const allSelected = totalCount > 0 && selectedCount === totalCount;
|
|
499
507
|
const noneSelected = selectedCount === 0;
|
|
@@ -554,4 +562,4 @@ export class TransferTools {
|
|
|
554
562
|
showQuickJumper: pagination.showQuickJumper || false,
|
|
555
563
|
};
|
|
556
564
|
}
|
|
557
|
-
}
|
|
565
|
+
}
|
|
@@ -23,79 +23,72 @@ interface TransferItemProps {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/** Transfer选项组件 */
|
|
26
|
-
export const TransferItem: React.FC<TransferItemProps> = memo(
|
|
27
|
-
item,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (
|
|
39
|
-
|
|
26
|
+
export const TransferItem: React.FC<TransferItemProps> = memo(
|
|
27
|
+
({ item, direction, isSelected, disabled, onClick, optionRender, rowRender, index = 0 }) => {
|
|
28
|
+
// 处理点击事件
|
|
29
|
+
const handleClick = useCallback(() => {
|
|
30
|
+
if (!disabled) {
|
|
31
|
+
onClick(item, direction);
|
|
32
|
+
}
|
|
33
|
+
}, [item, direction, disabled, onClick]);
|
|
34
|
+
|
|
35
|
+
// 移除了鼠标事件处理函数,因为在Taro环境中可能不支持
|
|
36
|
+
|
|
37
|
+
// 使用自定义行渲染
|
|
38
|
+
if (rowRender) {
|
|
39
|
+
return (
|
|
40
|
+
<View
|
|
41
|
+
key={String(item.key)}
|
|
42
|
+
style={TransferStyles['getListItemStyle'](disabled, isSelected)}
|
|
43
|
+
className={item.className}
|
|
44
|
+
onClick={handleClick}
|
|
45
|
+
accessibilityState={{ selected: isSelected, disabled: disabled }}
|
|
46
|
+
role="option"
|
|
47
|
+
>
|
|
48
|
+
{rowRender(item, index, direction)}
|
|
49
|
+
</View>
|
|
50
|
+
);
|
|
40
51
|
}
|
|
41
|
-
}, [item, direction, disabled, onClick]);
|
|
42
52
|
|
|
43
|
-
|
|
53
|
+
// 默认渲染
|
|
54
|
+
const itemStyle = {
|
|
55
|
+
...TransferStyles['getListItemStyle'](disabled, isSelected),
|
|
56
|
+
...(item.style || {}),
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const checkboxStyle = {
|
|
60
|
+
...TransferStyles['getListItemCheckboxStyle'](),
|
|
61
|
+
...(isSelected ? TransferStyles['getListItemCheckboxSelectedStyle']() : {}),
|
|
62
|
+
...(disabled ? TransferStyles['getListItemCheckboxDisabledStyle']() : {}),
|
|
63
|
+
};
|
|
44
64
|
|
|
45
|
-
// 使用自定义行渲染
|
|
46
|
-
if (rowRender) {
|
|
47
65
|
return (
|
|
48
66
|
<View
|
|
49
67
|
key={String(item.key)}
|
|
50
|
-
style={
|
|
68
|
+
style={itemStyle}
|
|
51
69
|
className={item.className}
|
|
52
70
|
onClick={handleClick}
|
|
53
|
-
|
|
71
|
+
accessibilityState={{ selected: isSelected, disabled: disabled }}
|
|
54
72
|
role="option"
|
|
55
73
|
>
|
|
56
|
-
{
|
|
74
|
+
<View style={checkboxStyle} hidden={true}>
|
|
75
|
+
{isSelected && <Text accessibilityLabel="已选中">✓</Text>}
|
|
76
|
+
</View>
|
|
77
|
+
<View style={TransferStyles['getListItemContentStyle']()}>
|
|
78
|
+
{optionRender ? (
|
|
79
|
+
optionRender(item)
|
|
80
|
+
) : (
|
|
81
|
+
<View>
|
|
82
|
+
<Text>{item.title}</Text>
|
|
83
|
+
{item.description && (
|
|
84
|
+
<Text style={TransferStyles['getListItemDescriptionStyle']()}>{item.description}</Text>
|
|
85
|
+
)}
|
|
86
|
+
</View>
|
|
87
|
+
)}
|
|
88
|
+
</View>
|
|
57
89
|
</View>
|
|
58
90
|
);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// 默认渲染
|
|
62
|
-
const itemStyle = {
|
|
63
|
-
...TransferStyles['getListItemStyle'](disabled, isSelected),
|
|
64
|
-
...(item.style || {}),
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
const checkboxStyle = {
|
|
68
|
-
...TransferStyles['getListItemCheckboxStyle'](),
|
|
69
|
-
...(isSelected ? TransferStyles['getListItemCheckboxSelectedStyle']() : {}),
|
|
70
|
-
...(disabled ? TransferStyles['getListItemCheckboxDisabledStyle']() : {}),
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
return (
|
|
74
|
-
<View
|
|
75
|
-
key={String(item.key)}
|
|
76
|
-
style={itemStyle}
|
|
77
|
-
className={item.className}
|
|
78
|
-
onClick={handleClick}
|
|
79
|
-
accessibilityState={{ selected: isSelected, disabled: disabled }}
|
|
80
|
-
role="option"
|
|
81
|
-
>
|
|
82
|
-
<View style={checkboxStyle} hidden={true}>
|
|
83
|
-
{isSelected && <Text accessibilityLabel="已选中">✓</Text>}
|
|
84
|
-
</View>
|
|
85
|
-
<View style={TransferStyles['getListItemContentStyle']()}>
|
|
86
|
-
{optionRender ? optionRender(item) : (
|
|
87
|
-
<View>
|
|
88
|
-
<Text>{item.title}</Text>
|
|
89
|
-
{item.description && (
|
|
90
|
-
<Text style={TransferStyles['getListItemDescriptionStyle']()}>
|
|
91
|
-
{item.description}
|
|
92
|
-
</Text>
|
|
93
|
-
)}
|
|
94
|
-
</View>
|
|
95
|
-
)}
|
|
96
|
-
</View>
|
|
97
|
-
</View>
|
|
98
|
-
);
|
|
99
|
-
});
|
|
91
|
+
},
|
|
92
|
+
);
|
|
100
93
|
|
|
101
94
|
TransferItem.displayName = 'TransferItem';
|