@tarojs/components-advanced 4.1.12-beta.3 → 4.1.12-beta.5

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 (28) hide show
  1. package/dist/components/index.js +1 -0
  2. package/dist/components/index.js.map +1 -1
  3. package/dist/components/list/NoMore.d.ts +30 -0
  4. package/dist/components/list/NoMore.js +10 -0
  5. package/dist/components/list/NoMore.js.map +1 -0
  6. package/dist/components/list/hooks/useItemSizeCache.d.ts +13 -0
  7. package/dist/components/list/hooks/useItemSizeCache.js +40 -0
  8. package/dist/components/list/hooks/useItemSizeCache.js.map +1 -0
  9. package/dist/components/list/hooks/useRefresher.d.ts +72 -0
  10. package/dist/components/list/hooks/useRefresher.js +480 -0
  11. package/dist/components/list/hooks/useRefresher.js.map +1 -0
  12. package/dist/components/list/hooks/useResizeObserver.d.ts +26 -0
  13. package/dist/components/list/hooks/useResizeObserver.js +152 -0
  14. package/dist/components/list/hooks/useResizeObserver.js.map +1 -0
  15. package/dist/components/list/hooks/useScrollCorrection.d.ts +19 -0
  16. package/dist/components/list/hooks/useScrollCorrection.js +73 -0
  17. package/dist/components/list/hooks/useScrollCorrection.js.map +1 -0
  18. package/dist/components/list/index.d.ts +51 -3
  19. package/dist/components/list/index.js +836 -110
  20. package/dist/components/list/index.js.map +1 -1
  21. package/dist/components/list/utils.d.ts +16 -0
  22. package/dist/components/list/utils.js +19 -0
  23. package/dist/components/list/utils.js.map +1 -0
  24. package/dist/components/virtual-list/vue/list.d.ts +2 -2
  25. package/dist/components/virtual-waterfall/vue/waterfall.d.ts +1 -1
  26. package/dist/index.js +1 -0
  27. package/dist/index.js.map +1 -1
  28. package/package.json +9 -8
@@ -3,6 +3,7 @@ export { VirtualList } from './virtual-list/index.js';
3
3
  export { VirtualWaterfall } from './virtual-waterfall/index.js';
4
4
  import './water-flow/index.js';
5
5
  export { ListItem } from './list/ListItem.js';
6
+ export { NoMore } from './list/NoMore.js';
6
7
  export { StickyHeader } from './list/StickyHeader.js';
7
8
  export { StickySection } from './list/StickySection.js';
8
9
  export { FlowItem, useFlowItemPositioner } from './water-flow/flow-item.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ /**
3
+ * NoMore 组件 - 底部"没有更多"提示
4
+ *
5
+ * 这是一个标记组件,不直接渲染内容,仅用于向 List 组件传递配置。
6
+ * 实际渲染由 List 组件内部处理。
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * <List>
11
+ * <ListItem>Item 1</ListItem>
12
+ * <NoMore visible={!hasMore} text="没有更多了" />
13
+ * </List>
14
+ * ```
15
+ */
16
+ export interface NoMoreProps {
17
+ /** 是否显示(默认 true) */
18
+ visible?: boolean;
19
+ /** 提示文字(默认 "没有更多了") */
20
+ text?: string;
21
+ /** 自定义样式 */
22
+ style?: React.CSSProperties;
23
+ /** 自定义内容(优先级高于 text) */
24
+ children?: React.ReactNode;
25
+ /** NoMore 区域高度(用于动态高度计算,默认 60) */
26
+ height?: number;
27
+ }
28
+ declare const NoMore: React.FC<NoMoreProps>;
29
+ export { NoMore };
30
+ export default NoMore;
@@ -0,0 +1,10 @@
1
+ const NoMore = () => {
2
+ // 标记组件,不实际渲染
3
+ // 实际渲染由 List 组件内部的 renderNoMoreContent() 处理
4
+ return null;
5
+ };
6
+ // 设置 displayName 便于调试
7
+ NoMore.displayName = 'NoMore';
8
+
9
+ export { NoMore, NoMore as default };
10
+ //# sourceMappingURL=NoMore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoMore.js","sources":["../../../src/components/list/NoMore.tsx"],"sourcesContent":["import React from 'react'\n\n/**\n * NoMore 组件 - 底部\"没有更多\"提示\n *\n * 这是一个标记组件,不直接渲染内容,仅用于向 List 组件传递配置。\n * 实际渲染由 List 组件内部处理。\n *\n * @example\n * ```tsx\n * <List>\n * <ListItem>Item 1</ListItem>\n * <NoMore visible={!hasMore} text=\"没有更多了\" />\n * </List>\n * ```\n */\n\nexport interface NoMoreProps {\n /** 是否显示(默认 true) */\n visible?: boolean\n\n /** 提示文字(默认 \"没有更多了\") */\n text?: string\n\n /** 自定义样式 */\n style?: React.CSSProperties\n\n /** 自定义内容(优先级高于 text) */\n children?: React.ReactNode\n\n /** NoMore 区域高度(用于动态高度计算,默认 60) */\n height?: number\n}\n\nconst NoMore: React.FC<NoMoreProps> = () => {\n // 标记组件,不实际渲染\n // 实际渲染由 List 组件内部的 renderNoMoreContent() 处理\n return null\n}\n\n// 设置 displayName 便于调试\nNoMore.displayName = 'NoMore'\n\nexport { NoMore }\nexport default NoMore\n"],"names":[],"mappings":"AAkCM,MAAA,MAAM,GAA0B,MAAK;;;AAGzC,IAAA,OAAO,IAAI;AACb;AAEA;AACA,MAAM,CAAC,WAAW,GAAG,QAAQ;;;;"}
@@ -0,0 +1,13 @@
1
+ interface UseItemSizeCacheOptions {
2
+ isHorizontal: boolean;
3
+ estimatedItemSize: number;
4
+ itemCount: number;
5
+ }
6
+ interface UseItemSizeCacheReturn {
7
+ /** 获取项的尺寸(高度或宽度) */
8
+ getItemSize: (index: number) => number;
9
+ /** 设置项的尺寸 */
10
+ setItemSize: (index: number, size: number) => void;
11
+ }
12
+ export declare function useItemSizeCache(options: UseItemSizeCacheOptions): UseItemSizeCacheReturn;
13
+ export {};
@@ -0,0 +1,40 @@
1
+ import { useRef, useCallback } from 'react';
2
+
3
+ function useItemSizeCache(options) {
4
+ const { estimatedItemSize } = options;
5
+ // 缓存 Map:key = 索引,value = 尺寸信息
6
+ const cacheRef = useRef(new Map());
7
+ /**
8
+ * 获取项的尺寸
9
+ * 优先返回实际测量值,否则返回估算值
10
+ */
11
+ const getItemSize = useCallback((index) => {
12
+ const cached = cacheRef.current.get(index);
13
+ if ((cached === null || cached === void 0 ? void 0 : cached.isMeasured) && cached.measuredSize !== null) {
14
+ return cached.measuredSize;
15
+ }
16
+ return estimatedItemSize;
17
+ }, [estimatedItemSize]);
18
+ /**
19
+ * 设置项的尺寸(实际测量后调用)
20
+ */
21
+ const setItemSize = useCallback((index, size) => {
22
+ const cached = cacheRef.current.get(index);
23
+ // 尺寸变化小于 1px,忽略(避免微小抖动)
24
+ if ((cached === null || cached === void 0 ? void 0 : cached.measuredSize) && Math.abs(cached.measuredSize - size) < 1) {
25
+ return;
26
+ }
27
+ cacheRef.current.set(index, {
28
+ measuredSize: size,
29
+ estimatedSize: estimatedItemSize,
30
+ isMeasured: true
31
+ });
32
+ }, [estimatedItemSize]);
33
+ return {
34
+ getItemSize,
35
+ setItemSize
36
+ };
37
+ }
38
+
39
+ export { useItemSizeCache };
40
+ //# sourceMappingURL=useItemSizeCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useItemSizeCache.js","sources":["../../../../src/components/list/hooks/useItemSizeCache.ts"],"sourcesContent":["import { useCallback, useRef } from 'react'\n\n/**\n * useItemSizeCache Hook - 动态尺寸缓存管理\n *\n * 支持垂直滚动(高度)和水平滚动(宽度)两种模式\n */\n\n/** 单个项的尺寸缓存 */\ninterface ItemMeasureCache {\n measuredSize: number | null // 实际测量尺寸\n estimatedSize: number // 估算尺寸\n isMeasured: boolean // 是否已测量\n}\n\ninterface UseItemSizeCacheOptions {\n isHorizontal: boolean // 是否水平滚动\n estimatedItemSize: number // 估算尺寸\n itemCount: number // 项总数\n}\n\ninterface UseItemSizeCacheReturn {\n /** 获取项的尺寸(高度或宽度) */\n getItemSize: (index: number) => number\n\n /** 设置项的尺寸 */\n setItemSize: (index: number, size: number) => void\n}\n\nexport function useItemSizeCache(\n options: UseItemSizeCacheOptions\n): UseItemSizeCacheReturn {\n const { estimatedItemSize } = options\n\n // 缓存 Map:key = 索引,value = 尺寸信息\n const cacheRef = useRef<Map<number, ItemMeasureCache>>(new Map())\n\n /**\n * 获取项的尺寸\n * 优先返回实际测量值,否则返回估算值\n */\n const getItemSize = useCallback((index: number): number => {\n const cached = cacheRef.current.get(index)\n\n if (cached?.isMeasured && cached.measuredSize !== null) {\n return cached.measuredSize\n }\n\n return estimatedItemSize\n }, [estimatedItemSize])\n\n /**\n * 设置项的尺寸(实际测量后调用)\n */\n const setItemSize = useCallback((index: number, size: number) => {\n const cached = cacheRef.current.get(index)\n\n // 尺寸变化小于 1px,忽略(避免微小抖动)\n if (cached?.measuredSize && Math.abs(cached.measuredSize - size) < 1) {\n return\n }\n\n cacheRef.current.set(index, {\n measuredSize: size,\n estimatedSize: estimatedItemSize,\n isMeasured: true\n })\n }, [estimatedItemSize])\n\n return {\n getItemSize,\n setItemSize\n }\n}\n"],"names":[],"mappings":";;AA6BM,SAAU,gBAAgB,CAC9B,OAAgC,EAAA;AAEhC,IAAA,MAAM,EAAE,iBAAiB,EAAE,GAAG,OAAO;;IAGrC,MAAM,QAAQ,GAAG,MAAM,CAAgC,IAAI,GAAG,EAAE,CAAC;AAEjE;;;AAGG;AACH,IAAA,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAa,KAAY;QACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAE1C,QAAA,IAAI,CAAA,MAAM,KAAN,IAAA,IAAA,MAAM,uBAAN,MAAM,CAAE,UAAU,KAAI,MAAM,CAAC,YAAY,KAAK,IAAI,EAAE;YACtD,OAAO,MAAM,CAAC,YAAY;;AAG5B,QAAA,OAAO,iBAAiB;AAC1B,KAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;AAEvB;;AAEG;IACH,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,IAAY,KAAI;QAC9D,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;;QAG1C,IAAI,CAAA,MAAM,KAAN,IAAA,IAAA,MAAM,uBAAN,MAAM,CAAE,YAAY,KAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE;YACpE;;AAGF,QAAA,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE;AAC1B,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,aAAa,EAAE,iBAAiB;AAChC,YAAA,UAAU,EAAE;AACb,SAAA,CAAC;AACJ,KAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;IAEvB,OAAO;QACL,WAAW;QACX;KACD;AACH;;;;"}
@@ -0,0 +1,72 @@
1
+ import React from 'react';
2
+ /**
3
+ * List 组件内部的 refresher 配置类型(独立于 Refresher 组件)
4
+ * 与 ScrollView refresher 相关属性语义对齐
5
+ */
6
+ export interface ListRefresherConfig {
7
+ refresherEnabled?: boolean;
8
+ refresherThreshold?: number;
9
+ refresherDefaultStyle?: 'black' | 'white' | 'none';
10
+ refresherBackground?: string;
11
+ refresherTriggered?: boolean;
12
+ /** 自定义刷新内容(来自 Refresher 子组件的 children) */
13
+ children?: React.ReactNode;
14
+ onRefresherPulling?: (e?: {
15
+ detail?: {
16
+ deltaY?: number;
17
+ };
18
+ }) => void;
19
+ onRefresherRefresh?: () => void | Promise<void>;
20
+ onRefresherRestore?: () => void;
21
+ onRefresherAbort?: () => void;
22
+ onRefresherWillRefresh?: () => void;
23
+ onRefresherStatusChange?: (e?: {
24
+ detail?: {
25
+ status?: number;
26
+ dy?: number;
27
+ };
28
+ }) => void;
29
+ }
30
+ /** 默认刷新层高度(对齐 Dynamic),无自定义 children 时使用 */
31
+ export declare const DEFAULT_REFRESHER_HEIGHT = 50;
32
+ /** 下拉刷新状态枚举(对齐微信小程序 RefreshStatus) */
33
+ export declare const enum RefreshStatus {
34
+ /** 空闲 */
35
+ Idle = 0,
36
+ /** 超过下拉刷新阈值 */
37
+ CanRefresh = 1,
38
+ /** 刷新中 */
39
+ Refreshing = 2,
40
+ /** 刷新完成 */
41
+ Completed = 3,
42
+ /** 刷新失败 */
43
+ Failed = 4
44
+ }
45
+ interface UseRefresherReturn {
46
+ scrollViewRefresherProps: {
47
+ refresherEnabled?: boolean;
48
+ refresherThreshold?: number;
49
+ refresherDefaultStyle?: string;
50
+ refresherBackground?: string;
51
+ refresherTriggered?: boolean;
52
+ };
53
+ scrollViewRefresherHandlers: {
54
+ onRefresherPulling?: (e: any) => void;
55
+ onRefresherRefresh?: (e: any) => void;
56
+ onRefresherRestore?: () => void;
57
+ onRefresherAbort?: () => void;
58
+ };
59
+ h5RefresherProps: {
60
+ touchHandlers: Record<string, unknown>;
61
+ pullDistance: number;
62
+ isRefreshing: boolean;
63
+ /** H5 单结构下恒为 true,仅兼容旧类型 */
64
+ showRefresherLayer: boolean;
65
+ };
66
+ addImperativeTouchListeners?: (el: HTMLElement) => () => void;
67
+ renderRefresherContent: () => React.ReactNode | null;
68
+ }
69
+ export declare function useRefresher(config: ListRefresherConfig | null,
70
+ /** 列表逻辑顶部对应的 scrollTop,用于触顶判断;H5「顶栏悬浮+只滚列表」时传 0,imperative 内以 DOM scrollTop 为准 */
71
+ scrollTopAtLogicalTop: number): UseRefresherReturn;
72
+ export {};