@fjyueke/arco-mcp 1.0.0

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.
Files changed (191) hide show
  1. package/README.md +85 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +244 -0
  4. package/metaData/components/action-sheet/doc.md +102 -0
  5. package/metaData/components/action-sheet/example/index.tsx +199 -0
  6. package/metaData/components/action-sheet/example/methods.tsx +6 -0
  7. package/metaData/components/avatar/doc.md +57 -0
  8. package/metaData/components/avatar/example/group.tsx +69 -0
  9. package/metaData/components/avatar/example/index.tsx +196 -0
  10. package/metaData/components/badge/doc.md +28 -0
  11. package/metaData/components/badge/example/index.tsx +128 -0
  12. package/metaData/components/button/doc.md +45 -0
  13. package/metaData/components/button/example/index.tsx +264 -0
  14. package/metaData/components/carousel/doc.md +89 -0
  15. package/metaData/components/carousel/example/index.tsx +1481 -0
  16. package/metaData/components/cell/doc.md +68 -0
  17. package/metaData/components/cell/example/arrow.tsx +13 -0
  18. package/metaData/components/cell/example/cell.tsx +71 -0
  19. package/metaData/components/cell/example/group.tsx +63 -0
  20. package/metaData/components/cell/example/index.tsx +19 -0
  21. package/metaData/components/checkbox/doc.md +91 -0
  22. package/metaData/components/checkbox/example/checkbox.tsx +158 -0
  23. package/metaData/components/checkbox/example/group.tsx +103 -0
  24. package/metaData/components/checkbox/example/index.tsx +25 -0
  25. package/metaData/components/circle-progress/doc.md +40 -0
  26. package/metaData/components/circle-progress/example/index.tsx +323 -0
  27. package/metaData/components/collapse/doc.md +74 -0
  28. package/metaData/components/collapse/example/collapse.tsx +183 -0
  29. package/metaData/components/collapse/example/group.tsx +136 -0
  30. package/metaData/components/collapse/example/index.tsx +16 -0
  31. package/metaData/components/collapse/example/utils.tsx +20 -0
  32. package/metaData/components/context-provider/doc.md +44 -0
  33. package/metaData/components/context-provider/example/index.tsx +208 -0
  34. package/metaData/components/count-down/doc.md +40 -0
  35. package/metaData/components/count-down/example/hooks.tsx +118 -0
  36. package/metaData/components/count-down/example/index.tsx +63 -0
  37. package/metaData/components/date-picker/doc.md +102 -0
  38. package/metaData/components/date-picker/example/index.tsx +545 -0
  39. package/metaData/components/dialog/doc.md +200 -0
  40. package/metaData/components/dialog/example/index.tsx +328 -0
  41. package/metaData/components/dialog/example/methods.tsx +56 -0
  42. package/metaData/components/divider/doc.md +25 -0
  43. package/metaData/components/divider/example/index.tsx +87 -0
  44. package/metaData/components/dropdown/doc.md +80 -0
  45. package/metaData/components/dropdown/example/dropdown.tsx +308 -0
  46. package/metaData/components/dropdown/example/index.tsx +19 -0
  47. package/metaData/components/dropdown/example/options.tsx +103 -0
  48. package/metaData/components/dropdown-menu/doc.md +91 -0
  49. package/metaData/components/dropdown-menu/example/dropdown-menu.tsx +270 -0
  50. package/metaData/components/dropdown-menu/example/index.tsx +16 -0
  51. package/metaData/components/ellipsis/doc.md +33 -0
  52. package/metaData/components/ellipsis/example/index.tsx +93 -0
  53. package/metaData/components/ellipsis/example/js-ellipsis.tsx +229 -0
  54. package/metaData/components/ellipsis/example/native-ellipsis.tsx +48 -0
  55. package/metaData/components/form/doc.md +90 -0
  56. package/metaData/components/form/example/form-item-context.tsx +8 -0
  57. package/metaData/components/form/example/form-item.tsx +378 -0
  58. package/metaData/components/form/example/index.tsx +87 -0
  59. package/metaData/components/form/example/linked-container.tsx +66 -0
  60. package/metaData/components/grid/doc.md +39 -0
  61. package/metaData/components/grid/example/index.tsx +252 -0
  62. package/metaData/components/icon/doc.md +15 -0
  63. package/metaData/components/icon/example/index.tsx +32 -0
  64. package/metaData/components/image/doc.md +62 -0
  65. package/metaData/components/image/example/index.tsx +528 -0
  66. package/metaData/components/image-picker/doc.md +116 -0
  67. package/metaData/components/image-picker/example/add-icon.tsx +14 -0
  68. package/metaData/components/image-picker/example/index.tsx +175 -0
  69. package/metaData/components/image-preview/doc.md +119 -0
  70. package/metaData/components/image-preview/example/index.tsx +1290 -0
  71. package/metaData/components/image-preview/example/methods.tsx +72 -0
  72. package/metaData/components/index-bar/doc.md +83 -0
  73. package/metaData/components/index-bar/example/group.tsx +93 -0
  74. package/metaData/components/index-bar/example/index.tsx +271 -0
  75. package/metaData/components/index-bar/example/side-bar.tsx +82 -0
  76. package/metaData/components/input/doc.md +60 -0
  77. package/metaData/components/input/example/hooks.tsx +259 -0
  78. package/metaData/components/input/example/index.tsx +134 -0
  79. package/metaData/components/input/example/props.tsx +183 -0
  80. package/metaData/components/keyboard/doc.md +73 -0
  81. package/metaData/components/keyboard/example/index.tsx +238 -0
  82. package/metaData/components/load-more/doc.md +48 -0
  83. package/metaData/components/load-more/example/index.tsx +395 -0
  84. package/metaData/components/loading/doc.md +34 -0
  85. package/metaData/components/loading/example/index.tsx +312 -0
  86. package/metaData/components/masking/doc.md +93 -0
  87. package/metaData/components/masking/example/index.tsx +410 -0
  88. package/metaData/components/masking/example/methods.tsx +88 -0
  89. package/metaData/components/nav-bar/doc.md +40 -0
  90. package/metaData/components/nav-bar/example/back-icon.tsx +28 -0
  91. package/metaData/components/nav-bar/example/index.tsx +305 -0
  92. package/metaData/components/notice-bar/doc.md +34 -0
  93. package/metaData/components/notice-bar/example/index.tsx +294 -0
  94. package/metaData/components/notify/doc.md +81 -0
  95. package/metaData/components/notify/example/index.tsx +171 -0
  96. package/metaData/components/notify/example/methods.tsx +83 -0
  97. package/metaData/components/pagination/doc.md +41 -0
  98. package/metaData/components/pagination/example/arrow.tsx +14 -0
  99. package/metaData/components/pagination/example/index.tsx +292 -0
  100. package/metaData/components/picker/doc.md +89 -0
  101. package/metaData/components/picker/example/index.tsx +217 -0
  102. package/metaData/components/picker-view/doc.md +57 -0
  103. package/metaData/components/picker-view/example/cascader.tsx +141 -0
  104. package/metaData/components/picker-view/example/index.tsx +297 -0
  105. package/metaData/components/picker-view/example/multi-picker.tsx +66 -0
  106. package/metaData/components/picker-view/example/picker-cell.tsx +416 -0
  107. package/metaData/components/popover/doc.md +144 -0
  108. package/metaData/components/popover/example/index.tsx +23 -0
  109. package/metaData/components/popover/example/menu.tsx +145 -0
  110. package/metaData/components/popover/example/popover-inner.tsx +147 -0
  111. package/metaData/components/popover/example/popover.tsx +268 -0
  112. package/metaData/components/popup/doc.md +101 -0
  113. package/metaData/components/popup/example/index.tsx +125 -0
  114. package/metaData/components/popup/example/methods.tsx +6 -0
  115. package/metaData/components/popup-swiper/doc.md +108 -0
  116. package/metaData/components/popup-swiper/example/index.tsx +332 -0
  117. package/metaData/components/popup-swiper/example/methods.tsx +6 -0
  118. package/metaData/components/portal/doc.md +14 -0
  119. package/metaData/components/portal/example/index.tsx +35 -0
  120. package/metaData/components/progress/doc.md +42 -0
  121. package/metaData/components/progress/example/index.tsx +256 -0
  122. package/metaData/components/pull-refresh/doc.md +37 -0
  123. package/metaData/components/pull-refresh/example/android-pull-refresh.tsx +260 -0
  124. package/metaData/components/pull-refresh/example/index.tsx +44 -0
  125. package/metaData/components/pull-refresh/example/ios-pull-refresh.tsx +216 -0
  126. package/metaData/components/radio/doc.md +89 -0
  127. package/metaData/components/radio/example/group.tsx +92 -0
  128. package/metaData/components/radio/example/index.tsx +25 -0
  129. package/metaData/components/radio/example/radio.tsx +22 -0
  130. package/metaData/components/rate/doc.md +33 -0
  131. package/metaData/components/rate/example/index.tsx +281 -0
  132. package/metaData/components/search-bar/doc.md +97 -0
  133. package/metaData/components/search-bar/example/association.tsx +89 -0
  134. package/metaData/components/search-bar/example/cancel-button.tsx +34 -0
  135. package/metaData/components/search-bar/example/highlight.tsx +66 -0
  136. package/metaData/components/search-bar/example/index.tsx +251 -0
  137. package/metaData/components/show-monitor/doc.md +34 -0
  138. package/metaData/components/show-monitor/example/index.tsx +646 -0
  139. package/metaData/components/skeleton/doc.md +101 -0
  140. package/metaData/components/skeleton/example/elements.tsx +290 -0
  141. package/metaData/components/skeleton/example/index.tsx +96 -0
  142. package/metaData/components/skeleton/example/skeleton-context.tsx +7 -0
  143. package/metaData/components/slider/doc.md +42 -0
  144. package/metaData/components/slider/example/index.tsx +326 -0
  145. package/metaData/components/slider/example/marks.tsx +50 -0
  146. package/metaData/components/slider/example/popover.tsx +38 -0
  147. package/metaData/components/slider/example/thumb.tsx +48 -0
  148. package/metaData/components/slider/example/useSliderIcon.tsx +38 -0
  149. package/metaData/components/slider/example/useSliderInit.tsx +170 -0
  150. package/metaData/components/stepper/doc.md +46 -0
  151. package/metaData/components/stepper/example/index.tsx +166 -0
  152. package/metaData/components/stepper/example/useButtonClick.tsx +74 -0
  153. package/metaData/components/stepper/example/useInputEvent.tsx +65 -0
  154. package/metaData/components/stepper/example/useValue.tsx +43 -0
  155. package/metaData/components/steps/doc.md +57 -0
  156. package/metaData/components/steps/example/index.tsx +123 -0
  157. package/metaData/components/steps/example/step.tsx +126 -0
  158. package/metaData/components/sticky/doc.md +45 -0
  159. package/metaData/components/sticky/example/index.tsx +430 -0
  160. package/metaData/components/swipe-action/doc.md +44 -0
  161. package/metaData/components/swipe-action/example/index.tsx +338 -0
  162. package/metaData/components/swipe-action/example/item.tsx +40 -0
  163. package/metaData/components/swipe-load/doc.md +43 -0
  164. package/metaData/components/swipe-load/example/index.tsx +339 -0
  165. package/metaData/components/swipe-load/example/type.tsx +153 -0
  166. package/metaData/components/switch/doc.md +38 -0
  167. package/metaData/components/switch/example/index.tsx +237 -0
  168. package/metaData/components/tab-bar/doc.md +57 -0
  169. package/metaData/components/tab-bar/example/index.tsx +18 -0
  170. package/metaData/components/tab-bar/example/item.tsx +74 -0
  171. package/metaData/components/tab-bar/example/tab-bar.tsx +105 -0
  172. package/metaData/components/tabs/doc.md +187 -0
  173. package/metaData/components/tabs/example/index.tsx +514 -0
  174. package/metaData/components/tabs/example/tab-cell-underline.tsx +320 -0
  175. package/metaData/components/tabs/example/tab-cell.tsx +433 -0
  176. package/metaData/components/tabs/example/tab-pane.tsx +349 -0
  177. package/metaData/components/tag/doc.md +80 -0
  178. package/metaData/components/tag/example/index.tsx +23 -0
  179. package/metaData/components/tag/example/list.tsx +97 -0
  180. package/metaData/components/tag/example/tag.tsx +85 -0
  181. package/metaData/components/textarea/doc.md +67 -0
  182. package/metaData/components/textarea/example/index.tsx +258 -0
  183. package/metaData/components/toast/doc.md +90 -0
  184. package/metaData/components/toast/example/index.tsx +335 -0
  185. package/metaData/components/toast/example/methods.tsx +87 -0
  186. package/metaData/components/transition/doc.md +19 -0
  187. package/metaData/components/transition/example/index.tsx +113 -0
  188. package/metaData/components/uploader/doc.md +82 -0
  189. package/metaData/components/uploader/example/index.tsx +208 -0
  190. package/metaData/components-index.json +242 -0
  191. package/package.json +56 -0
@@ -0,0 +1,89 @@
1
+ ### 数据录入
2
+
3
+ # 选择器 Picker
4
+
5
+ 选择器组件,形式是弹起的浮层。
6
+
7
+ ======
8
+
9
+ > 属性/Props
10
+
11
+ |参数|描述|类型|默认值|
12
+ |----------|-------------|------|------|
13
+ |data|数据源,非级联时data数组的长度决定picker列数,级联时以cols决定 pick列数|PickerData\[\] \| PickerData\[\]\[\] \| ValueType\[\]\[\]|必填|
14
+ |cascade|是否联动|boolean|true|
15
+ |cols|列数(最大为5;cascade=true时才使用)|number|3|
16
+ |rows|行数(一列可选项的行数),必须是奇数,最小为3个|number|5|
17
+ |disabled|是否不可用|boolean|false|
18
+ |value|值, 格式是\[value1, value2, value3\], 对应数据源的相应级层value,如果不传默认选每一列的第一个值|ValueType\[\]|-|
19
+ |onHide|点击遮罩层或取消、确定按钮的隐藏回调|(scene?: string) =\> void|-|
20
+ |onChange|选中后的回调|(selectedValue: ValueType\[\]) =\> void|-|
21
+ |onPickerChange|每列数据选择变化后的回调函数|(value: ValueType\[\], index: number, data: PickerData\[\]) =\> void|-|
22
+ |itemStyle|每列样式|CSSProperties|-|
23
+ |visible|是否展示选择器|boolean|false|
24
+ |okText|弹窗确认已选值的文案|string|"确定"|
25
+ |dismissText|弹窗取消的文案|string|"取消"|
26
+ |onOk|点击选中时执行的回调|(value: ValueType\[\], data: PickerData\[\]) =\> void|-|
27
+ |onDismiss|点击取消时执行的回调|() =\> void|-|
28
+ |clickable|是否可通过点击操作选择内容|boolean|true|
29
+ |hideEmptyCols|是否隐藏无数据的空列,常用于级联选择|boolean|false|
30
+ |title|选择器标题|string|""|
31
+ |maskClosable|点击蒙层是否关闭菜单|boolean|false|
32
+ |touchToStop|是否通过长按停止滑动,传入数字 x 表示触摸超过 x 毫秒算长按,传 true 表示 x=100,长按事件与 click 事件互斥|number \| boolean|false|
33
+ |gestureOutOfControl|是否禁用滚动容器手势判断,禁用后交给业务方自己判断|boolean|true|
34
+ |renderLinkedContainer|将选择器的展现隐藏状态及选中值的展示与某个容器关联,传入后将同时渲染该容器和选择器组件,此时选择器组件的 visible 和 onHide 属性可不传,点击该容器会唤起选择器|(value: ValueType\[\], data: PickerData\[\]) =\> ReactNode|-|
35
+ |renderExtraHeader|自定义头部扩展区域|() =\> ReactNode|-|
36
+ |needBottomOffset|从底部滑出的菜单内容是否适配ipx底部|boolean|false|
37
+ |translateZ|\[即将废弃\] 开启translateZ强制提升|boolean|false|
38
+ |maskTransitionTimeout|菜单蒙层动画时长|number \| \{ appear?: number; enter?: number; exit?: number; \}|{ enter: 450, exit: 240 }|
39
+ |contentTransitionTimeout|菜单内容动画时长|number \| \{ appear?: number; enter?: number; exit?: number; \}|{ enter: 450, exit: 240 }|
40
+ |contentTransitionType|内容过渡动画类名|string|\`slide-from-${props.direction}\`|
41
+ |className|自定义类名|string|-|
42
+ |maskClass|自定义蒙层类名|string|-|
43
+ |maskStyle|自定义蒙层样式|CSSProperties|-|
44
+ |contentClass|自定义内容类名|string|-|
45
+ |contentStyle|自定义内容样式|CSSProperties|-|
46
+ |maskTransitionType|蒙层过渡动画类名|string|"fade"|
47
+ |contentTransitionVarType|内容过渡动画类名变量标识|string|-|
48
+ |animatingClosable|执行进场动画时点击蒙层是否可关闭菜单|boolean|false|
49
+ |mountOnEnter|是否在打开菜单时再加载内容|boolean|true|
50
+ |unmountOnExit|是否在退出时卸载内容|boolean|true|
51
+ |preventBodyScroll|弹窗打开时是否禁止body的滚动|boolean|true|
52
+ |initialBodyOverflow|页面初始 overflow 状态,即关闭弹窗时 overflow 应该还原的状态|string|第一个全屏组件(弹窗、toast等)打开时页面overflow值|
53
+ |onClose|关闭后回调(动画执行完毕)|(scene?: string) =\> void|-|
54
+ |onOpen|打开后回调(动画执行完毕)|() =\> void|-|
55
+ |onMaskClick|点击蒙层回调,maskClosable=false时也会触发|() =\> void|-|
56
+ |onTouchMove|弹窗的touchmove回调|(e: TouchEvent, prevented: boolean, direction: "x" \| "y") =\> void|-|
57
+ |onPreventTouchMove|非滚动区域或滚动到顶部及底部时的触摸事件回调|(e: TouchEvent, direction: "x" \| "y") =\> void|-|
58
+ |getContainer|获取挂载容器|() =\> HTMLElement|-|
59
+
60
+ > 引用/Refs
61
+
62
+ |参数|描述|类型|
63
+ |----------|-------------|------|
64
+ |dom|最外层元素 DOM|HTMLDivElement|
65
+ |getCellMovingStatus|每一列的滑动状态|() =\> PickerCellMovingStatus\[\]|
66
+ |updateLayout|手动更新元素布局|() =\> void|
67
+ |getAllColumnValues|获取所有列的值|() =\> ValueType\[\]|
68
+ |getColumnValue|获取第 n 列的值|(index: number) =\> ValueType|
69
+ |scrollToCurrentIndex|直接跳到当前最近一行(调用时将中断滚动)|() =\> void|
70
+
71
+ > PickerData
72
+
73
+ |参数|描述|类型|
74
+ |----------|-------------|------|
75
+ |value|每一列展示的每项文案对应的值|ValueType|
76
+ |label|每一列展示的文案|ReactNode|
77
+ |children|级联状态下,该列对应的下一列数据|PickerData\[\]|
78
+
79
+ > ValueType
80
+
81
+ ```
82
+ string | number
83
+ ```
84
+
85
+ > PickerCellMovingStatus
86
+
87
+ ```
88
+ "normal" | "moving" | "scrolling"
89
+ ```
@@ -0,0 +1,217 @@
1
+ import React, { useEffect, useRef, forwardRef, Ref, useImperativeHandle, useState } from 'react';
2
+ import { cls, componentWrapper, nextTick } from '@arco-design/mobile-utils';
3
+ import { ContextLayout } from '../context-provider';
4
+ import Popup from '../popup';
5
+ import PickerView, { PickerViewRef, ValueType, PickerCellMovingStatus } from '../picker-view';
6
+ import { PickerProps } from './type';
7
+ import { useLatestRef, useListenResize } from '../_helpers';
8
+
9
+ export * from './type';
10
+ export { MultiPicker, PickerCell, Cascader } from '../picker-view';
11
+
12
+ export interface PickerRef {
13
+ /**
14
+ * 最外层元素 DOM
15
+ * @en The outermost element DOM
16
+ */
17
+ dom: HTMLDivElement | null;
18
+ /**
19
+ * 每一列的滑动状态
20
+ * @en Sliding state of each column
21
+ */
22
+ getCellMovingStatus: () => PickerCellMovingStatus[];
23
+ /**
24
+ * 手动更新元素布局
25
+ * @en Manually update the element layout
26
+ */
27
+ updateLayout: () => void;
28
+ /**
29
+ * 获取所有列的值
30
+ * @en Get all column values
31
+ */
32
+ getAllColumnValues: () => ValueType[];
33
+ /**
34
+ * 获取第 n 列的值
35
+ * @en Get the value of the nth column
36
+ */
37
+ getColumnValue: (index: number) => ValueType;
38
+ /**
39
+ * 直接跳到当前最近一行(调用时将中断滚动)
40
+ * @en Jump directly to the current most recent line (will break scrolling when called)
41
+ */
42
+ scrollToCurrentIndex: () => void;
43
+ }
44
+
45
+ const Picker = forwardRef((props: PickerProps, ref: Ref<PickerRef>) => {
46
+ const {
47
+ className,
48
+ itemStyle,
49
+ cascade = true,
50
+ cols = 3,
51
+ rows = 5,
52
+ data,
53
+ okText,
54
+ dismissText,
55
+ disabled = false,
56
+ clickable = true,
57
+ hideEmptyCols = false,
58
+ title = '',
59
+ visible: userSetVisible,
60
+ value,
61
+ needBottomOffset = false,
62
+ onDismiss,
63
+ onOk,
64
+ onChange,
65
+ maskClosable = false,
66
+ onHide,
67
+ onPickerChange,
68
+ touchToStop,
69
+ gestureOutOfControl = true,
70
+ renderLinkedContainer,
71
+ renderExtraHeader,
72
+ ...otherProps
73
+ } = props;
74
+
75
+ const scrollValueRef = useLatestRef(value);
76
+ const domRef = useRef<HTMLDivElement | null>(null);
77
+ const pickerViewRef = useRef<PickerViewRef>(null);
78
+ const [linkVisible, setLinkVisible] = useState(false);
79
+ const [linkArgs, setLinkArgs] = useState(() => getCurrentValueData());
80
+ // 来自linkedContainer的visible变化,优先级高于受控值
81
+ // @en Visible changes from linkedContainer which have priority over controlled values
82
+ const visible = linkVisible || userSetVisible || false;
83
+ useImperativeHandle(ref, () => ({
84
+ dom: domRef.current,
85
+ getCellMovingStatus: () => pickerViewRef.current?.getCellMovingStatus() || [],
86
+ getAllColumnValues: () => pickerViewRef.current?.getAllColumnValues() || [],
87
+ getColumnValue: index => pickerViewRef.current?.getColumnValue(index) || '',
88
+ updateLayout: () => pickerViewRef.current?.updateLayout(),
89
+ scrollToCurrentIndex: () => pickerViewRef.current?.scrollToCurrentIndex(),
90
+ }));
91
+
92
+ useEffect(() => {
93
+ nextTick(() => {
94
+ setLinkArgs(getCurrentValueData());
95
+ });
96
+ }, [value]);
97
+
98
+ function hidePicker(scene?: string | undefined) {
99
+ setLinkVisible(false);
100
+ onHide?.(scene);
101
+ }
102
+
103
+ function handleDismiss() {
104
+ if (onDismiss) {
105
+ onDismiss();
106
+ }
107
+ hidePicker('dismiss');
108
+ }
109
+
110
+ function getCurrentValueData() {
111
+ const val = pickerViewRef.current?.getAllColumnValues() || scrollValueRef.current || [];
112
+ const selectedData = pickerViewRef.current?.getAllColumnData() || [];
113
+ return {
114
+ value: val,
115
+ data: selectedData,
116
+ };
117
+ }
118
+
119
+ function handleConfirm() {
120
+ pickerViewRef.current?.scrollToCurrentIndex();
121
+ nextTick(() => {
122
+ const { value: val, data: selectedData } = getCurrentValueData();
123
+ setLinkArgs({ value: val, data: selectedData });
124
+ if (onOk) {
125
+ onOk(val, selectedData);
126
+ }
127
+ if (onChange) {
128
+ onChange(val);
129
+ }
130
+ hidePicker('confirm');
131
+ });
132
+ }
133
+
134
+ useListenResize(updateLayoutByVisible, [visible]);
135
+
136
+ // 每次visible从false变为true时需要重新设置scrollValue的值为当前value的值(初始值)
137
+ function updateLayoutByVisible() {
138
+ if (visible && pickerViewRef.current) {
139
+ pickerViewRef.current.updateLayout();
140
+ }
141
+ }
142
+
143
+ useEffect(() => {
144
+ updateLayoutByVisible();
145
+ }, [visible]);
146
+
147
+ return (
148
+ <ContextLayout>
149
+ {({ prefixCls, locale }) => (
150
+ <>
151
+ {renderLinkedContainer ? (
152
+ <div
153
+ className={`${prefixCls}-picker-linked-container`}
154
+ onClick={() => setLinkVisible(true)}
155
+ >
156
+ {renderLinkedContainer(linkArgs.value, linkArgs.data)}
157
+ </div>
158
+ ) : null}
159
+ <Popup
160
+ visible={visible}
161
+ className={cls(className, `${prefixCls}-picker all-border-box`)}
162
+ close={() => hidePicker('mask')}
163
+ direction="bottom"
164
+ maskClosable={maskClosable}
165
+ needBottomOffset={needBottomOffset}
166
+ gestureOutOfControl={gestureOutOfControl}
167
+ {...otherProps}
168
+ >
169
+ <div className={`${prefixCls}-picker-wrap`} ref={domRef}>
170
+ <div className={`${prefixCls}-picker-header`}>
171
+ <div
172
+ className={`${prefixCls}-picker-header-btn left`}
173
+ onClick={handleDismiss}
174
+ >
175
+ {dismissText || locale?.Picker.cancelText}
176
+ </div>
177
+ <div className={`${prefixCls}-picker-header-title`}>{title}</div>
178
+ <div
179
+ className={`${prefixCls}-picker-header-btn right`}
180
+ onClick={handleConfirm}
181
+ >
182
+ {okText || locale?.Picker.okText}
183
+ </div>
184
+ </div>
185
+ {renderExtraHeader && renderExtraHeader()}
186
+ <PickerView
187
+ ref={pickerViewRef}
188
+ data={data}
189
+ cascade={cascade}
190
+ cols={cols}
191
+ rows={rows}
192
+ disabled={disabled}
193
+ value={value}
194
+ onPickerChange={onPickerChange}
195
+ itemStyle={itemStyle}
196
+ clickable={clickable}
197
+ hideEmptyCols={hideEmptyCols}
198
+ touchToStop={touchToStop}
199
+ />
200
+ </div>
201
+ </Popup>
202
+ </>
203
+ )}
204
+ </ContextLayout>
205
+ );
206
+ });
207
+
208
+ /**
209
+ * 选择器组件,形式是弹起的浮层。
210
+ * @en The selector component, in the form of a popup layer.
211
+ * @type 数据录入
212
+ * @type_en Data Entry
213
+ * @name 选择器
214
+ * @name_en Picker
215
+ * @displayName Picker
216
+ */
217
+ export default componentWrapper(Picker, 'Picker');
@@ -0,0 +1,57 @@
1
+ ### 数据录入
2
+
3
+ # 选择器视图 PickerView
4
+
5
+ 选择器视图组件,不含弹窗,方便使用方灵活定制选择器。
6
+
7
+ ======
8
+
9
+ > 属性/Props
10
+
11
+ |参数|描述|类型|默认值|
12
+ |----------|-------------|------|------|
13
+ |data|数据源,非级联时data数组的长度决定picker列数,级联时以cols决定 pick列数|PickerData\[\] \| PickerData\[\]\[\] \| ValueType\[\]\[\]|必填|
14
+ |cascade|是否联动|boolean|true|
15
+ |cols|列数(最大为5;cascade=true时才使用)|number|3|
16
+ |rows|行数(一列可选项的行数),必须是奇数,最小为3个|number|5|
17
+ |disabled|是否不可用|boolean|false|
18
+ |value|值, 格式是\[value1, value2, value3\], 对应数据源的相应级层value|ValueType\[\]|-|
19
+ |onPickerChange|每列数据选择变化后的回调函数|(value: ValueType\[\], index: number, data: PickerData\[\]) =\> void|-|
20
+ |itemStyle|每列样式|CSSProperties|-|
21
+ |className|自定义类名|string|-|
22
+ |clickable|是否可通过点击操作选择内容|boolean|true|
23
+ |hideEmptyCols|是否隐藏无数据的空列,常用于级联选择|boolean|false|
24
+ |touchToStop|是否通过长按停止滑动,传入数字 x 表示触摸超过 x 毫秒算长按,传 true 表示 x=100,长按事件与 click 事件互斥|number \| boolean|false|
25
+
26
+ > 引用/Refs
27
+
28
+ |参数|描述|类型|
29
+ |----------|-------------|------|
30
+ |dom|最外层元素 DOM|HTMLDivElement|
31
+ |getCellMovingStatus|每一列的滑动状态|() =\> PickerCellMovingStatus\[\]|
32
+ |getAllColumnValues|获取所有列的值|() =\> ValueType\[\]|
33
+ |getColumnValue|获取第 n 列的值|(index: number) =\> ValueType|
34
+ |updateLayout|手动更新元素布局|() =\> void|
35
+ |resetValue|重置选择器的值为传入的\`value\`值|() =\> void|
36
+ |scrollToCurrentIndex|直接跳到当前最近一行(调用时将中断滚动)|() =\> void|
37
+ |getAllColumnData|获取所有列的 data|() =\> PickerData\[\]|
38
+
39
+ > PickerData
40
+
41
+ |参数|描述|类型|
42
+ |----------|-------------|------|
43
+ |value|每一列展示的每项文案对应的值|ValueType|
44
+ |label|每一列展示的文案|ReactNode|
45
+ |children|级联状态下,该列对应的下一列数据|PickerData\[\]|
46
+
47
+ > ValueType
48
+
49
+ ```
50
+ string | number
51
+ ```
52
+
53
+ > PickerCellMovingStatus
54
+
55
+ ```
56
+ "normal" | "moving" | "scrolling"
57
+ ```
@@ -0,0 +1,141 @@
1
+ import React, { forwardRef, Ref, useImperativeHandle, useMemo, useRef } from 'react';
2
+ import { arrayTreeFilter } from '@arco-design/mobile-utils';
3
+ import { PickerData, ValueType, PickerCellMovingStatus } from '../type';
4
+ import MultiPicker from './multi-picker';
5
+ import PickerCell, { PickerCellRef } from './picker-cell';
6
+
7
+ export interface CascaderProps {
8
+ prefixCls: string;
9
+ cols: number;
10
+ itemStyle?: React.CSSProperties;
11
+ data: PickerData[];
12
+ clickable: boolean;
13
+ disabled: boolean;
14
+ itemHeight: number;
15
+ wrapperHeight: number;
16
+ selectedValue?: ValueType[];
17
+ rows?: number;
18
+ hideEmptyCols?: boolean;
19
+ onValueChange?: (value: ValueType[], index: number, data: PickerData[]) => void;
20
+ touchToStop?: boolean | number;
21
+ }
22
+ export interface CascaderRef {
23
+ getCellMovingStatus: () => PickerCellMovingStatus[];
24
+ scrollToCurrentIndex: () => void;
25
+ getAllCellsValue: () => ValueType[];
26
+ getAllCellsData: () => PickerData[];
27
+ }
28
+
29
+ const Cascader = forwardRef((props: CascaderProps, ref: Ref<CascaderRef>) => {
30
+ const {
31
+ prefixCls,
32
+ itemStyle,
33
+ cols,
34
+ data,
35
+ disabled,
36
+ clickable,
37
+ itemHeight,
38
+ wrapperHeight,
39
+ rows,
40
+ hideEmptyCols,
41
+ onValueChange,
42
+ selectedValue = [],
43
+ touchToStop,
44
+ } = props;
45
+ const pickerCellsRef = useRef<PickerCellRef[]>([]);
46
+
47
+ useImperativeHandle(ref, () => ({
48
+ getCellMovingStatus,
49
+ scrollToCurrentIndex,
50
+ getAllCellsValue,
51
+ getAllCellsData,
52
+ }));
53
+
54
+ function getCellMovingStatus() {
55
+ return pickerCellsRef.current.map(cell => cell.movingStatus);
56
+ }
57
+
58
+ function scrollToCurrentIndex() {
59
+ pickerCellsRef.current.forEach(cell => cell.scrollToCurrentIndex());
60
+ }
61
+
62
+ function getAllCellsValue() {
63
+ return pickerCellsRef.current.map(cell => cell.getCurrentCellValue());
64
+ }
65
+
66
+ function getAllCellsData() {
67
+ return pickerCellsRef.current.map(cell => cell.getCurrentCellData());
68
+ }
69
+
70
+ function _onValueChange(value: ValueType[], index: number, newData: PickerData[]) {
71
+ const children: PickerData[] = arrayTreeFilter(
72
+ data,
73
+ (item: PickerData, level: number) => level <= index && item.value === value[level],
74
+ );
75
+ let child = children[index];
76
+ let i;
77
+
78
+ for (i = index + 1; i < cols && child && child.children; i++) {
79
+ child = child.children[0];
80
+ value[i] = child.value;
81
+ newData[i] = child;
82
+ }
83
+ value.length = i;
84
+ newData.length = i;
85
+ onValueChange?.(value, index, newData);
86
+ }
87
+
88
+ function _formatData() {
89
+ const childrenTree = arrayTreeFilter(
90
+ data,
91
+ (item: PickerData, level: number) => item.value === selectedValue?.[level],
92
+ { fallbackChildIndex: 0 },
93
+ ).map(item => item.children);
94
+
95
+ const needPad = cols - childrenTree.length;
96
+ if (needPad > 0) {
97
+ for (let i = 0; i < needPad; i++) {
98
+ childrenTree.push([]);
99
+ }
100
+ }
101
+ childrenTree.length = cols - 1;
102
+ childrenTree.unshift(data);
103
+
104
+ return childrenTree as PickerData[][];
105
+ }
106
+
107
+ const formatData = useMemo<PickerData[][]>(() => _formatData(), [data, selectedValue]);
108
+
109
+ return (
110
+ <MultiPicker
111
+ prefixCls={`${prefixCls}-picker`}
112
+ data={formatData}
113
+ selectedValue={selectedValue}
114
+ itemHeight={itemHeight}
115
+ onValueChange={_onValueChange}
116
+ >
117
+ {formatData.map((item, index) => (
118
+ <PickerCell
119
+ key={`${index}_picker_cell_cascader`}
120
+ data={item || []}
121
+ style={itemStyle}
122
+ prefixCls={`${prefixCls}-picker`}
123
+ clickable={clickable}
124
+ itemHeight={itemHeight}
125
+ wrapperHeight={wrapperHeight}
126
+ disabled={disabled}
127
+ rows={rows}
128
+ hideEmptyCols={hideEmptyCols}
129
+ ref={cellRef => {
130
+ if (cellRef) {
131
+ pickerCellsRef.current[index] = cellRef;
132
+ }
133
+ }}
134
+ touchToStop={touchToStop}
135
+ />
136
+ ))}
137
+ </MultiPicker>
138
+ );
139
+ });
140
+
141
+ export default Cascader;