@tarojs/components-advanced 4.0.13-alpha.0 → 4.0.13
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 +4 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/water-flow/flow-item.d.ts +11 -0
- package/dist/components/water-flow/flow-item.js +70 -0
- package/dist/components/water-flow/flow-item.js.map +1 -0
- package/dist/components/water-flow/flow-section.d.ts +7 -0
- package/dist/components/water-flow/flow-section.js +66 -0
- package/dist/components/water-flow/flow-section.js.map +1 -0
- package/dist/components/water-flow/index.d.ts +4 -0
- package/dist/components/water-flow/index.js +4 -0
- package/dist/components/water-flow/index.js.map +1 -0
- package/dist/components/water-flow/interface.d.ts +54 -0
- package/dist/components/water-flow/node.d.ts +63 -0
- package/dist/components/water-flow/node.js +99 -0
- package/dist/components/water-flow/node.js.map +1 -0
- package/dist/components/water-flow/root.d.ts +144 -0
- package/dist/components/water-flow/root.js +395 -0
- package/dist/components/water-flow/root.js.map +1 -0
- package/dist/components/water-flow/section.d.ts +110 -0
- package/dist/components/water-flow/section.js +226 -0
- package/dist/components/water-flow/section.js.map +1 -0
- package/dist/components/water-flow/stateful-event-bus.d.ts +33 -0
- package/dist/components/water-flow/stateful-event-bus.js +70 -0
- package/dist/components/water-flow/stateful-event-bus.js.map +1 -0
- package/dist/components/water-flow/use-memoized-fn.d.ts +4 -0
- package/dist/components/water-flow/use-memoized-fn.js +16 -0
- package/dist/components/water-flow/use-memoized-fn.js.map +1 -0
- package/dist/components/water-flow/use-observed-attr.d.ts +2 -0
- package/dist/components/water-flow/use-observed-attr.js +20 -0
- package/dist/components/water-flow/use-observed-attr.js.map +1 -0
- package/dist/components/water-flow/use-unmount.d.ts +1 -0
- package/dist/components/water-flow/utils.d.ts +31 -0
- package/dist/components/water-flow/utils.js +45 -0
- package/dist/components/water-flow/utils.js.map +1 -0
- package/dist/components/water-flow/water-flow.d.ts +4 -0
- package/dist/components/water-flow/water-flow.js +146 -0
- package/dist/components/water-flow/water-flow.js.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import '../../utils/index.js';
|
|
2
|
+
import { Node } from './node.js';
|
|
3
|
+
import { RootEvents } from './root.js';
|
|
4
|
+
import { StatefulEventBus } from './stateful-event-bus.js';
|
|
5
|
+
import { createImperativePromise, getMatrixPosition, isSameRenderRange } from './utils.js';
|
|
6
|
+
import { debounce } from '../../utils/lodash.js';
|
|
7
|
+
|
|
8
|
+
const SectionEvents = {
|
|
9
|
+
AllNodesLayouted: Symbol.for('AllNodesLayouted'),
|
|
10
|
+
Resize: Symbol.for('Resize'),
|
|
11
|
+
};
|
|
12
|
+
class Section extends StatefulEventBus {
|
|
13
|
+
constructor(root, props) {
|
|
14
|
+
const { id, col, order, count, rowGap, columnGap } = props;
|
|
15
|
+
super({
|
|
16
|
+
layouted: false,
|
|
17
|
+
scrollTop: 0,
|
|
18
|
+
height: 0,
|
|
19
|
+
renderRange: Array.from({ length: col }, () => [0, 0]),
|
|
20
|
+
});
|
|
21
|
+
this.root = root;
|
|
22
|
+
this.nodes = new Map();
|
|
23
|
+
this.defaultSize = 200;
|
|
24
|
+
this.count = 0;
|
|
25
|
+
this.rowGap = 0;
|
|
26
|
+
this.columnGap = 0;
|
|
27
|
+
this.layoutedSignal = createImperativePromise();
|
|
28
|
+
Object.assign(this, {
|
|
29
|
+
id,
|
|
30
|
+
col,
|
|
31
|
+
count,
|
|
32
|
+
order,
|
|
33
|
+
rowGap,
|
|
34
|
+
columnGap,
|
|
35
|
+
columnMap: Array.from({ length: col }, () => []),
|
|
36
|
+
});
|
|
37
|
+
this.initializeColumnMap();
|
|
38
|
+
root.registerSection(this);
|
|
39
|
+
this.setupSubscriptions();
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 订阅事件
|
|
43
|
+
*/
|
|
44
|
+
setupSubscriptions() {
|
|
45
|
+
// 分组的所有节点完成初次布局计算,Nodes的实际高度已经拿到,那么这时分组的高度是确定的,距离滚动容器的顶部距离也是确定的,可以开始计算
|
|
46
|
+
this.sub(SectionEvents.AllNodesLayouted, () => {
|
|
47
|
+
this.setStateBatch({
|
|
48
|
+
scrollTop: this.calcScrollTop(),
|
|
49
|
+
height: this.maxColumnHeight,
|
|
50
|
+
});
|
|
51
|
+
this.updateNodes();
|
|
52
|
+
this.setStateIn('renderRange', this.getNodeRenderRange());
|
|
53
|
+
this.setStateIn('layouted', true);
|
|
54
|
+
this.layoutedSignal.resolve();
|
|
55
|
+
if (this.root.sections.every((section) => section.getState().layouted)) {
|
|
56
|
+
this.root.pub(RootEvents.AllSectionsLayouted);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
// 滚动过程中,如果分组自身可见,那么需要计算分组内应该渲染的元素节点索引区间
|
|
60
|
+
this.root.sub('scrollOffset', () => {
|
|
61
|
+
if (this.isInRange) {
|
|
62
|
+
this.setStateIn('renderRange', this.getNodeRenderRange());
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* 对应分组内的节点尺寸发生变化,需要重新进行相关计算
|
|
67
|
+
* 1. 重新计算尺寸发生变化的节点所在列的所有节点位置信息
|
|
68
|
+
* 2. 重新计算分组的高度
|
|
69
|
+
* 3. 重新计算当前分组之后的所有分组的scrollTop以及分组内的节点位置
|
|
70
|
+
* 4. 更新分组内节点的渲染范围
|
|
71
|
+
*/
|
|
72
|
+
this.sub(SectionEvents.Resize, debounce(() => {
|
|
73
|
+
this.setStateIn('height', this.maxColumnHeight);
|
|
74
|
+
this.updateBehindSectionsPosition();
|
|
75
|
+
if (this.isInRange) {
|
|
76
|
+
this.setStateIn('renderRange', this.getNodeRenderRange());
|
|
77
|
+
}
|
|
78
|
+
this.root.pub(RootEvents.Resize);
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 获取当前分组的最大高度,分组的最大高度由分组最高列决定
|
|
83
|
+
* @returns 当前分组的最大高度
|
|
84
|
+
*/
|
|
85
|
+
get maxColumnHeight() {
|
|
86
|
+
return Math.max(...this.columnMap.map((column) => column.reduce((buf, node) => buf + node.getState().height, 0) + (column.length - 1) * this.rowGap));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 当前分组是否在可视区域
|
|
90
|
+
*
|
|
91
|
+
* 滚动偏移为 scrollOffset,容器的高度为 containerSize.height
|
|
92
|
+
*
|
|
93
|
+
* 当前容器滚动上边界(scrollBoundaryStart)为 scrollOffset,容器滚动的下边界(scrollBoundaryEnd)为 scrollOffset + containerSize.height
|
|
94
|
+
*
|
|
95
|
+
* 如果分组的 scrollTop 小于滚动下边界并且 scrollTop + 分组高度大于滚动上边界,那么分组在可视区域
|
|
96
|
+
*/
|
|
97
|
+
get isInRange() {
|
|
98
|
+
const { scrollBoundaryStart, scrollBoundaryEnd } = this.root;
|
|
99
|
+
const { height: sectionHeight, scrollTop: sectionScrollTop } = this.getState();
|
|
100
|
+
return (sectionScrollTop < scrollBoundaryEnd &&
|
|
101
|
+
sectionScrollTop + sectionHeight > scrollBoundaryStart);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 注册节点
|
|
105
|
+
*/
|
|
106
|
+
register(node) {
|
|
107
|
+
const { col, order } = node;
|
|
108
|
+
this.columnMap[col][order] = node;
|
|
109
|
+
this.nodes.set(node.id, node);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 初始化分组内的列,即将一维数组转二维数组
|
|
113
|
+
*/
|
|
114
|
+
initializeColumnMap() {
|
|
115
|
+
const { count, col } = this;
|
|
116
|
+
for (let i = 0; i < count; i++) {
|
|
117
|
+
const { row: rowIndex, col: columnIndex } = getMatrixPosition(i, col);
|
|
118
|
+
const node = new Node(this.root, this, {
|
|
119
|
+
childIndex: i,
|
|
120
|
+
order: rowIndex,
|
|
121
|
+
col: columnIndex,
|
|
122
|
+
height: this.defaultSize,
|
|
123
|
+
});
|
|
124
|
+
this.register(node);
|
|
125
|
+
this.root.registerNode(node);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 更新当前分组之后的分组的位置信息
|
|
130
|
+
*/
|
|
131
|
+
updateBehindSectionsPosition() {
|
|
132
|
+
let start = this.order + 1;
|
|
133
|
+
if (start > this.root.sections.length) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
for (; start < this.root.sections.length; start++) {
|
|
137
|
+
const currentSection = this.root.sections[start - 1];
|
|
138
|
+
const nextSection = this.root.sections[start];
|
|
139
|
+
nextSection.setStateIn('scrollTop', currentSection.getState().scrollTop + currentSection.getState().height + this.rowGap);
|
|
140
|
+
nextSection.updateNodes();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 更新指定列的节点位置信息
|
|
145
|
+
* @param col 列索引
|
|
146
|
+
*/
|
|
147
|
+
updateColumnNode(col) {
|
|
148
|
+
const column = this.columnMap[col];
|
|
149
|
+
const { scrollTop: sectionScrollTop } = this.getState();
|
|
150
|
+
for (let i = 0; i < column.length; i++) {
|
|
151
|
+
const node = column[i];
|
|
152
|
+
if (i === 0) {
|
|
153
|
+
node.setStateBatch({
|
|
154
|
+
scrollTop: sectionScrollTop,
|
|
155
|
+
top: 0,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
const prevNode = column[i - 1];
|
|
160
|
+
const { scrollTop: prevNodeScrollTop, height: prevNodeHeight, top: prevNodeTop, } = prevNode.getState();
|
|
161
|
+
node.setStateBatch({
|
|
162
|
+
scrollTop: prevNodeScrollTop + prevNodeHeight + this.rowGap,
|
|
163
|
+
top: prevNodeHeight + prevNodeTop + this.rowGap,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* 更新每列节点的位置
|
|
170
|
+
*/
|
|
171
|
+
updateNodes() {
|
|
172
|
+
for (let col = 0; col < this.columnMap.length; col++) {
|
|
173
|
+
this.updateColumnNode(col);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 计算当前分组的 scrollTop,即该分组之前的所有分组的最大列高度之和
|
|
178
|
+
*/
|
|
179
|
+
calcScrollTop() {
|
|
180
|
+
return this.root.sections
|
|
181
|
+
.slice(0, this.order)
|
|
182
|
+
.reduce((acc, section) => acc + section.maxColumnHeight, 0);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 计算当前分组内每列应该渲染的节点索引区间
|
|
186
|
+
*/
|
|
187
|
+
getNodeRenderRange() {
|
|
188
|
+
if (!this.isInRange) {
|
|
189
|
+
return Array.from({ length: this.col }, () => [0, -1]);
|
|
190
|
+
}
|
|
191
|
+
const result = Array.from({ length: this.col }, () => [Infinity, -Infinity]);
|
|
192
|
+
for (let i = 0; i < this.columnMap.length; i++) {
|
|
193
|
+
const column = this.columnMap[i];
|
|
194
|
+
for (let j = 0; j < column.length; j++) {
|
|
195
|
+
const node = column[j];
|
|
196
|
+
if (node.isInRange) {
|
|
197
|
+
result[i][0] = Math.min(result[i][0], j);
|
|
198
|
+
result[i][1] = Math.max(result[i][1], j);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const start = result[i][0];
|
|
202
|
+
const end = result[i][1];
|
|
203
|
+
if (start === Infinity) {
|
|
204
|
+
result[i][0] = 0;
|
|
205
|
+
}
|
|
206
|
+
if (end === -Infinity) {
|
|
207
|
+
result[i][1] = -1;
|
|
208
|
+
}
|
|
209
|
+
const cacheCount = this.root.cacheCount;
|
|
210
|
+
const scrollDirection = this.root.getState().scrollDirection;
|
|
211
|
+
const backwardDistance = scrollDirection === 'backward' ? cacheCount : 0;
|
|
212
|
+
const forwardDistance = scrollDirection === 'forward' ? cacheCount : 0;
|
|
213
|
+
const overscanBackward = result[i][0] - backwardDistance;
|
|
214
|
+
const overscanForward = result[i][1] + forwardDistance;
|
|
215
|
+
result[i][0] = overscanBackward < 0 ? 0 : overscanBackward;
|
|
216
|
+
result[i][1] =
|
|
217
|
+
overscanForward > column.length ? column.length - 1 : overscanForward;
|
|
218
|
+
}
|
|
219
|
+
return isSameRenderRange(result, this.getState().renderRange)
|
|
220
|
+
? this.getState().renderRange
|
|
221
|
+
: result;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export { Section, SectionEvents };
|
|
226
|
+
//# sourceMappingURL=section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section.js","sources":["../../../src/components/water-flow/section.ts"],"sourcesContent":["import { debounce } from '../../utils'\nimport { Size } from './interface'\nimport { Node } from './node'\nimport { Root, RootEvents } from './root'\nimport { StatefulEventBus } from './stateful-event-bus'\nimport {\n createImperativePromise,\n getMatrixPosition,\n isSameRenderRange,\n} from './utils'\n\nexport interface SectionProps {\n /** 分组的唯一标识 */\n id: string\n /** 分组的列数 */\n col: number\n /** 分组的顺序 */\n order: number\n /** 节点数量 */\n count: number\n /** 该分组的行间距 */\n rowGap: number\n /** 该分组的列间距 */\n columnGap: number\n}\n\n/**\n * 分组状态\n */\ntype SectionState = {\n /**\n * 分组是否已经布局计算\n */\n layouted: boolean\n /**\n * 分组顶部距离容器顶部的距离\n */\n scrollTop: number\n /**\n * 分组的高度\n */\n height: number\n /**\n * 每个列的渲染范围\n * 每个元素为一个二元组,第一个元素为起始索引,第二个元素为结束索引\n */\n renderRange: [number, number][]\n};\n\nexport const SectionEvents = {\n AllNodesLayouted: Symbol.for('AllNodesLayouted'),\n Resize: Symbol.for('Resize'),\n}\n\nexport class Section extends StatefulEventBus<SectionState> {\n id: string\n order: number\n col: number\n columnMap: Node[][]\n nodes: Map<string, Node> = new Map()\n defaultSize = 200\n count = 0\n rowGap = 0\n columnGap = 0\n layoutedSignal = createImperativePromise()\n\n constructor(public root: Root, props: SectionProps) {\n const { id, col, order, count, rowGap, columnGap } = props\n super({\n layouted: false,\n scrollTop: 0,\n height: 0,\n renderRange: Array.from({ length: col }, () => [0, 0]),\n })\n Object.assign(this, {\n id,\n col,\n count,\n order,\n rowGap,\n columnGap,\n columnMap: Array.from({ length: col }, () => []),\n })\n this.initializeColumnMap()\n root.registerSection(this)\n this.setupSubscriptions()\n }\n\n /**\n * 订阅事件\n */\n private setupSubscriptions() {\n // 分组的所有节点完成初次布局计算,Nodes的实际高度已经拿到,那么这时分组的高度是确定的,距离滚动容器的顶部距离也是确定的,可以开始计算\n this.sub(SectionEvents.AllNodesLayouted, () => {\n this.setStateBatch({\n scrollTop: this.calcScrollTop(),\n height: this.maxColumnHeight,\n })\n this.updateNodes()\n this.setStateIn('renderRange', this.getNodeRenderRange())\n this.setStateIn('layouted', true)\n this.layoutedSignal.resolve()\n if (this.root.sections.every((section) => section.getState().layouted)) {\n this.root.pub(RootEvents.AllSectionsLayouted)\n }\n })\n // 滚动过程中,如果分组自身可见,那么需要计算分组内应该渲染的元素节点索引区间\n this.root.sub('scrollOffset', () => {\n if (this.isInRange) {\n this.setStateIn('renderRange', this.getNodeRenderRange())\n }\n })\n\n /**\n * 对应分组内的节点尺寸发生变化,需要重新进行相关计算\n * 1. 重新计算尺寸发生变化的节点所在列的所有节点位置信息\n * 2. 重新计算分组的高度\n * 3. 重新计算当前分组之后的所有分组的scrollTop以及分组内的节点位置\n * 4. 更新分组内节点的渲染范围\n */\n this.sub<{ node: Node, newSize: Size, originalSize: Size }>(\n SectionEvents.Resize,\n debounce(() => {\n this.setStateIn('height', this.maxColumnHeight)\n this.updateBehindSectionsPosition()\n if (this.isInRange) {\n this.setStateIn('renderRange', this.getNodeRenderRange())\n }\n this.root.pub(RootEvents.Resize)\n })\n )\n }\n\n /**\n * 获取当前分组的最大高度,分组的最大高度由分组最高列决定\n * @returns 当前分组的最大高度\n */\n get maxColumnHeight() {\n return Math.max(\n ...this.columnMap.map((column) =>\n column.reduce((buf, node) => buf + node.getState().height, 0) + (column.length - 1) * this.rowGap\n )\n )\n }\n\n /**\n * 当前分组是否在可视区域\n *\n * 滚动偏移为 scrollOffset,容器的高度为 containerSize.height\n *\n * 当前容器滚动上边界(scrollBoundaryStart)为 scrollOffset,容器滚动的下边界(scrollBoundaryEnd)为 scrollOffset + containerSize.height\n *\n * 如果分组的 scrollTop 小于滚动下边界并且 scrollTop + 分组高度大于滚动上边界,那么分组在可视区域\n */\n get isInRange() {\n const { scrollBoundaryStart, scrollBoundaryEnd } = this.root\n const { height: sectionHeight, scrollTop: sectionScrollTop } =\n this.getState()\n return (\n sectionScrollTop < scrollBoundaryEnd &&\n sectionScrollTop + sectionHeight > scrollBoundaryStart\n )\n }\n\n /**\n * 注册节点\n */\n private register(node: Node) {\n const { col, order } = node\n this.columnMap[col][order] = node\n this.nodes.set(node.id, node)\n }\n\n /**\n * 初始化分组内的列,即将一维数组转二维数组\n */\n private initializeColumnMap() {\n const { count, col } = this\n for (let i = 0; i < count; i++) {\n const { row: rowIndex, col: columnIndex } = getMatrixPosition(i, col)\n const node = new Node(this.root, this, {\n childIndex: i,\n order: rowIndex,\n col: columnIndex,\n height: this.defaultSize,\n })\n this.register(node)\n this.root.registerNode(node)\n }\n }\n\n /**\n * 更新当前分组之后的分组的位置信息\n */\n private updateBehindSectionsPosition() {\n let start = this.order + 1\n if (start > this.root.sections.length) {\n return\n }\n for (; start < this.root.sections.length; start++) {\n const currentSection = this.root.sections[start - 1]\n const nextSection = this.root.sections[start]\n nextSection.setStateIn(\n 'scrollTop',\n currentSection.getState().scrollTop + currentSection.getState().height + this.rowGap\n )\n nextSection.updateNodes()\n }\n }\n\n /**\n * 更新指定列的节点位置信息\n * @param col 列索引\n */\n private updateColumnNode(col: number) {\n const column = this.columnMap[col]\n const { scrollTop: sectionScrollTop } = this.getState()\n for (let i = 0; i < column.length; i++) {\n const node = column[i]\n if (i === 0) {\n node.setStateBatch({\n scrollTop: sectionScrollTop,\n top: 0,\n })\n } else {\n const prevNode = column[i - 1]\n const {\n scrollTop: prevNodeScrollTop,\n height: prevNodeHeight,\n top: prevNodeTop,\n } = prevNode.getState()\n node.setStateBatch({\n scrollTop: prevNodeScrollTop + prevNodeHeight + this.rowGap,\n top: prevNodeHeight + prevNodeTop + this.rowGap,\n })\n }\n }\n }\n\n /**\n * 更新每列节点的位置\n */\n private updateNodes() {\n for (let col = 0; col < this.columnMap.length; col++) {\n this.updateColumnNode(col)\n }\n }\n\n /**\n * 计算当前分组的 scrollTop,即该分组之前的所有分组的最大列高度之和\n */\n private calcScrollTop() {\n return this.root.sections\n .slice(0, this.order)\n .reduce((acc, section) => acc + section.maxColumnHeight, 0)\n }\n\n /**\n * 计算当前分组内每列应该渲染的节点索引区间\n */\n public getNodeRenderRange() {\n if (!this.isInRange) {\n return Array.from(\n { length: this.col },\n () => [0, -1] as [number, number]\n )\n }\n\n const result = Array.from(\n { length: this.col },\n () => [Infinity, -Infinity] as unknown as [number, number]\n )\n for (let i = 0; i < this.columnMap.length; i++) {\n const column = this.columnMap[i]\n for (let j = 0; j < column.length; j++) {\n const node = column[j]\n if (node.isInRange) {\n result[i][0] = Math.min(result[i][0], j)\n result[i][1] = Math.max(result[i][1], j)\n }\n }\n const start = result[i][0]\n const end = result[i][1]\n if (start === Infinity) {\n result[i][0] = 0\n }\n if (end === -Infinity) {\n result[i][1] = -1\n }\n\n const cacheCount = this.root.cacheCount\n const scrollDirection = this.root.getState().scrollDirection\n const backwardDistance = scrollDirection === 'backward' ? cacheCount : 0\n const forwardDistance = scrollDirection === 'forward' ? cacheCount : 0\n const overscanBackward = result[i][0] - backwardDistance\n const overscanForward = result[i][1] + forwardDistance\n result[i][0] = overscanBackward < 0 ? 0 : overscanBackward\n result[i][1] =\n overscanForward > column.length ? column.length - 1 : overscanForward\n }\n\n return isSameRenderRange(result, this.getState().renderRange)\n ? this.getState().renderRange\n : result\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
type Event = string | number | symbol;
|
|
2
|
+
type Handler<T = unknown> = (ev: Event, payload: T) => void;
|
|
3
|
+
declare class EventBus<T extends Event> {
|
|
4
|
+
private eventsMap;
|
|
5
|
+
pub<P = undefined>(ev: T, payload?: P): void;
|
|
6
|
+
sub<P = unknown>(ev: T, subscribe: Handler<P>): () => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 继承自 EventBus 的有状态事件总线
|
|
10
|
+
* @template S 状态类型
|
|
11
|
+
* @template E 事件类型
|
|
12
|
+
*/
|
|
13
|
+
export declare class StatefulEventBus<S extends Record<string, any>, E extends Event = keyof S | symbol> extends EventBus<E | keyof S | symbol> {
|
|
14
|
+
/**
|
|
15
|
+
* 内部状态
|
|
16
|
+
*/
|
|
17
|
+
state: S;
|
|
18
|
+
/**
|
|
19
|
+
* 构造函数
|
|
20
|
+
* @param initialState 初始状态
|
|
21
|
+
*/
|
|
22
|
+
constructor(initialState: S);
|
|
23
|
+
/**
|
|
24
|
+
* 获取当前状态
|
|
25
|
+
* @returns 当前状态的副本
|
|
26
|
+
*/
|
|
27
|
+
getState(): S;
|
|
28
|
+
getStateIn<K extends keyof S>(p: K): S[K];
|
|
29
|
+
setStateIn(p: keyof S, v: any): void;
|
|
30
|
+
setStateBatch(s: Partial<S>): void;
|
|
31
|
+
notify(p: E): void;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
class EventBus {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.eventsMap = new Map();
|
|
4
|
+
}
|
|
5
|
+
pub(ev, payload) {
|
|
6
|
+
const set = this.eventsMap.get(ev);
|
|
7
|
+
if (set) {
|
|
8
|
+
for (const cb of set) {
|
|
9
|
+
cb(ev, payload);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
sub(ev, subscribe) {
|
|
14
|
+
let set = this.eventsMap.get(ev);
|
|
15
|
+
if (!set) {
|
|
16
|
+
set = new Set();
|
|
17
|
+
}
|
|
18
|
+
set.add(subscribe);
|
|
19
|
+
this.eventsMap.set(ev, set);
|
|
20
|
+
return () => {
|
|
21
|
+
set.delete(subscribe);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 继承自 EventBus 的有状态事件总线
|
|
27
|
+
* @template S 状态类型
|
|
28
|
+
* @template E 事件类型
|
|
29
|
+
*/
|
|
30
|
+
class StatefulEventBus extends EventBus {
|
|
31
|
+
/**
|
|
32
|
+
* 构造函数
|
|
33
|
+
* @param initialState 初始状态
|
|
34
|
+
*/
|
|
35
|
+
constructor(initialState) {
|
|
36
|
+
super();
|
|
37
|
+
this.state = Object.assign({}, initialState);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 获取当前状态
|
|
41
|
+
* @returns 当前状态的副本
|
|
42
|
+
*/
|
|
43
|
+
getState() {
|
|
44
|
+
return Object.assign({}, this.state);
|
|
45
|
+
}
|
|
46
|
+
getStateIn(p) {
|
|
47
|
+
return this.state[p];
|
|
48
|
+
}
|
|
49
|
+
setStateIn(p, v) {
|
|
50
|
+
this.state[p] = v;
|
|
51
|
+
this.pub(p);
|
|
52
|
+
}
|
|
53
|
+
setStateBatch(s) {
|
|
54
|
+
for (const key in s) {
|
|
55
|
+
if (Object.prototype.hasOwnProperty.call(s, key)) {
|
|
56
|
+
const rawValue = this.getState()[key];
|
|
57
|
+
const newValue = s[key];
|
|
58
|
+
if (!Object.is(rawValue, newValue)) {
|
|
59
|
+
this.setStateIn(key, newValue);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
notify(p) {
|
|
65
|
+
this.pub(p);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { StatefulEventBus };
|
|
70
|
+
//# sourceMappingURL=stateful-event-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateful-event-bus.js","sources":["../../../src/components/water-flow/stateful-event-bus.ts"],"sourcesContent":["type Event = string | number | symbol;\ntype Handler<T = unknown> = (ev: Event, payload: T) => void;\n\nclass EventBus<T extends Event> {\n private eventsMap: Map<T, Set<Handler>> = new Map()\n\n pub<P = undefined>(ev: T, payload?: P) {\n const set = this.eventsMap.get(ev)\n if (set) {\n for (const cb of set) {\n cb(ev, payload)\n }\n }\n }\n\n sub<P = unknown>(ev: T, subscribe: Handler<P>) {\n let set = this.eventsMap.get(ev)\n if (!set) {\n set = new Set()\n }\n set.add(subscribe)\n this.eventsMap.set(ev, set)\n return () => {\n set.delete(subscribe)\n }\n }\n}\n\n/**\n * 继承自 EventBus 的有状态事件总线\n * @template S 状态类型\n * @template E 事件类型\n */\nexport class StatefulEventBus<\n S extends Record<string, any>,\n E extends Event = keyof S | symbol\n> extends EventBus<E | keyof S | symbol> {\n /**\n * 内部状态\n */\n state: S\n\n /**\n * 构造函数\n * @param initialState 初始状态\n */\n constructor(initialState: S) {\n super()\n this.state = { ...initialState }\n }\n\n /**\n * 获取当前状态\n * @returns 当前状态的副本\n */\n getState(): S {\n return { ...this.state }\n }\n\n getStateIn<K extends keyof S>(p: K): S[K] {\n return this.state[p]\n }\n\n setStateIn(p: keyof S, v: any) {\n this.state[p] = v\n this.pub(p)\n }\n\n setStateBatch(s: Partial<S>) {\n for (const key in s) {\n if (Object.prototype.hasOwnProperty.call(s, key)) {\n const rawValue = this.getState()[key]\n const newValue = s[key]\n if (!Object.is(rawValue, newValue)) {\n this.setStateIn(key, newValue)\n }\n }\n }\n }\n\n notify(p: E) {\n this.pub(p)\n }\n}\n"],"names":[],"mappings":"AAGA,MAAM,QAAQ,CAAA;AAAd,IAAA,WAAA,GAAA;AACU,QAAA,IAAA,CAAA,SAAS,GAAyB,IAAI,GAAG,EAAE,CAAA;KAsBpD;IApBC,GAAG,CAAgB,EAAK,EAAE,OAAW,EAAA;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAClC,IAAI,GAAG,EAAE;AACP,YAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;AACpB,gBAAA,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;aAChB;SACF;KACF;IAED,GAAG,CAAc,EAAK,EAAE,SAAqB,EAAA;QAC3C,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAChC,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,GAAG,GAAG,IAAI,GAAG,EAAE,CAAA;SAChB;AACD,QAAA,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAClB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;AAC3B,QAAA,OAAO,MAAK;AACV,YAAA,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;AACvB,SAAC,CAAA;KACF;AACF,CAAA;AAED;;;;AAIG;AACG,MAAO,gBAGX,SAAQ,QAA8B,CAAA;AAMtC;;;AAGG;AACH,IAAA,WAAA,CAAY,YAAe,EAAA;AACzB,QAAA,KAAK,EAAE,CAAA;AACP,QAAA,IAAI,CAAC,KAAK,GAAQ,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,YAAY,CAAE,CAAA;KACjC;AAED;;;AAGG;IACH,QAAQ,GAAA;QACN,OAAY,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,IAAI,CAAC,KAAK,CAAE,CAAA;KACzB;AAED,IAAA,UAAU,CAAoB,CAAI,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;KACrB;IAED,UAAU,CAAC,CAAU,EAAE,CAAM,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AACjB,QAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;KACZ;AAED,IAAA,aAAa,CAAC,CAAa,EAAA;AACzB,QAAA,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE;AACnB,YAAA,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;gBAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAA;AACrC,gBAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;gBACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE;AAClC,oBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;iBAC/B;aACF;SACF;KACF;AAED,IAAA,MAAM,CAAC,CAAI,EAAA;AACT,QAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;KACZ;AACF;;;;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { useRef, useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
function useMemoizedFn(fn) {
|
|
4
|
+
const fnRef = useRef(fn);
|
|
5
|
+
fnRef.current = useMemo(() => fn, [fn]);
|
|
6
|
+
const memoizedFn = useRef();
|
|
7
|
+
if (!memoizedFn.current) {
|
|
8
|
+
memoizedFn.current = function (...args) {
|
|
9
|
+
return fnRef.current.apply(this, args);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
return memoizedFn.current;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export { useMemoizedFn };
|
|
16
|
+
//# sourceMappingURL=use-memoized-fn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-memoized-fn.js","sources":["../../../src/components/water-flow/use-memoized-fn.ts"],"sourcesContent":["import { useMemo, useRef } from 'react'\n\ntype Noop = (this: any, ...args: any[]) => void;\n\ntype MemoizedFn<T extends Noop> = (\n this: ThisParameterType<T>,\n ...args: Parameters<T>\n) => ReturnType<T>;\n\nexport function useMemoizedFn<T extends Noop>(fn: T) {\n const fnRef = useRef<T>(fn)\n fnRef.current = useMemo<T>(() => fn, [fn])\n const memoizedFn = useRef<MemoizedFn<T>>()\n\n if (!memoizedFn.current) {\n memoizedFn.current = function (this, ...args) {\n return fnRef.current.apply(this, args)\n }\n }\n\n return memoizedFn.current as MemoizedFn<T>\n}\n"],"names":[],"mappings":";;AASM,SAAU,aAAa,CAAiB,EAAK,EAAA;AACjD,IAAA,MAAM,KAAK,GAAG,MAAM,CAAI,EAAE,CAAC,CAAA;AAC3B,IAAA,KAAK,CAAC,OAAO,GAAG,OAAO,CAAI,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAC1C,IAAA,MAAM,UAAU,GAAG,MAAM,EAAiB,CAAA;AAE1C,IAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACvB,QAAA,UAAU,CAAC,OAAO,GAAG,UAAgB,GAAG,IAAI,EAAA;YAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AACxC,SAAC,CAAA;KACF;IAED,OAAO,UAAU,CAAC,OAAwB,CAAA;AAC5C;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useCallback, useSyncExternalStore } from 'react';
|
|
2
|
+
|
|
3
|
+
function useObservedAttr(inst, attr) {
|
|
4
|
+
const sub = useCallback((onStoreChange) => {
|
|
5
|
+
return inst.sub(attr, onStoreChange);
|
|
6
|
+
}, [inst, attr]);
|
|
7
|
+
const getSnapshot = useCallback(() => {
|
|
8
|
+
if ('getState' in inst && typeof inst.getState === 'function') {
|
|
9
|
+
const state = inst.getState();
|
|
10
|
+
if (state && attr in state) {
|
|
11
|
+
return state[attr];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return inst[attr];
|
|
15
|
+
}, [inst, attr]);
|
|
16
|
+
return useSyncExternalStore(sub, getSnapshot, getSnapshot);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { useObservedAttr };
|
|
20
|
+
//# sourceMappingURL=use-observed-attr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-observed-attr.js","sources":["../../../src/components/water-flow/use-observed-attr.ts"],"sourcesContent":["import { useCallback, useSyncExternalStore } from 'react'\n\nimport { StatefulEventBus } from './stateful-event-bus'\n\nexport function useObservedAttr<\n T extends StatefulEventBus<any>,\n K extends keyof T['state']\n>(\n inst: T,\n attr: K\n): T['state'][K] {\n const sub = useCallback(\n (onStoreChange: () => void) => {\n return inst.sub(attr, onStoreChange)\n },\n [inst, attr]\n )\n\n const getSnapshot = useCallback(() => {\n if ('getState' in inst && typeof inst.getState === 'function') {\n const state = inst.getState()\n if (state && attr in state) {\n return state[attr as keyof typeof state]\n }\n }\n return inst[attr]\n }, [inst, attr])\n\n return useSyncExternalStore(sub, getSnapshot, getSnapshot)\n}\n"],"names":[],"mappings":";;AAIgB,SAAA,eAAe,CAI7B,IAAO,EACP,IAAO,EAAA;AAEP,IAAA,MAAM,GAAG,GAAG,WAAW,CACrB,CAAC,aAAyB,KAAI;QAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;AACtC,KAAC,EACD,CAAC,IAAI,EAAE,IAAI,CAAC,CACb,CAAA;AAED,IAAA,MAAM,WAAW,GAAG,WAAW,CAAC,MAAK;QACnC,IAAI,UAAU,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE;AAC7D,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;AAC7B,YAAA,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE;AAC1B,gBAAA,OAAO,KAAK,CAAC,IAA0B,CAAC,CAAA;aACzC;SACF;AACD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,CAAA;AACnB,KAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IAEhB,OAAO,oBAAoB,CAAC,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;AAC5D;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useUnmount(cb: () => void): void;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import Taro from '@tarojs/taro';
|
|
2
|
+
export declare const getSysInfo: () => Taro.getSystemInfoSync.Result;
|
|
3
|
+
type ArrIndex = number;
|
|
4
|
+
/**
|
|
5
|
+
* 一维数组索引换算到二维数组
|
|
6
|
+
* @param i 一维数组索引
|
|
7
|
+
* @param columns 列数
|
|
8
|
+
*/
|
|
9
|
+
export declare function getMatrixPosition(i: ArrIndex, columns: number): {
|
|
10
|
+
row: number;
|
|
11
|
+
col: number;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* 简单比较渲染区间范围
|
|
15
|
+
*/
|
|
16
|
+
export declare function isSameRenderRange(a: any[], b: any[]): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 创建一个命令式的 promise 对象
|
|
19
|
+
*
|
|
20
|
+
* 返回的对象包含以下属性:
|
|
21
|
+
* - promise: 一个新的 Promise 对象,初始状态为 pending。
|
|
22
|
+
* - resolve: 一个函数,用于将 promise 状态置为 resolved。
|
|
23
|
+
* - reject: 一个函数,用于将 promise 状态置为 rejected,并可以传递一个原因参数。
|
|
24
|
+
*/
|
|
25
|
+
export declare const createImperativePromise: () => {
|
|
26
|
+
promise: Promise<void>;
|
|
27
|
+
resolve: () => void;
|
|
28
|
+
reject: (reason?: any) => void;
|
|
29
|
+
};
|
|
30
|
+
export declare const isWeb: () => boolean;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import Taro from '@tarojs/taro';
|
|
2
|
+
|
|
3
|
+
let sysInfo;
|
|
4
|
+
const getSysInfo = () => {
|
|
5
|
+
if (sysInfo)
|
|
6
|
+
return sysInfo;
|
|
7
|
+
sysInfo = Taro.getSystemInfoSync();
|
|
8
|
+
return sysInfo;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* 一维数组索引换算到二维数组
|
|
12
|
+
* @param i 一维数组索引
|
|
13
|
+
* @param columns 列数
|
|
14
|
+
*/
|
|
15
|
+
function getMatrixPosition(i, columns) {
|
|
16
|
+
const col = i % columns; // 列号
|
|
17
|
+
const row = Math.floor(i / columns); // 行号
|
|
18
|
+
return { row, col };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 简单比较渲染区间范围
|
|
22
|
+
*/
|
|
23
|
+
function isSameRenderRange(a, b) {
|
|
24
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 创建一个命令式的 promise 对象
|
|
28
|
+
*
|
|
29
|
+
* 返回的对象包含以下属性:
|
|
30
|
+
* - promise: 一个新的 Promise 对象,初始状态为 pending。
|
|
31
|
+
* - resolve: 一个函数,用于将 promise 状态置为 resolved。
|
|
32
|
+
* - reject: 一个函数,用于将 promise 状态置为 rejected,并可以传递一个原因参数。
|
|
33
|
+
*/
|
|
34
|
+
const createImperativePromise = () => {
|
|
35
|
+
const handle = {};
|
|
36
|
+
const promise = new Promise((resolve, reject) => {
|
|
37
|
+
handle.resolve = resolve;
|
|
38
|
+
handle.reject = reject;
|
|
39
|
+
});
|
|
40
|
+
return Object.assign(Object.assign({}, handle), { promise });
|
|
41
|
+
};
|
|
42
|
+
const isWeb = () => Taro.getEnv().toLowerCase() === 'web';
|
|
43
|
+
|
|
44
|
+
export { createImperativePromise, getMatrixPosition, getSysInfo, isSameRenderRange, isWeb };
|
|
45
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/components/water-flow/utils.ts"],"sourcesContent":["import Taro from '@tarojs/taro'\n\nlet sysInfo: ReturnType<typeof Taro.getSystemInfoSync>\n\nexport const getSysInfo = () => {\n if (sysInfo) return sysInfo\n sysInfo = Taro.getSystemInfoSync()\n return sysInfo\n}\n\ntype ArrIndex = number;\n/**\n * 一维数组索引换算到二维数组\n * @param i 一维数组索引\n * @param columns 列数\n */\nexport function getMatrixPosition(i: ArrIndex, columns: number) {\n const col = i % columns // 列号\n const row = Math.floor(i / columns) // 行号\n return { row, col }\n}\n\n/**\n * 简单比较渲染区间范围\n */\nexport function isSameRenderRange(a: any[], b: any[]) {\n return JSON.stringify(a) === JSON.stringify(b)\n}\n\n/**\n * 创建一个命令式的 promise 对象\n *\n * 返回的对象包含以下属性:\n * - promise: 一个新的 Promise 对象,初始状态为 pending。\n * - resolve: 一个函数,用于将 promise 状态置为 resolved。\n * - reject: 一个函数,用于将 promise 状态置为 rejected,并可以传递一个原因参数。\n */\nexport const createImperativePromise = () => {\n type ImperativePromiseHandle = {\n resolve: () => void\n reject: (reason?: any) => void\n };\n const handle = {} as ImperativePromiseHandle\n const promise = new Promise<void>((resolve, reject) => {\n handle.resolve = resolve\n handle.reject = reject\n })\n return {\n ...handle,\n promise,\n }\n}\n\nexport const isWeb = () => Taro.getEnv().toLowerCase() === 'web'\n"],"names":[],"mappings":";;AAEA,IAAI,OAAkD,CAAA;AAE/C,MAAM,UAAU,GAAG,MAAK;AAC7B,IAAA,IAAI,OAAO;AAAE,QAAA,OAAO,OAAO,CAAA;AAC3B,IAAA,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;AAClC,IAAA,OAAO,OAAO,CAAA;AAChB,EAAC;AAGD;;;;AAIG;AACa,SAAA,iBAAiB,CAAC,CAAW,EAAE,OAAe,EAAA;AAC5D,IAAA,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO,CAAA;AACvB,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,CAAA;AACnC,IAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;AACrB,CAAC;AAED;;AAEG;AACa,SAAA,iBAAiB,CAAC,CAAQ,EAAE,CAAQ,EAAA;AAClD,IAAA,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;AAChD,CAAC;AAED;;;;;;;AAOG;AACI,MAAM,uBAAuB,GAAG,MAAK;IAK1C,MAAM,MAAM,GAAG,EAA6B,CAAA;IAC5C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;AACpD,QAAA,MAAM,CAAC,OAAO,GAAG,OAAO,CAAA;AACxB,QAAA,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;AACxB,KAAC,CAAC,CAAA;IACF,OACK,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,MAAM,CACT,EAAA,EAAA,OAAO,EACR,CAAA,CAAA;AACH,EAAC;AAEY,MAAA,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,KAAK;;;;"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ScrollViewProps } from '@tarojs/components';
|
|
2
|
+
import { PropsWithChildren, ReactElement } from 'react';
|
|
3
|
+
import type { WaterFlowProps } from './interface';
|
|
4
|
+
export declare function WaterFlow({ children, ...props }: PropsWithChildren<WaterFlowProps>): ReactElement<ScrollViewProps, string | import("react").JSXElementConstructor<any>>;
|