@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,216 @@
1
+ import React, {
2
+ useState,
3
+ useRef,
4
+ forwardRef,
5
+ Ref,
6
+ useCallback,
7
+ useContext,
8
+ useEffect,
9
+ useMemo,
10
+ useImperativeHandle,
11
+ } from 'react';
12
+ import type { CSSProperties } from 'react';
13
+ import { cls, defaultLocale } from '@arco-design/mobile-utils';
14
+ import Loading from '../loading';
15
+ import { GlobalContext } from '../context-provider';
16
+ import { PullRefreshRef, PullRefreshStatus, PullRefreshBasicProps } from './model';
17
+ import { useCommonState, useAddScrollEvents, useCheckAsStart } from './hooks';
18
+ import { useListenResize } from '../_helpers';
19
+
20
+ export const PullRefresh = forwardRef((props: PullRefreshBasicProps, ref: Ref<PullRefreshRef>) => {
21
+ const { prefixCls, locale = defaultLocale } = useContext(GlobalContext);
22
+ const animationRef = useRef<number>(0);
23
+
24
+ const {
25
+ className,
26
+ style,
27
+ children,
28
+ loadingText = (
29
+ <div className={cls(`${prefixCls}-pull-refresh-label-text`)}>
30
+ <Loading type="circle" radius={4} />
31
+ <span>{locale.PullRefresh.loadingText}</span>
32
+ </div>
33
+ ),
34
+ pullingText = (
35
+ <div className={cls(`${prefixCls}-pull-refresh-label-text`)}>
36
+ <span>{locale.PullRefresh.pullingText}</span>
37
+ </div>
38
+ ),
39
+ finishText = (
40
+ <div className={cls(`${prefixCls}-pull-refresh-label-text`)}>
41
+ <span>{locale.PullRefresh.finishText}</span>
42
+ </div>
43
+ ),
44
+ initialText,
45
+ finishDelay = 300,
46
+ disabled = false,
47
+ loosingMinHeight,
48
+ useHideAsNestedScroll = true,
49
+ allowPullWhenNotTop = false,
50
+ onRefresh,
51
+ } = props;
52
+
53
+ const lastScrollTop = useRef(0);
54
+ const statusRef = useRef(PullRefreshStatus.Static);
55
+ const [labelStyle, setLabelStyle] = useState<CSSProperties>({});
56
+ const [contentHeight, setContentHeight] = useState(0);
57
+
58
+ const {
59
+ loadingRef,
60
+ status,
61
+ setStatus,
62
+ labelRef,
63
+ domRef,
64
+ touching,
65
+ setTouching,
66
+ loosingHeight,
67
+ tipsHeight,
68
+ handleRefresh,
69
+ } = useCommonState({ loosingMinHeight, onRefresh });
70
+ const { ifShouldHandle } = useCheckAsStart({ domRef, allowPullWhenNotTop });
71
+
72
+ const currentLabelStyle = useMemo(() => {
73
+ return (useHideAsNestedScroll &&
74
+ !touching &&
75
+ status === PullRefreshStatus.Pulling &&
76
+ (domRef?.current?.scrollTop ?? 0) > 0) ||
77
+ disabled
78
+ ? { ...labelStyle, opacity: 0 }
79
+ : labelStyle;
80
+ }, [labelStyle, useHideAsNestedScroll, touching, disabled]);
81
+
82
+ const pullTextConfig = {
83
+ [PullRefreshStatus.Static]: initialText === void 0 ? pullingText : initialText,
84
+ [PullRefreshStatus.Pulling]: pullingText,
85
+ [PullRefreshStatus.Loading]: loadingText,
86
+ [PullRefreshStatus.Finish]: finishText,
87
+ };
88
+
89
+ const reset = useCallback(
90
+ (animationKey: number, callback = () => {}) => {
91
+ if (animationRef.current === animationKey) {
92
+ setLabelStyle({
93
+ position: 'relative',
94
+ height: '0px',
95
+ top: 0,
96
+ transition: 'height .45s',
97
+ });
98
+ }
99
+ setTimeout(() => {
100
+ if (animationRef.current === animationKey) {
101
+ if (domRef.current) domRef.current.style.overflow = 'auto';
102
+ setStatus(PullRefreshStatus.Pulling);
103
+ setLabelStyle({
104
+ position: 'absolute',
105
+ top: `-${tipsHeight}px`,
106
+ height: `${tipsHeight}px`,
107
+ transition: 'height 0s',
108
+ });
109
+ statusRef.current = PullRefreshStatus.Static;
110
+ loadingRef.current = false;
111
+ callback();
112
+ }
113
+ }, 450);
114
+ },
115
+ [tipsHeight],
116
+ );
117
+
118
+ const handleTouchStart = useCallback(() => {
119
+ if (disabled || loadingRef.current || !domRef.current || !ifShouldHandle()) return;
120
+ setTouching(true);
121
+
122
+ if (domRef.current && domRef.current.scrollTop === 0) {
123
+ domRef.current.scrollTop = 1;
124
+ }
125
+ }, [disabled, ifShouldHandle]);
126
+
127
+ const refresh = () =>
128
+ new Promise<void>(resolve => {
129
+ if (domRef.current) {
130
+ domRef.current.style.overflow = 'hidden';
131
+ const animationKey = new Date().getTime();
132
+ setStatus(PullRefreshStatus.Loading);
133
+ setLabelStyle({
134
+ position: 'relative',
135
+ top: 0,
136
+ height: `${tipsHeight}px`,
137
+ transition: 'height 0s',
138
+ });
139
+ animationRef.current = animationKey;
140
+ handleRefresh().then(() => {
141
+ if (pullTextConfig[PullRefreshStatus.Finish]) {
142
+ setStatus(PullRefreshStatus.Finish);
143
+ setTimeout(() => {
144
+ reset(animationKey, resolve);
145
+ }, finishDelay);
146
+ } else {
147
+ reset(animationKey, resolve);
148
+ }
149
+ });
150
+ }
151
+ });
152
+
153
+ const handleTouchEnd = useCallback(() => {
154
+ if (disabled || loadingRef.current || !domRef.current) return;
155
+ setTouching(false);
156
+ if (statusRef.current === PullRefreshStatus.Loosing) refresh();
157
+ }, [disabled, tipsHeight]);
158
+
159
+ const handleTouchMove = useCallback(() => {
160
+ if (disabled || loadingRef.current || !domRef.current) return;
161
+ setTimeout(() => {
162
+ const isLoosing = -(domRef.current?.scrollTop ?? 0) > loosingHeight;
163
+ if (isLoosing) lastScrollTop.current = domRef.current?.scrollTop ?? 0;
164
+ statusRef.current = isLoosing ? PullRefreshStatus.Loosing : PullRefreshStatus.Pulling;
165
+ });
166
+ }, [disabled, loosingHeight]);
167
+
168
+ const updateIOSHeight = useCallback(() => {
169
+ if (domRef.current) {
170
+ const { height } = domRef.current.getBoundingClientRect();
171
+ setContentHeight(height);
172
+ }
173
+ }, []);
174
+
175
+ useListenResize(updateIOSHeight);
176
+
177
+ useImperativeHandle(ref, () => ({
178
+ dom: domRef.current,
179
+ refresh,
180
+ updateIOSHeight,
181
+ }));
182
+
183
+ useEffect(() => {
184
+ updateIOSHeight();
185
+ reset(animationRef.current);
186
+ }, []);
187
+
188
+ useAddScrollEvents({ domRef, handleTouchStart, handleTouchMove, handleTouchEnd });
189
+
190
+ return (
191
+ <div
192
+ className={cls(`${prefixCls}-pull-refresh all-border-box is-ios`, className, {
193
+ 'is-disabled': disabled || (!touching && useHideAsNestedScroll),
194
+ })}
195
+ ref={domRef}
196
+ style={contentHeight > 0 ? { height: contentHeight, ...(style || {}) } : style}
197
+ >
198
+ <div className={cls(`${prefixCls}-pull-refresh-content-wrapper`)}>
199
+ <div
200
+ className={cls(`${prefixCls}-pull-refresh-label-wrapper`)}
201
+ style={currentLabelStyle}
202
+ >
203
+ <div className={cls(`${prefixCls}-pull-refresh-label`)} ref={labelRef}>
204
+ {pullTextConfig[status]}
205
+ </div>
206
+ </div>
207
+ <div
208
+ className={cls(`${prefixCls}-pull-refresh-content`)}
209
+ style={contentHeight > 0 ? { minHeight: `${contentHeight + 1}px` } : {}}
210
+ >
211
+ {children}
212
+ </div>
213
+ </div>
214
+ </div>
215
+ );
216
+ });
@@ -0,0 +1,89 @@
1
+ ### 数据录入
2
+
3
+ # 单选框 Radio
4
+
5
+ 单选框,可用状态下点击切换选择,支持禁用,支持单选项组。
6
+
7
+ ======
8
+
9
+ > 属性/Props
10
+
11
+ |参数|描述|类型|默认值|
12
+ |----------|-------------|------|------|
13
+ |label|选项的文字说明,传入children时此属性无效|string|""|
14
+ |value|Checkbox的值|ValueType|必填|
15
+ |defaultCheck|默认选中状态|boolean|false|
16
+ |checked|是否选中,传值即为受控模式|boolean|-|
17
+ |onChange|复选框选中状态回调函数|(checked: boolean, value: ValueType, e: MouseEvent\<Element, MouseEvent\>) =\> void|() => {}|
18
+ |shape|图标的形状|"circle" \| "square"|'circle'|
19
+ |layout|排版样式(内联\|块级\|图标靠右两端对齐)|"inline" \| "block" \| "justify"|'inline'|
20
+ |disabled|是否禁用|boolean|false|
21
+ |icons|自定义图标合集,传 null 表示无图标|IconType|Default icon|
22
+ |isRadio|是否为Radio组件,不推荐使用,仅用于支持Radio组件|boolean|false|
23
+ |children|自定义组件内容|ReactNode|null|
24
+ |className|自定义类名|string|""|
25
+ |style|自定义样式|CSSProperties|{}|
26
+
27
+ > 引用/Refs
28
+
29
+ |参数|描述|类型|
30
+ |----------|-------------|------|
31
+ |dom|组件外层dom元素|HTMLDivElement|
32
+
33
+ > Radio.Group
34
+
35
+ 单选项组
36
+
37
+ |参数|描述|类型|默认值|
38
+ |----------|-------------|------|------|
39
+ |options|可选项, 传入children后此值无效|(RadioProps\<ValueType\> & RefAttributes\<RadioRef\>)\[\]|-|
40
+ |value|受控模式,选中的选项,传null表示取消选中|ValueType|-|
41
+ |defaultValue|默认选中项|ValueType|-|
42
+ |onChange|单选项组选中状态变化回调函数|(value: ValueType) =\> void|-|
43
+ |shape|图标的形状|"circle" \| "square"|'circle'|
44
+ |layout|排版样式(内联\|块级\|图标靠右两端对齐)|"inline" \| "block" \| "justify"|'inline'|
45
+ |disabled|是否禁用|boolean|false|
46
+ |icons|自定义图标合集,传 null 表示无图标|IconType|Default icon|
47
+ |isRadio|是否为Radio组件,不推荐使用,仅用于支持Radio组件|boolean|false|
48
+ |children|自定义组件内容|ReactNode|null|
49
+ |className|自定义类名|string|""|
50
+ |style|自定义样式|CSSProperties|{}|
51
+
52
+ > ValueType
53
+
54
+ ```
55
+ string | number
56
+ ```
57
+
58
+ > IconType
59
+
60
+ |参数|描述|类型|
61
+ |----------|-------------|------|
62
+ |normal|未选中|ReactNode|
63
+ |active|选中态|ReactNode|
64
+ |disabled|禁用态|ReactNode|
65
+ |activeDisabled|禁用选中态|ReactNode|
66
+
67
+ > RadioProps
68
+
69
+ |参数|描述|类型|默认值|
70
+ |----------|-------------|------|------|
71
+ |label|选项的文字说明,传入children时此属性无效|string|""|
72
+ |value|Checkbox的值|ValueType|必填|
73
+ |defaultCheck|默认选中状态|boolean|false|
74
+ |checked|是否选中,传值即为受控模式|boolean|-|
75
+ |onChange|复选框选中状态回调函数|(checked: boolean, value: ValueType, e: MouseEvent\<Element, MouseEvent\>) =\> void|() => {}|
76
+ |shape|图标的形状|"circle" \| "square"|'circle'|
77
+ |layout|排版样式(内联\|块级\|图标靠右两端对齐)|"inline" \| "block" \| "justify"|'inline'|
78
+ |disabled|是否禁用|boolean|false|
79
+ |icons|自定义图标合集,传 null 表示无图标|IconType|Default icon|
80
+ |isRadio|是否为Radio组件,不推荐使用,仅用于支持Radio组件|boolean|false|
81
+ |children|自定义组件内容|ReactNode|null|
82
+ |className|自定义类名|string|""|
83
+ |style|自定义样式|CSSProperties|{}|
84
+
85
+ > RadioGroupRef
86
+
87
+ |参数|描述|类型|
88
+ |----------|-------------|------|
89
+ |dom|组件外层dom元素|HTMLDivElement|
@@ -0,0 +1,92 @@
1
+ import React, { useState, useEffect, forwardRef, Ref, useImperativeHandle, useRef } from 'react';
2
+ import { cls } from '@arco-design/mobile-utils';
3
+ import { ContextLayout } from '../context-provider';
4
+ import { RadioGroupProps, RadioGroupRef, RadioProps, RadioRef, ValueType } from './type';
5
+ import { GroupContextParams } from '../checkbox';
6
+
7
+ export const RadioGroupContext = React.createContext<GroupContextParams<ValueType>>({
8
+ isGroup: false,
9
+ shape: 'circle',
10
+ layout: 'inline',
11
+ disabled: false,
12
+ value: [],
13
+ onChange: () => {},
14
+ });
15
+
16
+ export function componentGenerator<
17
+ T extends ValueType = ValueType,
18
+ P extends RadioProps<T> = RadioProps<T>,
19
+ R extends RadioRef = RadioRef,
20
+ >(Comp: React.ForwardRefExoticComponent<P & React.RefAttributes<R>>) {
21
+ return forwardRef((props: RadioGroupProps<T, P>, ref: Ref<RadioGroupRef | null>) => {
22
+ const {
23
+ style = {},
24
+ className = '',
25
+ defaultValue,
26
+ disabled = false,
27
+ shape = 'circle',
28
+ options,
29
+ icons,
30
+ onChange = () => {},
31
+ value,
32
+ children = null,
33
+ layout = 'inline',
34
+ } = props;
35
+
36
+ const [groupValue, setGroupValue] = useState<T | null | undefined>(value || defaultValue);
37
+ const domRef = useRef<HTMLDivElement | null>(null);
38
+ useImperativeHandle(ref, () => ({
39
+ dom: domRef.current,
40
+ }));
41
+
42
+ useEffect(() => {
43
+ value !== void 0 && setGroupValue(value);
44
+ }, [value]);
45
+
46
+ /**
47
+ * 切换Radio状态回调
48
+ * @en Callback when toggling radio state
49
+ */
50
+ const handleChange = (checked: boolean, newValue: T) => {
51
+ if (!checked) return;
52
+ onChange(newValue);
53
+ if (value === void 0) {
54
+ setGroupValue(newValue);
55
+ }
56
+ };
57
+
58
+ return (
59
+ <ContextLayout>
60
+ {({ prefixCls }) => (
61
+ <div
62
+ ref={domRef}
63
+ style={style}
64
+ className={cls(className, `${prefixCls}-radio-group`)}
65
+ >
66
+ <RadioGroupContext.Provider
67
+ value={{
68
+ isGroup: true,
69
+ shape,
70
+ layout,
71
+ disabled,
72
+ icons,
73
+ value:
74
+ groupValue === void 0 || groupValue === null
75
+ ? []
76
+ : [groupValue],
77
+ onChange: handleChange,
78
+ }}
79
+ >
80
+ {children}
81
+ {!children &&
82
+ options &&
83
+ options.map(option => (
84
+ <Comp key={option.value} {...option} isRadio />
85
+ ))}
86
+ </RadioGroupContext.Provider>
87
+ </div>
88
+ )}
89
+ </ContextLayout>
90
+ );
91
+ });
92
+ }
@@ -0,0 +1,25 @@
1
+ import { componentWrapper } from '@arco-design/mobile-utils';
2
+ import { componentGenerator } from './group';
3
+ import { Radio } from './radio';
4
+
5
+ export * from './type';
6
+
7
+ /**
8
+ * 单选项组
9
+ * @en Radio group
10
+ * @displayName RadioGroup
11
+ */
12
+ const Group = componentWrapper(componentGenerator(Radio), 'RadioGroup');
13
+
14
+ /**
15
+ * 单选框,可用状态下点击切换选择,支持禁用,支持单选项组。
16
+ * @en Radio button, click to switch selection when available, supports disabled state and radio option group.
17
+ * @name 单选框
18
+ * @name_en Radio
19
+ * @type 数据录入
20
+ * @type_en Data Entry
21
+ * @displayName Radio
22
+ */
23
+ export default componentWrapper(Radio, 'Radio', {
24
+ Group,
25
+ });
@@ -0,0 +1,22 @@
1
+ import React, { forwardRef, Ref, useImperativeHandle, useRef } from 'react';
2
+ import Checkbox, { CheckboxProps, CheckboxRef } from '../checkbox';
3
+ import { RadioGroupContext } from './group';
4
+ import { RadioProps, RadioRef, ValueType } from './type';
5
+ import { useMergeProps } from '../checkbox/hooks';
6
+
7
+ export function componentGenerator<
8
+ T extends ValueType = ValueType,
9
+ P extends CheckboxProps<T> = CheckboxProps<T>,
10
+ R extends CheckboxRef = CheckboxRef,
11
+ >(Comp: React.ForwardRefExoticComponent<P & React.RefAttributes<R>>) {
12
+ return forwardRef((props: RadioProps<T>, ref: Ref<RadioRef | null>) => {
13
+ const mergedProps = useMergeProps<T, P>(props as P, RadioGroupContext);
14
+ const radioRef = useRef<R | null>(null);
15
+
16
+ useImperativeHandle(ref, () => radioRef.current!);
17
+
18
+ return <Comp ref={radioRef} {...mergedProps} isRadio />;
19
+ });
20
+ }
21
+
22
+ export const Radio = componentGenerator(Checkbox);
@@ -0,0 +1,33 @@
1
+ ### 数据录入
2
+
3
+ # 评分 Rate
4
+
5
+ 评分组件,支持受控模式
6
+
7
+ ======
8
+
9
+ > 属性/Props
10
+
11
+ |参数|描述|类型|默认值|
12
+ |----------|-------------|------|------|
13
+ |className|自定义类名|string|-|
14
+ |style|自定义样式|CSSProperties|-|
15
+ |defaultValue|默认评分|number|0|
16
+ |value|当前评分(受控)|number|-|
17
+ |count|图标数量|number|5|
18
+ |step|每个图标的分值|number|1|
19
+ |color|选中时颜色|string|-|
20
+ |normalColor|未选中时颜色|string|-|
21
+ |disabledColor|禁用时颜色|string|-|
22
+ |allowHalf|是否允许半选|boolean|false|
23
+ |disabled|是否为禁用状态|boolean|false|
24
+ |size|自定义图标大小|ReactText|-|
25
+ |offset|自定义图标间距(点击热区包含间距)|ReactText|-|
26
+ |icons|自定义图标|\{ normal: RateIconType; active: RateIconType; halfActive?: RateIconType; \}|-|
27
+ |onChange|当前分值变化触发的事件|(value: number) =\> void|(value) => void|
28
+
29
+ > 引用/Refs
30
+
31
+ |参数|描述|类型|
32
+ |----------|-------------|------|
33
+ |dom|最外层元素 DOM|HTMLDivElement|