@tarojs/components-advanced 3.7.0-alpha.7 → 3.7.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/virtual-list/index.d.ts +49 -30
- package/dist/components/virtual-list/index.js.map +1 -1
- package/dist/components/virtual-list/list-set.d.ts +4 -0
- package/dist/components/virtual-list/list-set.js +24 -59
- package/dist/components/virtual-list/list-set.js.map +1 -1
- package/dist/components/virtual-list/preset.d.ts +23 -8
- package/dist/components/virtual-list/preset.js +116 -60
- package/dist/components/virtual-list/preset.js.map +1 -1
- package/dist/components/virtual-list/react/index.d.ts +1 -1
- package/dist/components/virtual-list/react/index.js +8 -16
- package/dist/components/virtual-list/react/index.js.map +1 -1
- package/dist/components/virtual-list/react/list.d.ts +5 -4
- package/dist/components/virtual-list/react/list.js +138 -124
- package/dist/components/virtual-list/react/list.js.map +1 -1
- package/dist/components/virtual-list/react/validate.d.ts +1 -1
- package/dist/components/virtual-list/react/validate.js +8 -14
- package/dist/components/virtual-list/react/validate.js.map +1 -1
- package/dist/components/virtual-list/react/wrapper.d.ts +3 -0
- package/dist/components/virtual-list/react/wrapper.js +58 -0
- package/dist/components/virtual-list/react/wrapper.js.map +1 -0
- package/dist/components/virtual-list/utils.d.ts +1 -4
- package/dist/components/virtual-list/utils.js +1 -28
- package/dist/components/virtual-list/utils.js.map +1 -1
- package/dist/components/virtual-list/vue/list.d.ts +406 -50
- package/dist/components/virtual-list/vue/list.js +198 -169
- package/dist/components/virtual-list/vue/list.js.map +1 -1
- package/dist/components/virtual-waterfall/constants.d.ts +2 -0
- package/dist/components/virtual-waterfall/constants.js +4 -0
- package/dist/components/virtual-waterfall/constants.js.map +1 -0
- package/dist/components/virtual-waterfall/index.d.ts +249 -0
- package/dist/components/virtual-waterfall/index.js +6 -0
- package/dist/components/virtual-waterfall/index.js.map +1 -0
- package/dist/components/virtual-waterfall/list-map.d.ts +50 -0
- package/dist/components/virtual-waterfall/list-map.js +280 -0
- package/dist/components/virtual-waterfall/list-map.js.map +1 -0
- package/dist/components/virtual-waterfall/preset.d.ts +60 -0
- package/dist/components/virtual-waterfall/preset.js +170 -0
- package/dist/components/virtual-waterfall/preset.js.map +1 -0
- package/dist/components/virtual-waterfall/react/index.d.ts +4 -0
- package/dist/components/virtual-waterfall/react/index.js +26 -0
- package/dist/components/virtual-waterfall/react/index.js.map +1 -0
- package/dist/components/virtual-waterfall/react/waterfall.d.ts +42 -0
- package/dist/components/virtual-waterfall/react/waterfall.js +316 -0
- package/dist/components/virtual-waterfall/react/waterfall.js.map +1 -0
- package/dist/components/virtual-waterfall/react/wrapper.d.ts +3 -0
- package/dist/components/virtual-waterfall/react/wrapper.js +50 -0
- package/dist/components/virtual-waterfall/react/wrapper.js.map +1 -0
- package/dist/components/virtual-waterfall/vue/index.d.ts +17 -0
- package/dist/components/virtual-waterfall/vue/index.js +12 -0
- package/dist/components/virtual-waterfall/vue/index.js.map +1 -0
- package/dist/components/virtual-waterfall/vue/waterfall.d.ts +443 -0
- package/dist/components/virtual-waterfall/vue/waterfall.js +410 -0
- package/dist/components/virtual-waterfall/vue/waterfall.js.map +1 -0
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/convert.d.ts +2 -2
- package/dist/utils/convert.js.map +1 -1
- package/dist/utils/dom.d.ts +7 -0
- package/dist/utils/dom.js +45 -0
- package/dist/utils/dom.js.map +1 -0
- package/dist/utils/helper.d.ts +10 -0
- package/dist/utils/helper.js +51 -0
- package/dist/utils/helper.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/lodash.d.ts +3 -1
- package/dist/utils/lodash.js +30 -1
- package/dist/utils/lodash.js.map +1 -1
- package/dist/utils/vue-render.d.ts +4 -0
- package/dist/{components/virtual-list/vue/render.js → utils/vue-render.js} +2 -2
- package/dist/utils/vue-render.js.map +1 -0
- package/package.json +8 -6
- package/dist/components/virtual-list/vue/render.d.ts +0 -4
- package/dist/components/virtual-list/vue/render.js.map +0 -1
package/dist/components/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BaseEventOrig, BaseEventOrigFunction, ScrollViewProps, StandardProps } from '@tarojs/components';
|
|
2
2
|
import { Component, ComponentType, CSSProperties, ReactNode } from 'react';
|
|
3
|
-
interface VirtualListProps extends Omit<StandardProps, 'children'> {
|
|
3
|
+
interface VirtualListProps<T = any> extends Omit<StandardProps, 'children'> {
|
|
4
4
|
/** 列表的高度。 */
|
|
5
5
|
height: string | number;
|
|
6
6
|
/** 列表的宽度。 */
|
|
@@ -9,10 +9,8 @@ interface VirtualListProps extends Omit<StandardProps, 'children'> {
|
|
|
9
9
|
item: ComponentType<{
|
|
10
10
|
/** 组件 ID */
|
|
11
11
|
id: string;
|
|
12
|
-
/** 单项的样式,样式必须传入组件的 style 中 */
|
|
13
|
-
style?: CSSProperties;
|
|
14
12
|
/** 组件渲染的数据 */
|
|
15
|
-
data:
|
|
13
|
+
data: T[];
|
|
16
14
|
/** 组件渲染数据的索引 */
|
|
17
15
|
index: number;
|
|
18
16
|
/** 组件是否正在滚动,当 useIsScrolling 值为 true 时返回布尔值,否则返回 undefined */
|
|
@@ -21,53 +19,73 @@ interface VirtualListProps extends Omit<StandardProps, 'children'> {
|
|
|
21
19
|
/** 列表的长度 */
|
|
22
20
|
itemCount: number;
|
|
23
21
|
/** 渲染数据 */
|
|
24
|
-
itemData:
|
|
22
|
+
itemData: T[];
|
|
25
23
|
/** 列表单项的大小,垂直滚动时为高度,水平滚动时为宽度。
|
|
26
24
|
*
|
|
27
25
|
* > Note:
|
|
28
26
|
* > - unlimitedSize 模式下如果传入函数,只会调用一次用于设置初始值
|
|
29
27
|
* > - 非 unlimitedSize 模式下如果传入函数,为避免性能问题,每个节点只会调用一次用于设置初始值
|
|
30
28
|
*/
|
|
31
|
-
itemSize: number | ((index?: number, itemData?:
|
|
32
|
-
/** 解开高度列表单项大小限制,默认值使用: itemSize
|
|
29
|
+
itemSize: number | ((index?: number, itemData?: T[]) => number);
|
|
30
|
+
/** 解开高度列表单项大小限制,默认值使用: itemSize。
|
|
33
31
|
*
|
|
34
|
-
* > Note: 通过 itemSize
|
|
32
|
+
* > Note: 通过 itemSize 设置的初始高度与子节点实际高度差异过大会导致隐患,建议将单页大小设置接近于现实高度,在该模式下可以提升用户体验。
|
|
35
33
|
* @default false
|
|
36
34
|
*/
|
|
37
35
|
unlimitedSize?: boolean;
|
|
38
36
|
/** 布局方式
|
|
39
37
|
* @default "absolute"
|
|
40
38
|
*/
|
|
41
|
-
position?: 'absolute' | 'relative';
|
|
39
|
+
position?: 'absolute' | 'relative' | 'brick';
|
|
40
|
+
/** 滚动方向。vertical 为垂直滚动,horizontal 为平行滚动。
|
|
41
|
+
* @default "vertical"
|
|
42
|
+
*/
|
|
43
|
+
layout?: 'vertical' | 'horizontal';
|
|
42
44
|
/** 初始滚动偏移值,水平滚动影响 scrollLeft,垂直滚动影响 scrollTop。 */
|
|
43
45
|
initialScrollOffset?: number;
|
|
44
|
-
/**
|
|
45
|
-
|
|
46
|
+
/** 在可视区域之外渲染的列表单项数量,值设置得越高,快速滚动时出现白屏的概率就越小,相应地,每次滚动的性能会变得越差。 */
|
|
47
|
+
overscanCount?: number;
|
|
48
|
+
/** 上下滚动预占位节点 */
|
|
49
|
+
placeholderCount?: number;
|
|
50
|
+
/** 触顶事件触发时距页面顶部距离
|
|
51
|
+
* @default 50
|
|
46
52
|
*/
|
|
47
|
-
|
|
53
|
+
upperThreshold?: number;
|
|
54
|
+
/** 触底事件触发时距页面底部距离
|
|
55
|
+
* @default 50
|
|
56
|
+
*/
|
|
57
|
+
lowerThreshold?: number;
|
|
58
|
+
/** 是否注入 isScrolling 属性到 item 组件。这个参数一般用于实现滚动骨架屏(或其它 placeholder) 时比较有用。 */
|
|
59
|
+
useIsScrolling?: boolean;
|
|
48
60
|
/** 通过 ScrollViewContext 优化组件滚动性能
|
|
49
61
|
* @default false
|
|
50
62
|
* @note 部分平台不支持,使用时请注意甄别
|
|
51
63
|
*/
|
|
52
64
|
enhanced?: boolean;
|
|
65
|
+
/** 列表外部容器组件类型。
|
|
66
|
+
* @default ScrollView
|
|
67
|
+
*/
|
|
68
|
+
outerElementType?: ComponentType | string;
|
|
69
|
+
/** 列表内部容器组件类型。
|
|
70
|
+
* @default View
|
|
71
|
+
*/
|
|
72
|
+
innerElementType?: ComponentType | string;
|
|
73
|
+
/** 列表子节点容器组件类型。
|
|
74
|
+
* @default View
|
|
75
|
+
*/
|
|
76
|
+
itemElementType?: ComponentType | string;
|
|
53
77
|
/** 顶部区域 */
|
|
54
78
|
renderTop?: ReactNode;
|
|
55
79
|
/** 底部区域 */
|
|
56
80
|
renderBottom?: ReactNode;
|
|
57
|
-
/** 滚动方向。vertical 为垂直滚动,horizontal 为平行滚动。
|
|
58
|
-
* @default "vertical"
|
|
59
|
-
*/
|
|
60
|
-
layout?: 'vertical' | 'horizontal';
|
|
61
81
|
/** 列表滚动时调用函数 */
|
|
62
82
|
onScroll?: (event: VirtualListProps.IVirtualListEvent<VirtualListProps.IVirtualListEventDetail>) => void;
|
|
63
83
|
/** 调用平台原生的滚动监听函数。 */
|
|
64
84
|
onScrollNative?: BaseEventOrigFunction<ScrollViewProps.onScrollDetail>;
|
|
65
|
-
/**
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
-
/** 是否注入 isScrolling 属性到 item 组件。这个参数一般用于实现滚动骨架屏(或其它 placeholder) 时比较有用。 */
|
|
70
|
-
useIsScrolling?: boolean;
|
|
85
|
+
/** 触顶事件 */
|
|
86
|
+
onScrollToUpper?: () => void;
|
|
87
|
+
/** 触底事件 */
|
|
88
|
+
onScrollToLower?: () => void;
|
|
71
89
|
style?: CSSProperties;
|
|
72
90
|
}
|
|
73
91
|
declare namespace VirtualListProps {
|
|
@@ -76,6 +94,9 @@ declare namespace VirtualListProps {
|
|
|
76
94
|
scrollTop: number;
|
|
77
95
|
scrollHeight: number;
|
|
78
96
|
scrollWidth: number;
|
|
97
|
+
clientHeight: number;
|
|
98
|
+
clientWidth: number;
|
|
99
|
+
diffOffset: number;
|
|
79
100
|
}
|
|
80
101
|
interface IVirtualListEvent<T extends ScrollViewProps.onScrollDetail = ScrollViewProps.onScrollDetail> extends BaseEventOrig {
|
|
81
102
|
/** 滚动方向,可能值为 forward 往前, backward 往后。 */
|
|
@@ -84,7 +105,7 @@ declare namespace VirtualListProps {
|
|
|
84
105
|
scrollOffset: number;
|
|
85
106
|
/** 当滚动是由 scrollTo() 或 scrollToItem() 调用时返回 true,否则返回 false */
|
|
86
107
|
scrollUpdateWasRequested: boolean;
|
|
87
|
-
/**
|
|
108
|
+
/** 滚动信息 */
|
|
88
109
|
detail: T;
|
|
89
110
|
}
|
|
90
111
|
}
|
|
@@ -99,9 +120,9 @@ declare namespace VirtualListProps {
|
|
|
99
120
|
* return Array(100).fill(0).map((_, i) => i + offset);
|
|
100
121
|
* }
|
|
101
122
|
*
|
|
102
|
-
* const Row = React.memo(({ id, index,
|
|
123
|
+
* const Row = React.memo(({ id, index, data }) => {
|
|
103
124
|
* return (
|
|
104
|
-
* <View id={id} className={index % 2 ? 'ListItemOdd' : 'ListItemEven'}
|
|
125
|
+
* <View id={id} className={index % 2 ? 'ListItemOdd' : 'ListItemEven'}>
|
|
105
126
|
* Row {index}
|
|
106
127
|
* </View>
|
|
107
128
|
* );
|
|
@@ -141,7 +162,6 @@ declare namespace VirtualListProps {
|
|
|
141
162
|
* <template>
|
|
142
163
|
* <view
|
|
143
164
|
* :class="index % 2 ? 'ListItemOdd' : 'ListItemEven'"
|
|
144
|
-
* :style="css"
|
|
145
165
|
* >
|
|
146
166
|
* Row {{ index }} : {{ data[index] }}
|
|
147
167
|
* </view>
|
|
@@ -149,7 +169,7 @@ declare namespace VirtualListProps {
|
|
|
149
169
|
*
|
|
150
170
|
* <script>
|
|
151
171
|
* export default {
|
|
152
|
-
* props: ['index', 'data'
|
|
172
|
+
* props: ['index', 'data']
|
|
153
173
|
* }
|
|
154
174
|
* </script>
|
|
155
175
|
* ```
|
|
@@ -157,7 +177,6 @@ declare namespace VirtualListProps {
|
|
|
157
177
|
* <! –– page.vue 页面组件 ––>
|
|
158
178
|
* <template>
|
|
159
179
|
* <virtual-list
|
|
160
|
-
* wclass="List"
|
|
161
180
|
* :height="500"
|
|
162
181
|
* :item-data="list"
|
|
163
182
|
* :item-count="list.length"
|
|
@@ -194,7 +213,7 @@ declare class VirtualListComponent extends Component<VirtualListProps> {
|
|
|
194
213
|
/**
|
|
195
214
|
* 滚动到指定的地点。
|
|
196
215
|
*/
|
|
197
|
-
scrollTo(scrollOffset: number): void;
|
|
216
|
+
scrollTo(scrollOffset: number, enhanced?: boolean): void;
|
|
198
217
|
/** 滚动到指定的条目。
|
|
199
218
|
* @param index 指定条目的索引。
|
|
200
219
|
* @param align 滚动到指定条目时,指定条目的位置。默认值为 auto。
|
|
@@ -215,7 +234,7 @@ declare class VirtualListComponent extends Component<VirtualListProps> {
|
|
|
215
234
|
* - auto:尽可能滚动距离最小保证条目在可视区域中,如果已经在可视区域,就不滚动。
|
|
216
235
|
* - smart:条目如果已经在可视区域,就不滚动;如果有部分在可视区域,尽可能滚动距离最小保证条目在可视区域中;如果条目完全不在可视区域,那就滚动到条目在可视区域居中显示。
|
|
217
236
|
*/
|
|
218
|
-
scrollToItem(index: number, align: 'start' | 'end' | 'center' | 'auto' | 'smart'): void;
|
|
237
|
+
scrollToItem(index: number, align: 'start' | 'end' | 'center' | 'auto' | 'smart', enhanced?: boolean): void;
|
|
219
238
|
}
|
|
220
239
|
type VirtualList = VirtualListComponent;
|
|
221
240
|
declare const VirtualList: typeof VirtualListComponent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/virtual-list/index.ts"],"sourcesContent":["import type { BaseEventOrig, BaseEventOrigFunction, ScrollViewProps, StandardProps } from '@tarojs/components'\nimport type { Component, ComponentType, CSSProperties, ReactNode } from 'react'\n\ninterface VirtualListProps extends Omit<StandardProps, 'children'> {\n /** 列表的高度。 */\n height: string | number\n /** 列表的宽度。 */\n width: string | number\n /** 子组件 */\n item: ComponentType<{\n /** 组件 ID */\n id: string\n /**
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/virtual-list/index.ts"],"sourcesContent":["import type { BaseEventOrig, BaseEventOrigFunction, ScrollViewProps, StandardProps } from '@tarojs/components'\nimport type { Component, ComponentType, CSSProperties, ReactNode } from 'react'\n\ninterface VirtualListProps<T = any> extends Omit<StandardProps, 'children'> {\n /** 列表的高度。 */\n height: string | number\n /** 列表的宽度。 */\n width: string | number\n /** 子组件 */\n item: ComponentType<{\n /** 组件 ID */\n id: string\n /** 组件渲染的数据 */\n data: T[]\n /** 组件渲染数据的索引 */\n index: number\n /** 组件是否正在滚动,当 useIsScrolling 值为 true 时返回布尔值,否则返回 undefined */\n isScrolling?: boolean\n }>\n /** 列表的长度 */\n itemCount: number\n /** 渲染数据 */\n itemData: T[]\n /** 列表单项的大小,垂直滚动时为高度,水平滚动时为宽度。\n *\n * > Note:\n * > - unlimitedSize 模式下如果传入函数,只会调用一次用于设置初始值\n * > - 非 unlimitedSize 模式下如果传入函数,为避免性能问题,每个节点只会调用一次用于设置初始值\n */\n itemSize: number | ((index?: number, itemData?: T[]) => number)\n /** 解开高度列表单项大小限制,默认值使用: itemSize。\n *\n * > Note: 通过 itemSize 设置的初始高度与子节点实际高度差异过大会导致隐患,建议将单页大小设置接近于现实高度,在该模式下可以提升用户体验。\n * @default false\n */\n unlimitedSize?: boolean\n /** 布局方式\n * @default \"absolute\"\n */\n position?: 'absolute' | 'relative' | 'brick'\n /** 滚动方向。vertical 为垂直滚动,horizontal 为平行滚动。\n * @default \"vertical\"\n */\n layout?: 'vertical' | 'horizontal'\n /** 初始滚动偏移值,水平滚动影响 scrollLeft,垂直滚动影响 scrollTop。 */\n initialScrollOffset?: number\n /** 在可视区域之外渲染的列表单项数量,值设置得越高,快速滚动时出现白屏的概率就越小,相应地,每次滚动的性能会变得越差。 */\n overscanCount?: number\n /** 上下滚动预占位节点 */\n placeholderCount?: number\n /** 触顶事件触发时距页面顶部距离\n * @default 50\n */\n upperThreshold?: number\n /** 触底事件触发时距页面底部距离\n * @default 50\n */\n lowerThreshold?: number\n /** 是否注入 isScrolling 属性到 item 组件。这个参数一般用于实现滚动骨架屏(或其它 placeholder) 时比较有用。 */\n useIsScrolling?: boolean\n /** 通过 ScrollViewContext 优化组件滚动性能\n * @default false\n * @note 部分平台不支持,使用时请注意甄别\n */\n enhanced?: boolean\n /** 列表外部容器组件类型。\n * @default ScrollView\n */\n outerElementType?: ComponentType | string\n /** 列表内部容器组件类型。\n * @default View\n */\n innerElementType?: ComponentType | string\n /** 列表子节点容器组件类型。\n * @default View\n */\n itemElementType?: ComponentType | string\n /** 顶部区域 */\n renderTop?: ReactNode\n /** 底部区域 */\n renderBottom?: ReactNode\n /** 列表滚动时调用函数 */\n onScroll?: (event: VirtualListProps.IVirtualListEvent<VirtualListProps.IVirtualListEventDetail>) => void\n /** 调用平台原生的滚动监听函数。 */\n onScrollNative?: BaseEventOrigFunction<ScrollViewProps.onScrollDetail>\n /** 触顶事件 */\n onScrollToUpper?: () => void\n /** 触底事件 */\n onScrollToLower?: () => void\n style?: CSSProperties\n}\n\ndeclare namespace VirtualListProps {\n interface IVirtualListEventDetail extends ScrollViewProps.onScrollDetail {\n scrollLeft: number\n scrollTop: number\n scrollHeight: number\n scrollWidth: number\n clientHeight: number\n clientWidth: number\n diffOffset: number\n }\n\n interface IVirtualListEvent<T extends ScrollViewProps.onScrollDetail = ScrollViewProps.onScrollDetail> extends BaseEventOrig {\n /** 滚动方向,可能值为 forward 往前, backward 往后。 */\n scrollDirection: 'forward' | 'backward'\n /** 滚动距离 */\n scrollOffset: number\n /** 当滚动是由 scrollTo() 或 scrollToItem() 调用时返回 true,否则返回 false */\n scrollUpdateWasRequested: boolean\n /** 滚动信息 */\n detail: T\n }\n}\n\n/** 虚拟列表\n * @classification viewContainer\n * @supported weapp, swan, alipay, tt, qq, jd, h5\n * @example_react\n * ```tsx\n * import VirtualList from `@tarojs/components/virtual-list`\n *\n * function buildData (offset = 0) {\n * return Array(100).fill(0).map((_, i) => i + offset);\n * }\n *\n * const Row = React.memo(({ id, index, data }) => {\n * return (\n * <View id={id} className={index % 2 ? 'ListItemOdd' : 'ListItemEven'}>\n * Row {index}\n * </View>\n * );\n * })\n *\n * export default class Index extends Component {\n * state = {\n * data: buildData(0),\n * }\n *\n * render() {\n * const { data } = this.state\n * const dataLen = data.length\n * return (\n * <VirtualList\n * height={500} // 列表的高度\n * width='100%' // 列表的宽度\n * item={Row} // 列表单项组件,这里只能传入一个组件\n * itemData={data} // 渲染列表的数据\n * itemCount={dataLen} // 渲染列表的长度\n * itemSize={100} // 列表单项的高度\n * />\n * );\n * }\n * }\n * ```\n * @example_vue\n * ```js\n * // app.js 入口文件\n * import Vue from 'vue'\n * import VirtualList from '@tarojs/components/virtual-list'\n *\n * Vue.use(VirtualList)\n * ```\n * ```js\n * <! –– row.vue 单项组件 ––>\n * <template>\n * <view\n * :class=\"index % 2 ? 'ListItemOdd' : 'ListItemEven'\"\n * >\n * Row {{ index }} : {{ data[index] }}\n * </view>\n * </template>\n *\n * <script>\n * export default {\n * props: ['index', 'data']\n * }\n * </script>\n * ```\n * ```js\n * <! –– page.vue 页面组件 ––>\n * <template>\n * <virtual-list\n * :height=\"500\"\n * :item-data=\"list\"\n * :item-count=\"list.length\"\n * :item-size=\"100\"\n * :item=\"Row\"\n * width=\"100%\"\n * />\n * </template>\n *\n * <script>\n * import Row from './row.vue'\n * import { markRaw } from 'vue'\n *\n * function buildData (offset = 0) {\n * return Array(100).fill(0).map((_, i) => i + offset)\n * }\n *\n * export default {\n * data() {\n * return {\n * Row: markRaw(Row),\n * list: buildData(0)\n * }\n * },\n * }\n * </script>\n * ```\n * @see https://taro-docs.jd.com/docs/virtual-list\n */\ndeclare class VirtualListComponent extends Component<VirtualListProps> {\n /**\n * 滚动到指定的地点。\n */\n public scrollTo(scrollOffset: number, enhanced?: boolean): void\n\n /** 滚动到指定的条目。\n * @param index 指定条目的索引。\n * @param align 滚动到指定条目时,指定条目的位置。默认值为 auto。\n *\n * - start:指定条目在可视区域的顶部。\n * - end:指定条目在可视区域的底部。\n * - center:指定条目在可视区域的中间。\n * - auto:尽可能滚动距离最小保证条目在可视区域中,如果已经在可视区域,就不滚动。\n * - smart:条目如果已经在可视区域,就不滚动;如果有部分在可视区域,尽可能滚动距离最小保证条目在可视区域中;如果条目完全不在可视区域,那就滚动到条目在可视区域居中显示。\n */\n public scrollToItem(index: number, align: 'start' | 'end' | 'center' | 'auto' | 'smart', enhanced?: boolean): void\n}\n\ndeclare type VirtualList = VirtualListComponent\nconst VirtualList: typeof VirtualListComponent = (process.env.FRAMEWORK === 'vue' || process.env.FRAMEWORK === 'vue3')\n ? require('./vue').default\n : require('./react').default\n\nexport { VirtualList, VirtualListProps }\nexport default VirtualList\n"],"names":[],"mappings":"AAwOA,MAAM,WAAW,GAAgC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM;AACnH,MAAE,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO;AAC1B,MAAE,OAAO,CAAC,SAAS,CAAC,CAAC;;;;"}
|
|
@@ -6,6 +6,9 @@ declare class ListSet {
|
|
|
6
6
|
list: number[];
|
|
7
7
|
mode?: 'normal' | 'function' | 'unlimited';
|
|
8
8
|
defaultSize: number;
|
|
9
|
+
wrapperHeight: number;
|
|
10
|
+
wrapperWidth: number;
|
|
11
|
+
refreshCounter: number;
|
|
9
12
|
constructor(props: TProps, refresh?: TFunc);
|
|
10
13
|
get isNormalMode(): boolean;
|
|
11
14
|
get isFunctionMode(): boolean;
|
|
@@ -17,6 +20,7 @@ declare class ListSet {
|
|
|
17
20
|
setSize(i?: number, size?: number): void;
|
|
18
21
|
getSize(i?: number): number;
|
|
19
22
|
getOffsetSize(i?: number): number;
|
|
23
|
+
getOffsetSizeCache: import("memoize-one").MemoizedFn<(this: any, i?: any, _flag?: any) => number>;
|
|
20
24
|
getSizeCount(offset?: number): number;
|
|
21
25
|
getStartIndex(scrollOffset?: number): number;
|
|
22
26
|
getStopIndex(wrapperSize?: number, scrollOffset?: number, startIndex?: number): number;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { isFunction } from '@tarojs/shared';
|
|
2
|
+
import memoizeOne from 'memoize-one';
|
|
3
|
+
import '../../utils/index.js';
|
|
2
4
|
import { isHorizontalFunc } from './utils.js';
|
|
5
|
+
import { getOffsetForIndexAndAlignment } from '../../utils/helper.js';
|
|
3
6
|
|
|
4
7
|
class ListSet {
|
|
5
8
|
constructor(props, refresh) {
|
|
@@ -7,6 +10,12 @@ class ListSet {
|
|
|
7
10
|
this.refresh = refresh;
|
|
8
11
|
this.list = [];
|
|
9
12
|
this.defaultSize = 1;
|
|
13
|
+
this.wrapperHeight = 0;
|
|
14
|
+
this.wrapperWidth = 0;
|
|
15
|
+
this.refreshCounter = 0;
|
|
16
|
+
this.getOffsetSizeCache = memoizeOne((i = this.list.length, _flag = this.refreshCounter) => {
|
|
17
|
+
return this.getOffsetSize(i);
|
|
18
|
+
});
|
|
10
19
|
this.update(props);
|
|
11
20
|
// Note: 不考虑列表模式切换情况,可能会导致列表抖动体验过差
|
|
12
21
|
if (this.props.unlimitedSize) {
|
|
@@ -39,13 +48,7 @@ class ListSet {
|
|
|
39
48
|
return this.props.overscanCount || 0;
|
|
40
49
|
}
|
|
41
50
|
get wrapperSize() {
|
|
42
|
-
|
|
43
|
-
const isHorizontal = isHorizontalFunc(this.props);
|
|
44
|
-
const size = (isHorizontal ? width : height);
|
|
45
|
-
if (process.env.NODE_ENV !== 'production' && typeof size !== 'number') {
|
|
46
|
-
console.warn(`In mode ${isHorizontal ? 'horizontal, width' : 'vertical, height'} parameter should be a number, but got ${typeof size}.`);
|
|
47
|
-
}
|
|
48
|
-
return size;
|
|
51
|
+
return isHorizontalFunc(this.props) ? this.wrapperWidth : this.wrapperHeight;
|
|
49
52
|
}
|
|
50
53
|
update(props) {
|
|
51
54
|
this.props = props;
|
|
@@ -61,6 +64,7 @@ class ListSet {
|
|
|
61
64
|
var _a;
|
|
62
65
|
this.list[i] = size;
|
|
63
66
|
(_a = this.refresh) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
67
|
+
this.refreshCounter++;
|
|
64
68
|
}
|
|
65
69
|
getSize(i = 0) {
|
|
66
70
|
const size = this.props.itemSize;
|
|
@@ -80,9 +84,8 @@ class ListSet {
|
|
|
80
84
|
return this.list.slice(0, i).reduce((sum, _, idx) => sum + this.getSize(idx), 0);
|
|
81
85
|
}
|
|
82
86
|
getSizeCount(offset = 0) {
|
|
83
|
-
if (offset === 0)
|
|
87
|
+
if (offset === 0)
|
|
84
88
|
return 0;
|
|
85
|
-
}
|
|
86
89
|
// if (this.isNormalMode) {
|
|
87
90
|
// return Math.min(this.length - 1, Math.floor(offset / this.length))
|
|
88
91
|
// }
|
|
@@ -100,7 +103,7 @@ class ListSet {
|
|
|
100
103
|
return Math.max(0, this.getSizeCount(scrollOffset) - 1);
|
|
101
104
|
}
|
|
102
105
|
getStopIndex(wrapperSize = 0, scrollOffset = 0, startIndex = 0) {
|
|
103
|
-
// const visibleOffset = this.
|
|
106
|
+
// const visibleOffset = this.getOffsetSizeCache(startIndex)
|
|
104
107
|
// if (this.isNormalMode) {
|
|
105
108
|
// const numVisibleItems = Math.ceil((wrapperSize + scrollOffset - visibleOffset) / this.length)
|
|
106
109
|
// /** -1 is because stop index is inclusive */
|
|
@@ -112,9 +115,8 @@ class ListSet {
|
|
|
112
115
|
if (this.length === 0) {
|
|
113
116
|
return [0, 0, 0, 0];
|
|
114
117
|
}
|
|
115
|
-
const wrapperSize = this.wrapperSize;
|
|
116
118
|
const startIndex = this.getStartIndex(scrollOffset);
|
|
117
|
-
const stopIndex = this.getStopIndex(wrapperSize, scrollOffset, startIndex);
|
|
119
|
+
const stopIndex = this.getStopIndex(this.wrapperSize, scrollOffset, startIndex);
|
|
118
120
|
// Overscan by one item in each direction so that tab/focus works. If there isn't at least one extra item, tab loops back around.
|
|
119
121
|
const overscanBackward = !block || direction === 'backward' ? Math.max(1, this.overscan) : 1;
|
|
120
122
|
const overscanForward = !block || direction === 'forward' ? Math.max(1, this.overscan) : 1;
|
|
@@ -126,53 +128,16 @@ class ListSet {
|
|
|
126
128
|
];
|
|
127
129
|
}
|
|
128
130
|
getOffsetForIndexAndAlignment(index, align, scrollOffset) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
align = 'center';
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
switch (align) {
|
|
143
|
-
case 'start':
|
|
144
|
-
return maxOffset;
|
|
145
|
-
case 'end':
|
|
146
|
-
return minOffset;
|
|
147
|
-
case 'center':
|
|
148
|
-
{
|
|
149
|
-
// "Centered" offset is usually the average of the min and max.
|
|
150
|
-
// But near the edges of the list, this doesn't hold true.
|
|
151
|
-
const middleOffset = Math.round(minOffset + (maxOffset - minOffset) / 2);
|
|
152
|
-
if (middleOffset < Math.ceil(wrapperSize / 2)) {
|
|
153
|
-
return 0; // near the beginning
|
|
154
|
-
}
|
|
155
|
-
else if (middleOffset > lastItemOffset + Math.floor(wrapperSize / 2)) {
|
|
156
|
-
return lastItemOffset; // near the end
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
return middleOffset;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
case 'auto':
|
|
163
|
-
default:
|
|
164
|
-
if (scrollOffset >= minOffset && scrollOffset <= maxOffset) {
|
|
165
|
-
return scrollOffset;
|
|
166
|
-
}
|
|
167
|
-
else if (scrollOffset < minOffset) {
|
|
168
|
-
return minOffset;
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
return maxOffset;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
compareSize(i = 0, size = 0) {
|
|
131
|
+
return getOffsetForIndexAndAlignment({
|
|
132
|
+
align,
|
|
133
|
+
containerSize: this.wrapperSize,
|
|
134
|
+
currentOffset: scrollOffset,
|
|
135
|
+
scrollSize: this.getOffsetSizeCache(this.length),
|
|
136
|
+
slideSize: this.getSize(index),
|
|
137
|
+
targetOffset: this.getOffsetSizeCache(index),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
compareSize(i = 0, size = this.defaultSize) {
|
|
176
141
|
if (this.isNormalMode)
|
|
177
142
|
return true;
|
|
178
143
|
return this.getSize(i) === size;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-set.js","sources":["../../../src/components/virtual-list/list-set.ts"],"sourcesContent":["import { isFunction } from '@tarojs/shared'\n\nimport { isHorizontalFunc } from './utils'\n\nimport type { IProps } from './preset'\n\ntype TProps = Pick<IProps, 'width' | 'height' | 'unlimitedSize' | 'itemCount' | 'itemData' | 'itemSize' | 'overscanCount' | 'direction' | 'layout'>\n\nexport default class ListSet {\n list: number[] = []\n mode?: 'normal' | 'function' | 'unlimited'\n defaultSize = 1\n\n constructor (protected props: TProps, protected refresh?: TFunc) {\n this.update(props)\n\n // Note: 不考虑列表模式切换情况,可能会导致列表抖动体验过差\n if (this.props.unlimitedSize) {\n this.mode = 'unlimited'\n } else if (isFunction(this.props.itemSize)) {\n this.mode = 'function'\n } else {\n this.mode = 'normal'\n }\n\n this.defaultSize = (isFunction(this.props.itemSize) ? this.props.itemSize() : this.props.itemSize) || 1\n\n if (!this.isNormalMode) {\n this.list = new Array(this.length).fill(-1)\n }\n }\n\n get isNormalMode () {\n return this.mode === 'normal'\n }\n\n get isFunctionMode () {\n return this.mode === 'function'\n }\n\n get isUnlimitedMode () {\n return this.mode === 'unlimited'\n }\n\n get length () {\n return this.props.itemCount || 100\n }\n\n get overscan () {\n return this.props.overscanCount || 0\n }\n\n get wrapperSize () {\n const { height, width } = this.props\n const isHorizontal = isHorizontalFunc(this.props)\n const size = (isHorizontal ? width : height) as number\n if (process.env.NODE_ENV !== 'production' && typeof size !== 'number') {\n console.warn(`In mode ${isHorizontal ? 'horizontal, width' : 'vertical, height'} parameter should be a number, but got ${typeof size}.`)\n }\n return size\n }\n\n update (props: TProps) {\n this.props = props\n\n if (this.length > this.list.length) {\n const arr = new Array(this.length - this.list.length).fill(-1)\n this.list.push(...arr)\n } else if (this.length < this.list.length) {\n this.list.length = this.length\n }\n }\n\n setSize (i = 0, size = this.defaultSize) {\n this.list[i] = size\n this.refresh?.()\n }\n\n getSize (i = 0) {\n const size = this.props.itemSize\n const item = this.list[i]\n if (item >= 0) return item\n\n if (this.isFunctionMode && isFunction(size)) {\n const itemSize = size(i, this.props.itemData)\n this.setSize(i, itemSize)\n return itemSize\n }\n return this.defaultSize\n }\n\n getOffsetSize (i = this.list.length) {\n if (this.isNormalMode) return i * this.defaultSize\n return this.list.slice(0, i).reduce((sum, _, idx) => sum + this.getSize(idx), 0)\n }\n\n getSizeCount (offset = 0) {\n if (offset === 0) {\n return 0\n }\n // if (this.isNormalMode) {\n // return Math.min(this.length - 1, Math.floor(offset / this.length))\n // }\n let offsetSize = 0\n const count = this.list.reduce((sum, _, idx) => {\n if (offsetSize < offset) {\n offsetSize += this.getSize(idx)\n return ++sum\n }\n return sum\n }, 0)\n return count - 1\n }\n\n getStartIndex (scrollOffset = 0) {\n return Math.max(0, this.getSizeCount(scrollOffset) - 1)\n }\n\n getStopIndex (wrapperSize = 0, scrollOffset = 0, startIndex = 0) {\n // const visibleOffset = this.getOffsetSize(startIndex)\n // if (this.isNormalMode) {\n // const numVisibleItems = Math.ceil((wrapperSize + scrollOffset - visibleOffset) / this.length)\n // /** -1 is because stop index is inclusive */\n // return Math.max(startIndex, Math.min(this.length - 1, startIndex + numVisibleItems - 1))\n // }\n return Math.max(startIndex, Math.min(this.length - 1, this.getSizeCount(wrapperSize + scrollOffset)))\n }\n\n getRangeToRender (direction: 'forward' | 'backward', scrollOffset = 0, block = false) {\n if (this.length === 0) {\n return [0, 0, 0, 0]\n }\n\n const wrapperSize = this.wrapperSize\n const startIndex = this.getStartIndex(scrollOffset)\n const stopIndex = this.getStopIndex(wrapperSize, scrollOffset, startIndex)\n\n // Overscan by one item in each direction so that tab/focus works. If there isn't at least one extra item, tab loops back around.\n const overscanBackward = !block || direction === 'backward' ? Math.max(1, this.overscan) : 1\n const overscanForward = !block || direction === 'forward' ? Math.max(1, this.overscan) : 1\n return [\n Math.max(0, startIndex - overscanBackward),\n Math.max(0, Math.min(this.length - 1, stopIndex + overscanForward)),\n startIndex,\n stopIndex\n ]\n }\n\n getOffsetForIndexAndAlignment (index: number, align: string, scrollOffset: number) {\n const wrapperSize = this.wrapperSize\n const itemSize = this.getSize(index)\n const lastItemOffset = Math.max(0, this.getOffsetSize(this.props.itemCount) - wrapperSize)\n const maxOffset = Math.min(lastItemOffset, this.getOffsetSize(index))\n const minOffset = Math.max(0, this.getOffsetSize(index) - wrapperSize + itemSize)\n\n if (align === 'smart') {\n if (scrollOffset >= minOffset - wrapperSize && scrollOffset <= maxOffset + wrapperSize) {\n align = 'auto'\n } else {\n align = 'center'\n }\n }\n\n switch (align) {\n case 'start':\n return maxOffset\n\n case 'end':\n return minOffset\n\n case 'center':\n {\n // \"Centered\" offset is usually the average of the min and max.\n // But near the edges of the list, this doesn't hold true.\n const middleOffset = Math.round(minOffset + (maxOffset - minOffset) / 2)\n\n if (middleOffset < Math.ceil(wrapperSize / 2)) {\n return 0 // near the beginning\n } else if (middleOffset > lastItemOffset + Math.floor(wrapperSize / 2)) {\n return lastItemOffset // near the end\n } else {\n return middleOffset\n }\n }\n\n case 'auto':\n default:\n if (scrollOffset >= minOffset && scrollOffset <= maxOffset) {\n return scrollOffset\n } else if (scrollOffset < minOffset) {\n return minOffset\n } else {\n return maxOffset\n }\n }\n }\n\n compareSize (i = 0, size = 0) {\n if (this.isNormalMode) return true\n return this.getSize(i) === size\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"list-set.js","sources":["../../../src/components/virtual-list/list-set.ts"],"sourcesContent":["import { isFunction } from '@tarojs/shared'\nimport memoizeOne from 'memoize-one'\n\nimport { getOffsetForIndexAndAlignment } from '../../utils'\nimport { isHorizontalFunc } from './utils'\n\nimport type { IProps } from './preset'\n\ntype TProps = Pick<IProps, 'width' | 'height' | 'unlimitedSize' | 'itemCount' | 'itemData' | 'itemSize' | 'overscanCount' | 'direction' | 'layout'>\n\nexport default class ListSet {\n list: number[] = []\n mode?: 'normal' | 'function' | 'unlimited'\n defaultSize = 1\n\n wrapperHeight = 0\n wrapperWidth = 0\n\n refreshCounter = 0\n\n constructor (protected props: TProps, protected refresh?: TFunc) {\n this.update(props)\n\n // Note: 不考虑列表模式切换情况,可能会导致列表抖动体验过差\n if (this.props.unlimitedSize) {\n this.mode = 'unlimited'\n } else if (isFunction(this.props.itemSize)) {\n this.mode = 'function'\n } else {\n this.mode = 'normal'\n }\n\n this.defaultSize = (isFunction(this.props.itemSize) ? this.props.itemSize() : this.props.itemSize) || 1\n\n if (!this.isNormalMode) {\n this.list = new Array(this.length).fill(-1)\n }\n }\n\n get isNormalMode () {\n return this.mode === 'normal'\n }\n\n get isFunctionMode () {\n return this.mode === 'function'\n }\n\n get isUnlimitedMode () {\n return this.mode === 'unlimited'\n }\n\n get length () {\n return this.props.itemCount || 100\n }\n\n get overscan () {\n return this.props.overscanCount || 0\n }\n\n get wrapperSize () {\n return isHorizontalFunc(this.props) ? this.wrapperWidth : this.wrapperHeight\n }\n\n update (props: TProps) {\n this.props = props\n\n if (this.length > this.list.length) {\n const arr = new Array(this.length - this.list.length).fill(-1)\n this.list.push(...arr)\n } else if (this.length < this.list.length) {\n this.list.length = this.length\n }\n }\n\n setSize (i = 0, size = this.defaultSize) {\n this.list[i] = size\n this.refresh?.()\n this.refreshCounter++\n }\n\n getSize (i = 0) {\n const size = this.props.itemSize\n const item = this.list[i]\n if (item >= 0) return item\n\n if (this.isFunctionMode && isFunction(size)) {\n const itemSize = size(i, this.props.itemData)\n this.setSize(i, itemSize)\n return itemSize\n }\n return this.defaultSize\n }\n\n getOffsetSize (i = this.list.length) {\n if (this.isNormalMode) return i * this.defaultSize\n return this.list.slice(0, i).reduce((sum, _, idx) => sum + this.getSize(idx), 0)\n }\n\n getOffsetSizeCache = memoizeOne((i = this.list.length, _flag = this.refreshCounter) => {\n return this.getOffsetSize(i)\n })\n\n getSizeCount (offset = 0) {\n if (offset === 0) return 0\n // if (this.isNormalMode) {\n // return Math.min(this.length - 1, Math.floor(offset / this.length))\n // }\n let offsetSize = 0\n const count = this.list.reduce((sum, _, idx) => {\n if (offsetSize < offset) {\n offsetSize += this.getSize(idx)\n return ++sum\n }\n return sum\n }, 0)\n return count - 1\n }\n\n getStartIndex (scrollOffset = 0) {\n return Math.max(0, this.getSizeCount(scrollOffset) - 1)\n }\n\n getStopIndex (wrapperSize = 0, scrollOffset = 0, startIndex = 0) {\n // const visibleOffset = this.getOffsetSizeCache(startIndex)\n // if (this.isNormalMode) {\n // const numVisibleItems = Math.ceil((wrapperSize + scrollOffset - visibleOffset) / this.length)\n // /** -1 is because stop index is inclusive */\n // return Math.max(startIndex, Math.min(this.length - 1, startIndex + numVisibleItems - 1))\n // }\n return Math.max(startIndex, Math.min(this.length - 1, this.getSizeCount(wrapperSize + scrollOffset)))\n }\n\n getRangeToRender (direction: 'forward' | 'backward', scrollOffset = 0, block = false) {\n if (this.length === 0) {\n return [0, 0, 0, 0]\n }\n\n const startIndex = this.getStartIndex(scrollOffset)\n const stopIndex = this.getStopIndex(this.wrapperSize, scrollOffset, startIndex)\n\n // Overscan by one item in each direction so that tab/focus works. If there isn't at least one extra item, tab loops back around.\n const overscanBackward = !block || direction === 'backward' ? Math.max(1, this.overscan) : 1\n const overscanForward = !block || direction === 'forward' ? Math.max(1, this.overscan) : 1\n return [\n Math.max(0, startIndex - overscanBackward),\n Math.max(0, Math.min(this.length - 1, stopIndex + overscanForward)),\n startIndex,\n stopIndex\n ]\n }\n\n getOffsetForIndexAndAlignment (index: number, align: string, scrollOffset: number) {\n return getOffsetForIndexAndAlignment({\n align,\n containerSize: this.wrapperSize,\n currentOffset: scrollOffset,\n scrollSize: this.getOffsetSizeCache(this.length),\n slideSize: this.getSize(index),\n targetOffset: this.getOffsetSizeCache(index),\n })\n }\n\n compareSize (i = 0, size = this.defaultSize) {\n if (this.isNormalMode) return true\n return this.getSize(i) === size\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { IntersectionObserver } from '@tarojs/taro';
|
|
2
|
+
import * as CSS from 'csstype';
|
|
3
|
+
import { defaultItemKey } from "../../utils/index.js";
|
|
1
4
|
import ListSet from "./list-set.js";
|
|
2
|
-
import { defaultItemKey } from "./utils.js";
|
|
3
5
|
import { VirtualListProps } from "./index.js";
|
|
4
6
|
interface IProps extends Partial<VirtualListProps> {
|
|
5
7
|
children?: VirtualListProps['item'];
|
|
@@ -8,17 +10,18 @@ interface IProps extends Partial<VirtualListProps> {
|
|
|
8
10
|
itemTagName?: string;
|
|
9
11
|
innerTagName?: string;
|
|
10
12
|
outerTagName?: string;
|
|
11
|
-
itemElementType?: React.ComponentType | string;
|
|
12
|
-
outerElementType?: React.ComponentType | string;
|
|
13
13
|
innerRef?: React.Ref<HTMLElement> | string;
|
|
14
14
|
outerRef?: React.Ref<HTMLElement> | string;
|
|
15
15
|
onItemsRendered?: TFunc;
|
|
16
16
|
shouldResetStyleCacheOnItemSizeChange?: boolean;
|
|
17
|
+
outerWrapper?: React.FC;
|
|
17
18
|
}
|
|
18
19
|
declare class Preset {
|
|
19
20
|
protected props: IProps;
|
|
20
21
|
protected refresh?: TFunc;
|
|
21
22
|
itemList: ListSet;
|
|
23
|
+
_id: string;
|
|
24
|
+
_observer: Record<string, IntersectionObserver>;
|
|
22
25
|
constructor(props: IProps, refresh?: TFunc);
|
|
23
26
|
wrapperField: {
|
|
24
27
|
scrollLeft: number;
|
|
@@ -32,18 +35,30 @@ declare class Preset {
|
|
|
32
35
|
diffList: number[];
|
|
33
36
|
init(props: IProps): void;
|
|
34
37
|
update(props: IProps): void;
|
|
38
|
+
updateWrapper(id: string): Promise<void>;
|
|
39
|
+
set id(id: string);
|
|
35
40
|
get id(): string;
|
|
36
41
|
get isHorizontal(): boolean;
|
|
37
42
|
get isRtl(): boolean;
|
|
38
43
|
get isRelative(): boolean;
|
|
44
|
+
get isBrick(): boolean;
|
|
39
45
|
get placeholderCount(): number;
|
|
40
|
-
get
|
|
41
|
-
get
|
|
42
|
-
get
|
|
46
|
+
get outerElement(): string | import("react").ComponentType<{}>;
|
|
47
|
+
get innerElement(): string | import("react").ComponentType<{}>;
|
|
48
|
+
get itemElement(): string | import("react").ComponentType<{}>;
|
|
43
49
|
get field(): Record<string, number>;
|
|
44
50
|
set field(o: Record<string, number>);
|
|
51
|
+
get enhanced(): true;
|
|
45
52
|
isShaking(diff?: number): boolean;
|
|
46
|
-
|
|
47
|
-
|
|
53
|
+
resetCache(): void;
|
|
54
|
+
getItemStyleCache: import("memoize-one").MemoizedFn<(this: any, itemIndex?: number, itemSize?: IProps['itemSize'] | false, _flag?: any) => CSS.Properties<string | number, string & {}>>;
|
|
55
|
+
getItemStyle(index: number): CSS.Properties<string | number, string & {}>;
|
|
56
|
+
boundaryDetection(): void;
|
|
57
|
+
boundaryDetectionHelper({ component, event, id, }: {
|
|
58
|
+
component?: TaroGeneral.IAnyObject;
|
|
59
|
+
event?: () => void;
|
|
60
|
+
id: string;
|
|
61
|
+
}): IntersectionObserver;
|
|
62
|
+
dispose(): void;
|
|
48
63
|
}
|
|
49
64
|
export { IProps, Preset as default };
|