@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,433 @@
1
+ import React, {
2
+ useRef,
3
+ forwardRef,
4
+ Ref,
5
+ useImperativeHandle,
6
+ useState,
7
+ useEffect,
8
+ CSSProperties,
9
+ useContext,
10
+ } from 'react';
11
+ import { cls, scrollWithAnimation, nextTick } from '@arco-design/mobile-utils';
12
+ import { TabData, TabCellProps, TabCellRef, TabCellUnderlineRef, OffsetRect } from './type';
13
+ import { useSystem, useUpdateEffect } from '../_helpers';
14
+ import TabCellUnderline from './tab-cell-underline';
15
+ import { GlobalContext } from '../context-provider';
16
+
17
+ const TabCell = forwardRef((props: TabCellProps, ref: Ref<TabCellRef>) => {
18
+ const {
19
+ tabs,
20
+ prefixCls,
21
+ activeIndex,
22
+ activeIndexRef,
23
+ tabDirection,
24
+ type,
25
+ onTabClick,
26
+ changeIndex,
27
+ tabBarPosition,
28
+ tabBarArrange,
29
+ tabBarScroll,
30
+ tabBarFixed,
31
+ renderUnderline,
32
+ duration,
33
+ transitionDuration,
34
+ useCaterpillar,
35
+ wrapWidth,
36
+ wrapHeight,
37
+ cellTrans,
38
+ distance,
39
+ jumpingDis,
40
+ tabBarExtra,
41
+ onTabBarOverflowChange,
42
+ tabBarGutter,
43
+ tabBarPadding,
44
+ underlineSize,
45
+ underlineThick,
46
+ underlineInnerStyle,
47
+ caterpillarMaxScale,
48
+ caterpillarProperty,
49
+ onTabBarScroll,
50
+ hideTabBarBeforeMounted,
51
+ overflowThreshold = 5,
52
+ tabBarScrollBezier,
53
+ tabBarScrollDuration,
54
+ tabBarScrollChance,
55
+ tabBarHasDivider,
56
+ showUnderline,
57
+ underlineAdaptive,
58
+ disabled,
59
+ renderTabBarItem,
60
+ renderTabBarInner,
61
+ tabBarStyle,
62
+ tabBarClass,
63
+ translateZ,
64
+ tabBarStopPropagation,
65
+ onUnderlineFirstShow,
66
+ } = props;
67
+ const prefix = `${prefixCls}-tab-cell`;
68
+ const { useRtl } = useContext(GlobalContext);
69
+ const domRef = useRef<HTMLDivElement | null>(null);
70
+ const underlineRef = useRef<TabCellUnderlineRef>(null);
71
+ const allCellRectRef = useRef<OffsetRect[]>([]);
72
+ const [showLine, setShowLine] = useState(false);
73
+ const [hasOverflow, setHasOverflow] = useState(false);
74
+ const [originArrange, setOriginArrange] = useState(() =>
75
+ tabs.length < overflowThreshold ? tabBarArrange : 'start',
76
+ );
77
+ const [forceUpdate, setForceUpdate] = useState<boolean>(false);
78
+ // 默认tab小于overflowThreshold个时不开启加载前隐藏,大于overflowThreshold个时开启
79
+ const [showTab, setShowTab] = useState(() =>
80
+ hideTabBarBeforeMounted === void 0
81
+ ? tabs.length < overflowThreshold || activeIndex === 0
82
+ : !hideTabBarBeforeMounted,
83
+ );
84
+ const isVertical = tabDirection === 'vertical';
85
+ const isLine = (type || '').indexOf('line') !== -1;
86
+ const isCard = type === 'card';
87
+ /**
88
+ * 非card类型才有间隙和两侧留白
89
+ * @en Non-card types have gaps and blank on both sides
90
+ */
91
+ const cellPadding = isCard ? void 0 : tabBarPadding;
92
+ const cellGutter = isCard ? void 0 : tabBarGutter;
93
+ const hasDivider = tabBarHasDivider === void 0 ? isLine : tabBarHasDivider;
94
+ const wrapSize = isVertical ? wrapWidth : wrapHeight;
95
+
96
+ const system = useSystem();
97
+
98
+ const updateScrollPosition = () => {
99
+ if (wrapSize && tabBarScrollChance !== 'none') {
100
+ setTimeout(
101
+ () => {
102
+ scrollToCenter();
103
+ },
104
+ tabBarScrollChance === 'after-jump'
105
+ ? Math.max(transitionDuration || 0, duration || 0)
106
+ : 0,
107
+ );
108
+ }
109
+ };
110
+
111
+ useEffect(() => {
112
+ nextTick(() => {
113
+ setCellOverflow();
114
+ // dom出来之后originArrange置空,交由tabBarArrange控制
115
+ // @en After the dom comes out, originArrange is left empty and controlled by tabBarArrange
116
+ setOriginArrange(void 0);
117
+ // dom出来了才知道布局,计算完成后展示出来防止跳动的情况
118
+ // @en The layout is determined only when the dom comes out. It is displayed to prevent the jumping after the calculation is completed
119
+ setShowTab(true);
120
+ setShowLine(true);
121
+ });
122
+ }, [domRef.current, wrapSize, tabs]);
123
+
124
+ useEffect(() => {
125
+ nextTick(() => {
126
+ underlineRef.current?.resetUnderlineStyle();
127
+ });
128
+ }, [
129
+ activeIndex,
130
+ tabs,
131
+ getCellPadding('left'),
132
+ getCellPadding('right'),
133
+ tabBarGutter,
134
+ tabDirection,
135
+ ]);
136
+
137
+ useEffect(() => {
138
+ updateScrollPosition();
139
+ }, [activeIndex, wrapSize]);
140
+
141
+ useEffect(() => {
142
+ // underline 首次展示时,通知父组件启用 cellTrans
143
+ // @en When underline is first shown, notify parent component to enable cellTrans
144
+ if (showLine && onUnderlineFirstShow) {
145
+ onUnderlineFirstShow();
146
+ }
147
+ }, [showLine]);
148
+
149
+ useUpdateEffect(() => {
150
+ setCellOverflow();
151
+ underlineRef.current?.resetUnderlineStyle();
152
+ updateScrollPosition();
153
+ }, [forceUpdate]);
154
+
155
+ useEffect(() => {
156
+ tabBarScrollChance !== 'none' && scrollToCenter(true);
157
+ // TabCell左右可滚动时,防止触发父级touchmove事件导致滚不动
158
+ // @en When the TabCell can be scrolled left and right, prevent the parent touchmove event from being triggered which result in inability to scroll
159
+ const stopFunc = (e: TouchEvent) => e.stopPropagation();
160
+ if (isVertical && hasOverflow && domRef.current && tabBarStopPropagation) {
161
+ domRef.current.addEventListener('touchstart', stopFunc);
162
+ domRef.current.addEventListener('touchmove', stopFunc);
163
+ }
164
+ return () => {
165
+ if (isVertical && hasOverflow && domRef.current && tabBarStopPropagation) {
166
+ domRef.current.removeEventListener('touchstart', stopFunc);
167
+ domRef.current.removeEventListener('touchmove', stopFunc);
168
+ }
169
+ };
170
+ }, [hasOverflow]);
171
+
172
+ function setCellOverflow() {
173
+ let overflow = false;
174
+ if (domRef.current) {
175
+ overflow = isVertical
176
+ ? domRef.current.scrollWidth > domRef.current.offsetWidth
177
+ : domRef.current.scrollHeight > domRef.current.offsetHeight;
178
+ }
179
+ if (overflow !== hasOverflow) {
180
+ onTabBarOverflowChange && onTabBarOverflowChange(overflow);
181
+ }
182
+ setHasOverflow(overflow);
183
+ }
184
+
185
+ function scrollToCenter(rightNow?: boolean) {
186
+ if (!wrapSize || !hasOverflow) {
187
+ return;
188
+ }
189
+ const currentTabLeft = getTabCenterLeft(activeIndexRef.current);
190
+ const newLeft = currentTabLeft - wrapSize / 2;
191
+ scrollTo(newLeft, rightNow);
192
+ }
193
+
194
+ function scrollTo(position: number, rightNow?: boolean) {
195
+ if (!domRef.current) {
196
+ return;
197
+ }
198
+ let needRafScroll = false;
199
+ // 部分安卓机在动画和raf同时执行时会卡顿
200
+ // @en Some Android machines will freeze when animation and raf are executed at the same time
201
+ // 如果是安卓机,且对滚动的时长和变化曲线无要求时,优先用原生顺滑滚动
202
+ // @en If it is an Android device, and there is no requirement for the scrolling duration and change curve, the native smooth scrolling is preferred
203
+ // 当浏览器不支持原生顺滑滚动,或对上述滚动参数有要求时,用raf滚动兜底
204
+ // @en When the browser does not support native smooth scrolling, or there are requirements for the above scrolling parameters, use raf to scroll the bottom line
205
+ if (
206
+ system === 'android' &&
207
+ tabBarScrollBezier === void 0 &&
208
+ tabBarScrollDuration === void 0
209
+ ) {
210
+ try {
211
+ const disObj = isVertical ? { left: position } : { top: position };
212
+ domRef.current.scrollTo({
213
+ ...disObj,
214
+ ...(rightNow ? {} : { behavior: 'smooth' }),
215
+ });
216
+ } catch (e) {
217
+ needRafScroll = true;
218
+ }
219
+ } else {
220
+ needRafScroll = true;
221
+ }
222
+ if (needRafScroll) {
223
+ scrollWithAnimation(
224
+ isVertical ? domRef.current.scrollLeft : domRef.current.scrollTop,
225
+ position,
226
+ top => {
227
+ if (domRef.current) {
228
+ if (isVertical) {
229
+ domRef.current.scrollLeft = top;
230
+ } else {
231
+ domRef.current.scrollTop = top;
232
+ }
233
+ }
234
+ },
235
+ rightNow ? 0 : tabBarScrollDuration,
236
+ tabBarScrollBezier,
237
+ );
238
+ }
239
+ }
240
+
241
+ function getTabRect(index: number) {
242
+ const currentTab = allCellRectRef.current[index] || {};
243
+ return {
244
+ left: (isVertical ? currentTab.left : currentTab.top) || 0,
245
+ width: (isVertical ? currentTab.width : currentTab.height) || 0,
246
+ };
247
+ }
248
+
249
+ function getTabCenterLeft(index: number) {
250
+ const { left: currentTabLeft, width: currentTabWidth } = getTabRect(index);
251
+ return currentTabLeft + currentTabWidth / 2;
252
+ }
253
+
254
+ function getCellPadding(pType: 'left' | 'right') {
255
+ if (typeof cellPadding === 'object') {
256
+ return cellPadding[pType];
257
+ }
258
+ return cellPadding;
259
+ }
260
+
261
+ function getCellStyle(index: number): CSSProperties {
262
+ if (!isVertical) {
263
+ return {};
264
+ }
265
+ const marginStart = useRtl ? 'marginRight' : 'marginLeft';
266
+ const marginEnd = useRtl ? 'marginLeft' : 'marginRight';
267
+ if (index === 0) {
268
+ return {
269
+ [marginEnd]: cellGutter,
270
+ [marginStart]: getCellPadding('left'),
271
+ };
272
+ }
273
+ return {
274
+ [marginEnd]: index === tabs.length - 1 ? void 0 : cellGutter,
275
+ };
276
+ }
277
+
278
+ function renderBarItem(tab: TabData, index: number) {
279
+ if (renderTabBarItem) {
280
+ return renderTabBarItem(tab, index, { active: index === activeIndex });
281
+ }
282
+ return typeof tab === 'string' ? tab : tab.title;
283
+ }
284
+
285
+ const renderTabUnderline = () => {
286
+ if (!showUnderline || !isLine) {
287
+ return null;
288
+ }
289
+ const lineProps = {
290
+ prefix,
291
+ showLine,
292
+ useCaterpillar,
293
+ distance,
294
+ tabDirection,
295
+ underlineInnerStyle,
296
+ cellTrans,
297
+ duration,
298
+ activeIndex,
299
+ wrapWidth,
300
+ wrapHeight,
301
+ jumpingDis,
302
+ caterpillarMaxScale,
303
+ caterpillarProperty,
304
+ translateZ,
305
+ underlineSize,
306
+ underlineThick,
307
+ underlineAdaptive,
308
+ renderUnderline,
309
+ };
310
+ return (
311
+ <TabCellUnderline
312
+ ref={underlineRef}
313
+ getTabCenterLeft={getTabCenterLeft}
314
+ getTabRect={getTabRect}
315
+ {...lineProps}
316
+ />
317
+ );
318
+ };
319
+
320
+ const cellInner = (
321
+ <>
322
+ {tabs.map((tab, index) => (
323
+ <div
324
+ key={index}
325
+ className={cls(
326
+ prefix,
327
+ tabDirection,
328
+ type,
329
+ system,
330
+ { active: index === activeIndex },
331
+ { 'no-shrink': tabBarScroll },
332
+ { last: index === tabs.length - 1 },
333
+ { custom: Boolean(renderTabBarItem) },
334
+ )}
335
+ style={getCellStyle(index)}
336
+ onClick={e => {
337
+ if (disabled) {
338
+ return;
339
+ }
340
+ changeIndex(index, 'click');
341
+ onTabClick && onTabClick(tab, index, e);
342
+ }}
343
+ ref={innerRef => {
344
+ // distance=0 说明不在滑动切换,减少计算次数
345
+ if (innerRef && !distance) {
346
+ allCellRectRef.current[index] = {
347
+ top: innerRef.offsetTop,
348
+ left: innerRef.offsetLeft,
349
+ width: innerRef.offsetWidth,
350
+ height: innerRef.offsetHeight,
351
+ };
352
+ }
353
+ }}
354
+ >
355
+ {renderBarItem(tab, index)}
356
+ </div>
357
+ ))}
358
+ {cellPadding && !isCard && isVertical ? (
359
+ <div
360
+ className="fake-padding"
361
+ style={{
362
+ width: getCellPadding('right'),
363
+ height: '100%',
364
+ }}
365
+ />
366
+ ) : null}
367
+ </>
368
+ );
369
+
370
+ const updateLayout = () => {
371
+ setForceUpdate(val => !val);
372
+ };
373
+
374
+ useImperativeHandle(
375
+ ref,
376
+ () => ({
377
+ dom: domRef.current,
378
+ scrollTo,
379
+ scrollToCenter,
380
+ hasOverflow,
381
+ setCaterpillarAnimate: ratio => underlineRef.current?.setCaterpillarAnimate(ratio),
382
+ resetUnderlineStyle: () => underlineRef.current?.resetUnderlineStyle(),
383
+ updateLayout: () => updateLayout(),
384
+ }),
385
+ [scrollToCenter, scrollTo, hasOverflow],
386
+ );
387
+
388
+ return (
389
+ <div
390
+ className={cls(
391
+ `${prefix}-container-wrap`,
392
+ tabDirection,
393
+ `type-${type}`,
394
+ tabBarClass,
395
+ system,
396
+ )}
397
+ style={tabBarStyle}
398
+ >
399
+ <div
400
+ className={cls(
401
+ `${prefix}-container-inner`,
402
+ tabDirection,
403
+ `pos-${tabBarPosition}`,
404
+ `type-${type}`,
405
+ { fixed: tabBarFixed },
406
+ { 'has-divider': hasDivider },
407
+ system,
408
+ )}
409
+ style={typeof tabBarFixed === 'object' ? tabBarFixed : {}}
410
+ >
411
+ <div
412
+ className={cls(
413
+ `${prefix}-container`,
414
+ tabDirection,
415
+ `pos-${tabBarPosition}`,
416
+ `arrange-${originArrange || tabBarArrange}`,
417
+ `type-${type}`,
418
+ { overflow: hasOverflow },
419
+ { shown: showTab },
420
+ )}
421
+ ref={domRef}
422
+ onScroll={onTabBarScroll}
423
+ >
424
+ {renderTabBarInner ? renderTabBarInner(cellInner) : cellInner}
425
+ {renderTabUnderline()}
426
+ </div>
427
+ {tabBarExtra}
428
+ </div>
429
+ </div>
430
+ );
431
+ });
432
+
433
+ export default TabCell;