@tarojs/components-advanced 4.1.12-beta.2 → 4.1.12-beta.21

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 (76) hide show
  1. package/dist/components/index.js +2 -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/useListNestedScroll.d.ts +18 -0
  10. package/dist/components/list/hooks/useListNestedScroll.js +61 -0
  11. package/dist/components/list/hooks/useListNestedScroll.js.map +1 -0
  12. package/dist/components/list/hooks/useListScrollElementAttach.d.ts +25 -0
  13. package/dist/components/list/hooks/useListScrollElementAttach.js +88 -0
  14. package/dist/components/list/hooks/useListScrollElementAttach.js.map +1 -0
  15. package/dist/components/list/hooks/useListScrollElementAttachWeapp.d.ts +27 -0
  16. package/dist/components/list/hooks/useListScrollElementAttachWeapp.js +153 -0
  17. package/dist/components/list/hooks/useListScrollElementAttachWeapp.js.map +1 -0
  18. package/dist/components/list/hooks/useMeasureStartOffset.d.ts +12 -0
  19. package/dist/components/list/hooks/useMeasureStartOffset.js +84 -0
  20. package/dist/components/list/hooks/useMeasureStartOffset.js.map +1 -0
  21. package/dist/components/list/hooks/useMeasureStartOffsetWeapp.d.ts +13 -0
  22. package/dist/components/list/hooks/useMeasureStartOffsetWeapp.js +85 -0
  23. package/dist/components/list/hooks/useMeasureStartOffsetWeapp.js.map +1 -0
  24. package/dist/components/list/hooks/useRefresher.d.ts +74 -0
  25. package/dist/components/list/hooks/useRefresher.js +503 -0
  26. package/dist/components/list/hooks/useRefresher.js.map +1 -0
  27. package/dist/components/list/hooks/useResizeObserver.d.ts +26 -0
  28. package/dist/components/list/hooks/useResizeObserver.js +152 -0
  29. package/dist/components/list/hooks/useResizeObserver.js.map +1 -0
  30. package/dist/components/list/hooks/useScrollCorrection.d.ts +19 -0
  31. package/dist/components/list/hooks/useScrollCorrection.js +73 -0
  32. package/dist/components/list/hooks/useScrollCorrection.js.map +1 -0
  33. package/dist/components/list/hooks/useScrollParentAutoFind.d.ts +20 -0
  34. package/dist/components/list/hooks/useScrollParentAutoFind.js +81 -0
  35. package/dist/components/list/hooks/useScrollParentAutoFind.js.map +1 -0
  36. package/dist/components/list/index.d.ts +64 -7
  37. package/dist/components/list/index.js +1041 -162
  38. package/dist/components/list/index.js.map +1 -1
  39. package/dist/components/list/utils.d.ts +16 -0
  40. package/dist/components/list/utils.js +19 -0
  41. package/dist/components/list/utils.js.map +1 -0
  42. package/dist/components/virtual-list/vue/list.d.ts +12 -12
  43. package/dist/components/virtual-waterfall/vue/waterfall.d.ts +11 -11
  44. package/dist/components/water-flow/flow-item.js +6 -4
  45. package/dist/components/water-flow/flow-item.js.map +1 -1
  46. package/dist/components/water-flow/flow-section.js +1 -1
  47. package/dist/components/water-flow/flow-section.js.map +1 -1
  48. package/dist/components/water-flow/index.d.ts +1 -1
  49. package/dist/components/water-flow/interface.d.ts +18 -2
  50. package/dist/components/water-flow/root.d.ts +35 -4
  51. package/dist/components/water-flow/root.js +114 -42
  52. package/dist/components/water-flow/root.js.map +1 -1
  53. package/dist/components/water-flow/section.d.ts +7 -1
  54. package/dist/components/water-flow/section.js +54 -9
  55. package/dist/components/water-flow/section.js.map +1 -1
  56. package/dist/components/water-flow/utils.d.ts +4 -0
  57. package/dist/components/water-flow/utils.js +5 -1
  58. package/dist/components/water-flow/utils.js.map +1 -1
  59. package/dist/components/water-flow/water-flow-node-cache.d.ts +24 -0
  60. package/dist/components/water-flow/water-flow-node-cache.js +161 -0
  61. package/dist/components/water-flow/water-flow-node-cache.js.map +1 -0
  62. package/dist/components/water-flow/water-flow.d.ts +2 -3
  63. package/dist/components/water-flow/water-flow.js +286 -31
  64. package/dist/components/water-flow/water-flow.js.map +1 -1
  65. package/dist/index.js +3 -0
  66. package/dist/index.js.map +1 -1
  67. package/dist/utils/index.d.ts +1 -0
  68. package/dist/utils/index.js +1 -0
  69. package/dist/utils/index.js.map +1 -1
  70. package/dist/utils/scrollElementContext.d.ts +15 -0
  71. package/dist/utils/scrollElementContext.js +14 -0
  72. package/dist/utils/scrollElementContext.js.map +1 -0
  73. package/dist/utils/scrollParent.d.ts +33 -0
  74. package/dist/utils/scrollParent.js +88 -0
  75. package/dist/utils/scrollParent.js.map +1 -0
  76. package/package.json +9 -8
@@ -25,6 +25,8 @@ class Section extends StatefulEventBus {
25
25
  this.rowGap = 0;
26
26
  this.columnGap = 0;
27
27
  this.layoutedSignal = createImperativePromise();
28
+ /** pushNodesStructuralOnly 后待 finalize;由 WaterFlow 的 useLayoutEffect 收尾,避免在父 render 中更新子 state */
29
+ this._pendingPushFinalize = false;
28
30
  Object.assign(this, {
29
31
  id,
30
32
  col,
@@ -127,7 +129,10 @@ class Section extends StatefulEventBus {
127
129
  for (; start < this.root.sections.length; start++) {
128
130
  const currentSection = this.root.sections[start - 1];
129
131
  const nextSection = this.root.sections[start];
130
- nextSection.setStateIn('scrollTop', currentSection.getState().scrollTop + currentSection.getState().height + this.rowGap);
132
+ // 使用 maxColumnHeight 替代 getState().height,避免 pushNodes 后 state 未同步导致 footer 错位
133
+ const effectiveHeight = currentSection.maxColumnHeight;
134
+ const newScrollTop = currentSection.getState().scrollTop + effectiveHeight + this.rowGap;
135
+ nextSection.setStateIn('scrollTop', newScrollTop);
131
136
  nextSection.updateNodes();
132
137
  }
133
138
  }
@@ -165,10 +170,10 @@ class Section extends StatefulEventBus {
165
170
  }
166
171
  }
167
172
  /**
168
- * 计算当前分组的 scrollTop,即该分组之前的所有分组的最大列高度之和
173
+ * 计算当前分组的 scrollTop,即该分组之前的所有分组的最大列高度 + rowGap 之和
169
174
  */
170
175
  calcScrollTop() {
171
- return this.root.sections.slice(0, this.order).reduce((acc, section) => acc + section.maxColumnHeight, 0);
176
+ return this.root.sections.slice(0, this.order).reduce((acc, section) => { var _a; return acc + section.maxColumnHeight + ((_a = section.rowGap) !== null && _a !== void 0 ? _a : 0); }, 0);
172
177
  }
173
178
  /**
174
179
  * 计算当前分组内每列应该渲染的节点索引区间
@@ -195,16 +200,29 @@ class Section extends StatefulEventBus {
195
200
  if (end === -Infinity) {
196
201
  result[i][1] = -1;
197
202
  }
198
- const cacheCount = this.root.cacheCount;
199
- const scrollDirection = this.root.getState().scrollDirection;
200
- const backwardDistance = scrollDirection === 'backward' ? cacheCount : 0;
201
- const forwardDistance = scrollDirection === 'forward' ? cacheCount : 0;
203
+ const backwardDistance = this.root.nodeCacheBackward;
204
+ const forwardDistance = this.root.nodeCacheForward;
202
205
  const overscanBackward = result[i][0] - backwardDistance;
203
206
  const overscanForward = result[i][1] + forwardDistance;
204
207
  result[i][0] = overscanBackward < 0 ? 0 : overscanBackward;
205
208
  result[i][1] = overscanForward > column.length ? column.length - 1 : overscanForward;
209
+ // 列尾连续未测量节点纳入渲染区间,保证追加数据后能挂载并完成 measure
210
+ let tailUnmeasuredStart = column.length;
211
+ for (let j = column.length - 1; j >= 0; j--) {
212
+ if (!column[j].getState().layouted) {
213
+ tailUnmeasuredStart = j;
214
+ }
215
+ else {
216
+ break;
217
+ }
218
+ }
219
+ if (tailUnmeasuredStart < column.length) {
220
+ result[i][0] = Math.min(result[i][0], tailUnmeasuredStart);
221
+ result[i][1] = Math.max(result[i][1], column.length - 1);
222
+ }
206
223
  }
207
- return isSameRenderRange(result, this.getState().renderRange) ? this.getState().renderRange : result;
224
+ const prevRange = this.getState().renderRange;
225
+ return isSameRenderRange(result, prevRange) ? prevRange : result;
208
226
  }
209
227
  pushNode(nodeIndex, col) {
210
228
  const { row: rowIndex, col: columnIndex } = getMatrixPosition(nodeIndex, col);
@@ -217,15 +235,42 @@ class Section extends StatefulEventBus {
217
235
  this.register(node);
218
236
  this.root.registerNode(node);
219
237
  }
220
- pushNodes(count) {
238
+ /** 仅扩展 columnMap / 注册 Node,不 setState;与 finalizePushNodesStateIfNeeded 配对 */
239
+ pushNodesStructuralOnly(count) {
221
240
  const { count: originalCount, col } = this;
222
241
  for (let i = originalCount; i < originalCount + count; i++) {
223
242
  this.pushNode(i, col);
224
243
  }
225
244
  this.count += count;
226
245
  this.root.lowerThresholdScrollTop = Infinity;
246
+ this._pendingPushFinalize = true;
247
+ }
248
+ /** 在 commit 后同步 height、节点位置与 scrollHeight(见 WaterFlow useLayoutEffect) */
249
+ finalizePushNodesStateIfNeeded() {
250
+ if (!this._pendingPushFinalize)
251
+ return;
252
+ this._pendingPushFinalize = false;
253
+ // 同步 section state.height,避免与 maxColumnHeight 不一致导致 footer 错位
254
+ this.setStateIn('height', this.maxColumnHeight);
227
255
  this.updateNodes();
228
256
  this.updateBehindSectionsPosition();
257
+ // 立即更新 scrollHeight,避免防抖导致容器高度滞后引发往上抖动
258
+ this.root.updateScrollHeight(true);
259
+ if (this.isInRange) {
260
+ this.setStateIn('renderRange', this.getNodeRenderRange());
261
+ }
262
+ // 扩展 Root 的 section 切片,保证多 FlowSection 时当前分组始终在渲染树内
263
+ const [rStart, rEnd] = this.root.getState().renderRange;
264
+ const newStart = Math.min(rStart, this.order);
265
+ const newEnd = Math.max(rEnd, this.order);
266
+ if (newStart !== rStart || newEnd !== rEnd) {
267
+ this.root.setStateIn('renderRange', [newStart, newEnd]);
268
+ }
269
+ this.root.resetLowerReachEdgeAfterContentChange();
270
+ }
271
+ pushNodes(count) {
272
+ this.pushNodesStructuralOnly(count);
273
+ this.finalizePushNodesStateIfNeeded();
229
274
  }
230
275
  }
231
276
 
@@ -1 +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 { createImperativePromise, getMatrixPosition, isSameRenderRange } 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(\n (column) => 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 } = this.getState()\n return sectionScrollTop <= scrollBoundaryEnd && sectionScrollTop + sectionHeight >= scrollBoundaryStart\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 this.pushNode(i, col)\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 { scrollTop: prevNodeScrollTop, height: prevNodeHeight, top: prevNodeTop } = 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.slice(0, this.order).reduce((acc, section) => acc + section.maxColumnHeight, 0)\n }\n\n /**\n * 计算当前分组内每列应该渲染的节点索引区间\n */\n public getNodeRenderRange() {\n if (!this.isInRange) {\n return Array.from({ length: this.col }, () => [0, -1] as [number, number])\n }\n\n const result = Array.from({ length: this.col }, () => [Infinity, -Infinity] as unknown as [number, number])\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] = overscanForward > column.length ? column.length - 1 : overscanForward\n }\n\n return isSameRenderRange(result, this.getState().renderRange) ? this.getState().renderRange : result\n }\n\n public pushNode(nodeIndex: number, col: number) {\n const { row: rowIndex, col: columnIndex } = getMatrixPosition(nodeIndex, col)\n const node = new Node(this.root, this, {\n childIndex: nodeIndex,\n order: rowIndex,\n col: columnIndex,\n height: this.defaultSize,\n })\n this.register(node)\n this.root.registerNode(node)\n }\n\n public pushNodes(count: number) {\n const { count: originalCount, col } = this\n for (let i = originalCount; i < originalCount + count; i++) {\n this.pushNode(i, col)\n }\n this.count += count\n this.root.lowerThresholdScrollTop = Infinity\n this.updateNodes()\n this.updateBehindSectionsPosition()\n }\n}\n"],"names":[],"mappings":"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"}
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 { createImperativePromise, getMatrixPosition, isSameRenderRange } 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 /** pushNodesStructuralOnly 后待 finalize;由 WaterFlow 的 useLayoutEffect 收尾,避免在父 render 中更新子 state */\n private _pendingPushFinalize = false\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(\n (column) => 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 } = this.getState()\n return sectionScrollTop <= scrollBoundaryEnd && sectionScrollTop + sectionHeight >= scrollBoundaryStart\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 this.pushNode(i, col)\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 // 使用 maxColumnHeight 替代 getState().height,避免 pushNodes 后 state 未同步导致 footer 错位\n const effectiveHeight = currentSection.maxColumnHeight\n const newScrollTop = currentSection.getState().scrollTop + effectiveHeight + this.rowGap\n nextSection.setStateIn('scrollTop', newScrollTop)\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 { scrollTop: prevNodeScrollTop, height: prevNodeHeight, top: prevNodeTop } = 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,即该分组之前的所有分组的最大列高度 + rowGap 之和\n */\n private calcScrollTop() {\n return this.root.sections.slice(0, this.order).reduce(\n (acc, section) => acc + section.maxColumnHeight + (section.rowGap ?? 0),\n 0\n )\n }\n\n /**\n * 计算当前分组内每列应该渲染的节点索引区间\n */\n public getNodeRenderRange() {\n if (!this.isInRange) {\n return Array.from({ length: this.col }, () => [0, -1] as [number, number])\n }\n\n const result = Array.from({ length: this.col }, () => [Infinity, -Infinity] as unknown as [number, number])\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 backwardDistance = this.root.nodeCacheBackward\n const forwardDistance = this.root.nodeCacheForward\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] = overscanForward > column.length ? column.length - 1 : overscanForward\n\n // 列尾连续未测量节点纳入渲染区间,保证追加数据后能挂载并完成 measure\n let tailUnmeasuredStart = column.length\n for (let j = column.length - 1; j >= 0; j--) {\n if (!column[j].getState().layouted) {\n tailUnmeasuredStart = j\n } else {\n break\n }\n }\n if (tailUnmeasuredStart < column.length) {\n result[i][0] = Math.min(result[i][0], tailUnmeasuredStart)\n result[i][1] = Math.max(result[i][1], column.length - 1)\n }\n }\n\n const prevRange = this.getState().renderRange\n return isSameRenderRange(result, prevRange) ? prevRange : result\n }\n\n public pushNode(nodeIndex: number, col: number) {\n const { row: rowIndex, col: columnIndex } = getMatrixPosition(nodeIndex, col)\n const node = new Node(this.root, this, {\n childIndex: nodeIndex,\n order: rowIndex,\n col: columnIndex,\n height: this.defaultSize,\n })\n this.register(node)\n this.root.registerNode(node)\n }\n\n /** 仅扩展 columnMap / 注册 Node,不 setState;与 finalizePushNodesStateIfNeeded 配对 */\n public pushNodesStructuralOnly (count: number) {\n const { count: originalCount, col } = this\n for (let i = originalCount; i < originalCount + count; i++) {\n this.pushNode(i, col)\n }\n this.count += count\n this.root.lowerThresholdScrollTop = Infinity\n this._pendingPushFinalize = true\n }\n\n /** 在 commit 后同步 height、节点位置与 scrollHeight(见 WaterFlow useLayoutEffect) */\n public finalizePushNodesStateIfNeeded () {\n if (!this._pendingPushFinalize) return\n this._pendingPushFinalize = false\n // 同步 section state.height,避免与 maxColumnHeight 不一致导致 footer 错位\n this.setStateIn('height', this.maxColumnHeight)\n this.updateNodes()\n this.updateBehindSectionsPosition()\n // 立即更新 scrollHeight,避免防抖导致容器高度滞后引发往上抖动\n this.root.updateScrollHeight(true)\n if (this.isInRange) {\n this.setStateIn('renderRange', this.getNodeRenderRange())\n }\n // 扩展 Root 的 section 切片,保证多 FlowSection 时当前分组始终在渲染树内\n const [rStart, rEnd] = this.root.getState().renderRange\n const newStart = Math.min(rStart, this.order)\n const newEnd = Math.max(rEnd, this.order)\n if (newStart !== rStart || newEnd !== rEnd) {\n this.root.setStateIn('renderRange', [newStart, newEnd])\n }\n this.root.resetLowerReachEdgeAfterContentChange()\n }\n\n public pushNodes (count: number) {\n this.pushNodesStructuralOnly(count)\n this.finalizePushNodesStateIfNeeded()\n }\n}\n"],"names":[],"mappings":"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"}
@@ -27,4 +27,8 @@ export declare const createImperativePromise: () => {
27
27
  reject: (reason?: any) => void;
28
28
  };
29
29
  export declare const isWeb: () => boolean;
30
+ /** 判断是否为 H5(用于 scrollElement 模式等) */
31
+ export declare const isH5: boolean;
32
+ /** 判断是否为微信小程序(用于 scrollElement 模式等) */
33
+ export declare const isWeapp: boolean;
30
34
  export {};
@@ -40,6 +40,10 @@ const createImperativePromise = () => {
40
40
  return Object.assign(Object.assign({}, handle), { promise });
41
41
  };
42
42
  const isWeb = () => getEnv().toLowerCase() === 'web';
43
+ /** 判断是否为 H5(用于 scrollElement 模式等) */
44
+ const isH5 = process.env.TARO_ENV === 'h5';
45
+ /** 判断是否为微信小程序(用于 scrollElement 模式等) */
46
+ const isWeapp = process.env.TARO_ENV === 'weapp';
43
47
 
44
- export { createImperativePromise, getMatrixPosition, getSysInfo, isSameRenderRange, isWeb };
48
+ export { createImperativePromise, getMatrixPosition, getSysInfo, isH5, isSameRenderRange, isWeapp, isWeb };
45
49
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/components/water-flow/utils.ts"],"sourcesContent":["import { getEnv, getSystemInfoSync } from '@tarojs/taro'\n\nlet sysInfo: ReturnType<typeof getSystemInfoSync>\n\nexport const getSysInfo = () => {\n if (sysInfo) return sysInfo\n sysInfo = 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 = () => getEnv().toLowerCase() === 'web'\n"],"names":[],"mappings":";;AAEA,IAAI,OAA6C;AAE1C,MAAM,UAAU,GAAG,MAAK;AAC7B,IAAA,IAAI,OAAO;AAAE,QAAA,OAAO,OAAO;IAC3B,OAAO,GAAG,iBAAiB,EAAE;AAC7B,IAAA,OAAO,OAAO;AAChB;AAGA;;;;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;AACrB;AAEA;;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;AAChD;AAEA;;;;;;;AAOG;AACI,MAAM,uBAAuB,GAAG,MAAK;IAK1C,MAAM,MAAM,GAAG,EAA6B;IAC5C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;AACpD,QAAA,MAAM,CAAC,OAAO,GAAG,OAAO;AACxB,QAAA,MAAM,CAAC,MAAM,GAAG,MAAM;AACxB,KAAC,CAAC;IACF,OACK,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,MAAM,CACT,EAAA,EAAA,OAAO,EACR,CAAA;AACH;AAEO,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC,WAAW,EAAE,KAAK;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/components/water-flow/utils.ts"],"sourcesContent":["import { getEnv, getSystemInfoSync } from '@tarojs/taro'\n\nlet sysInfo: ReturnType<typeof getSystemInfoSync>\n\nexport const getSysInfo = () => {\n if (sysInfo) return sysInfo\n sysInfo = 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 = () => getEnv().toLowerCase() === 'web'\n\n/** 判断是否为 H5(用于 scrollElement 模式等) */\nexport const isH5 = process.env.TARO_ENV === 'h5'\n\n/** 判断是否为微信小程序(用于 scrollElement 模式等) */\nexport const isWeapp = process.env.TARO_ENV === 'weapp'\n"],"names":[],"mappings":";;AAEA,IAAI,OAA6C;AAE1C,MAAM,UAAU,GAAG,MAAK;AAC7B,IAAA,IAAI,OAAO;AAAE,QAAA,OAAO,OAAO;IAC3B,OAAO,GAAG,iBAAiB,EAAE;AAC7B,IAAA,OAAO,OAAO;AAChB;AAGA;;;;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;AACrB;AAEA;;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;AAChD;AAEA;;;;;;;AAOG;AACI,MAAM,uBAAuB,GAAG,MAAK;IAK1C,MAAM,MAAM,GAAG,EAA6B;IAC5C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;AACpD,QAAA,MAAM,CAAC,OAAO,GAAG,OAAO;AACxB,QAAA,MAAM,CAAC,MAAM,GAAG,MAAM;AACxB,KAAC,CAAC;IACF,OACK,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,MAAM,CACT,EAAA,EAAA,OAAO,EACR,CAAA;AACH;AAEO,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC,WAAW,EAAE,KAAK;AAEtD;AACa,MAAA,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK;AAE7C;AACa,MAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK;;;;"}
@@ -0,0 +1,24 @@
1
+ import type { Root } from './root';
2
+ /** 快速滑动判定:像素/秒 */
3
+ export declare const WF_FAST_SCROLL_VELOCITY_PX_PER_S = 1000;
4
+ /** 快速滑动时 cache 倍数 */
5
+ export declare const WF_FAST_SCROLL_MULTIPLIER = 2;
6
+ /** 单边 Node 缓存上限 */
7
+ export declare const WF_FAST_SCROLL_NODE_CACHE_MAX = 30;
8
+ /** 无 scroll 视为停止的等待(ms) */
9
+ export declare const WF_SCROLL_STOP_MS = 300;
10
+ /** 停止后多久收敛回 base cache(ms) */
11
+ export declare const WF_CACHE_RESTORE_DELAY_MS = 2000;
12
+ /** 过短间隔忽略 velocity(ms) */
13
+ export declare const WF_VELOCITY_MIN_DELTA_MS = 16;
14
+ /** 过长间隔视为新一段滚动(ms) */
15
+ export declare const WF_VELOCITY_RESET_DELTA_MS = 500;
16
+ export type WaterFlowNodeCacheControl = {
17
+ onScrollSample: (scrollTop: number) => void;
18
+ dispose: () => void;
19
+ };
20
+ /**
21
+ * 快速滑动时单边放大 Node 层 cache;停止后延迟收敛。
22
+ * 不暴露 props,内部常量可调参。
23
+ */
24
+ export declare function createWaterFlowNodeCacheControl(root: Root, getBase: () => number): WaterFlowNodeCacheControl;
@@ -0,0 +1,161 @@
1
+ import { cancelAnimationFrame, requestAnimationFrame } from '@tarojs/runtime';
2
+
3
+ /** 快速滑动判定:像素/秒 */
4
+ const WF_FAST_SCROLL_VELOCITY_PX_PER_S = 1000;
5
+ /** 快速滑动时 cache 倍数 */
6
+ const WF_FAST_SCROLL_MULTIPLIER = 2;
7
+ /** 单边 Node 缓存上限 */
8
+ const WF_FAST_SCROLL_NODE_CACHE_MAX = 30;
9
+ /** 无 scroll 视为停止的等待(ms) */
10
+ const WF_SCROLL_STOP_MS = 300;
11
+ /** 停止后多久收敛回 base cache(ms) */
12
+ const WF_CACHE_RESTORE_DELAY_MS = 2000;
13
+ /** 过短间隔忽略 velocity(ms) */
14
+ const WF_VELOCITY_MIN_DELTA_MS = 16;
15
+ /** 过长间隔视为新一段滚动(ms) */
16
+ const WF_VELOCITY_RESET_DELTA_MS = 500;
17
+ /**
18
+ * 快速滑动时单边放大 Node 层 cache;停止后延迟收敛。
19
+ * 不暴露 props,内部常量可调参。
20
+ */
21
+ function createWaterFlowNodeCacheControl(root, getBase) {
22
+ let lastProcessedScrollTop = 0;
23
+ let lastProcessedTime = 0;
24
+ let rafScheduled = false;
25
+ let rafId = null;
26
+ let pendingScrollTop = 0;
27
+ let pendingTime = 0;
28
+ let scrollStopTimer = null;
29
+ let restoreTimer = null;
30
+ let disposed = false;
31
+ /** 快滑会话:停滚收敛或长间隔重置前,轻滑仍按滚动方向维持单边放大 cache */
32
+ let boostSessionActive = false;
33
+ function flushVelocity() {
34
+ if (disposed)
35
+ return;
36
+ rafId = null;
37
+ rafScheduled = false;
38
+ const st = pendingScrollTop;
39
+ const t = pendingTime;
40
+ const base = getBase();
41
+ /** 基线 cache 已达快滑上限,放大无收益,直接收敛 */
42
+ if (base >= WF_FAST_SCROLL_NODE_CACHE_MAX) {
43
+ boostSessionActive = false;
44
+ root.setNodeCacheRange(base, base);
45
+ lastProcessedScrollTop = st;
46
+ lastProcessedTime = t;
47
+ return;
48
+ }
49
+ if (lastProcessedTime === 0) {
50
+ lastProcessedScrollTop = st;
51
+ lastProcessedTime = t;
52
+ boostSessionActive = false;
53
+ root.setNodeCacheRange(base, base);
54
+ return;
55
+ }
56
+ const dt = t - lastProcessedTime;
57
+ const delta = Math.abs(st - lastProcessedScrollTop);
58
+ if (dt < WF_VELOCITY_MIN_DELTA_MS) {
59
+ lastProcessedScrollTop = st;
60
+ lastProcessedTime = t;
61
+ return;
62
+ }
63
+ if (dt > WF_VELOCITY_RESET_DELTA_MS) {
64
+ lastProcessedScrollTop = st;
65
+ lastProcessedTime = t;
66
+ boostSessionActive = false;
67
+ root.setNodeCacheRange(base, base);
68
+ return;
69
+ }
70
+ const velocity = (delta / dt) * 1000;
71
+ const boosted = base > 0 ? Math.min(base * WF_FAST_SCROLL_MULTIPLIER, WF_FAST_SCROLL_NODE_CACHE_MAX) : 0;
72
+ const forwardDown = st >= lastProcessedScrollTop;
73
+ let backward = base;
74
+ let forward = base;
75
+ if (base > 0) {
76
+ if (velocity > WF_FAST_SCROLL_VELOCITY_PX_PER_S) {
77
+ boostSessionActive = true;
78
+ }
79
+ if (boostSessionActive) {
80
+ if (forwardDown) {
81
+ forward = boosted;
82
+ backward = base;
83
+ }
84
+ else {
85
+ backward = boosted;
86
+ forward = base;
87
+ }
88
+ }
89
+ }
90
+ root.setNodeCacheRange(backward, forward);
91
+ lastProcessedScrollTop = st;
92
+ lastProcessedTime = t;
93
+ }
94
+ function onScrollSample(scrollTop) {
95
+ if (disposed)
96
+ return;
97
+ const base = getBase();
98
+ /** 基线已达快滑上限,跳过全部检测调度以减少开销 */
99
+ if (base >= WF_FAST_SCROLL_NODE_CACHE_MAX) {
100
+ boostSessionActive = false;
101
+ if (rafId != null) {
102
+ cancelAnimationFrame(rafId);
103
+ rafId = null;
104
+ }
105
+ rafScheduled = false;
106
+ if (scrollStopTimer != null) {
107
+ clearTimeout(scrollStopTimer);
108
+ scrollStopTimer = null;
109
+ }
110
+ if (restoreTimer != null) {
111
+ clearTimeout(restoreTimer);
112
+ restoreTimer = null;
113
+ }
114
+ return;
115
+ }
116
+ pendingScrollTop = scrollTop;
117
+ pendingTime = Date.now();
118
+ if (!rafScheduled) {
119
+ rafScheduled = true;
120
+ rafId = requestAnimationFrame(flushVelocity);
121
+ }
122
+ if (scrollStopTimer != null) {
123
+ clearTimeout(scrollStopTimer);
124
+ scrollStopTimer = null;
125
+ }
126
+ if (restoreTimer != null) {
127
+ clearTimeout(restoreTimer);
128
+ restoreTimer = null;
129
+ }
130
+ scrollStopTimer = setTimeout(() => {
131
+ scrollStopTimer = null;
132
+ restoreTimer = setTimeout(() => {
133
+ restoreTimer = null;
134
+ if (disposed)
135
+ return;
136
+ boostSessionActive = false;
137
+ root.setNodeCacheRange(getBase(), getBase());
138
+ }, WF_CACHE_RESTORE_DELAY_MS);
139
+ }, WF_SCROLL_STOP_MS);
140
+ }
141
+ function dispose() {
142
+ disposed = true;
143
+ if (rafId != null) {
144
+ cancelAnimationFrame(rafId);
145
+ rafId = null;
146
+ }
147
+ rafScheduled = false;
148
+ if (scrollStopTimer != null) {
149
+ clearTimeout(scrollStopTimer);
150
+ scrollStopTimer = null;
151
+ }
152
+ if (restoreTimer != null) {
153
+ clearTimeout(restoreTimer);
154
+ restoreTimer = null;
155
+ }
156
+ }
157
+ return { onScrollSample, dispose };
158
+ }
159
+
160
+ export { WF_CACHE_RESTORE_DELAY_MS, WF_FAST_SCROLL_MULTIPLIER, WF_FAST_SCROLL_NODE_CACHE_MAX, WF_FAST_SCROLL_VELOCITY_PX_PER_S, WF_SCROLL_STOP_MS, WF_VELOCITY_MIN_DELTA_MS, WF_VELOCITY_RESET_DELTA_MS, createWaterFlowNodeCacheControl };
161
+ //# sourceMappingURL=water-flow-node-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"water-flow-node-cache.js","sources":["../../../src/components/water-flow/water-flow-node-cache.ts"],"sourcesContent":["import { cancelAnimationFrame, requestAnimationFrame } from '@tarojs/runtime'\n\nimport type { Root } from './root'\n\n/** 快速滑动判定:像素/秒 */\nexport const WF_FAST_SCROLL_VELOCITY_PX_PER_S = 1000\n/** 快速滑动时 cache 倍数 */\nexport const WF_FAST_SCROLL_MULTIPLIER = 2\n/** 单边 Node 缓存上限 */\nexport const WF_FAST_SCROLL_NODE_CACHE_MAX = 30\n/** 无 scroll 视为停止的等待(ms) */\nexport const WF_SCROLL_STOP_MS = 300\n/** 停止后多久收敛回 base cache(ms) */\nexport const WF_CACHE_RESTORE_DELAY_MS = 2000\n/** 过短间隔忽略 velocity(ms) */\nexport const WF_VELOCITY_MIN_DELTA_MS = 16\n/** 过长间隔视为新一段滚动(ms) */\nexport const WF_VELOCITY_RESET_DELTA_MS = 500\n\nexport type WaterFlowNodeCacheControl = {\n onScrollSample: (scrollTop: number) => void\n dispose: () => void\n}\n\n/**\n * 快速滑动时单边放大 Node 层 cache;停止后延迟收敛。\n * 不暴露 props,内部常量可调参。\n */\nexport function createWaterFlowNodeCacheControl (\n root: Root,\n getBase: () => number\n): WaterFlowNodeCacheControl {\n let lastProcessedScrollTop = 0\n let lastProcessedTime = 0\n let rafScheduled = false\n let rafId: number | null = null\n let pendingScrollTop = 0\n let pendingTime = 0\n let scrollStopTimer: ReturnType<typeof setTimeout> | null = null\n let restoreTimer: ReturnType<typeof setTimeout> | null = null\n let disposed = false\n /** 快滑会话:停滚收敛或长间隔重置前,轻滑仍按滚动方向维持单边放大 cache */\n let boostSessionActive = false\n\n function flushVelocity () {\n if (disposed) return\n rafId = null\n rafScheduled = false\n const st = pendingScrollTop\n const t = pendingTime\n const base = getBase()\n\n /** 基线 cache 已达快滑上限,放大无收益,直接收敛 */\n if (base >= WF_FAST_SCROLL_NODE_CACHE_MAX) {\n boostSessionActive = false\n root.setNodeCacheRange(base, base)\n lastProcessedScrollTop = st\n lastProcessedTime = t\n return\n }\n\n if (lastProcessedTime === 0) {\n lastProcessedScrollTop = st\n lastProcessedTime = t\n boostSessionActive = false\n root.setNodeCacheRange(base, base)\n return\n }\n\n const dt = t - lastProcessedTime\n const delta = Math.abs(st - lastProcessedScrollTop)\n\n if (dt < WF_VELOCITY_MIN_DELTA_MS) {\n lastProcessedScrollTop = st\n lastProcessedTime = t\n return\n }\n\n if (dt > WF_VELOCITY_RESET_DELTA_MS) {\n lastProcessedScrollTop = st\n lastProcessedTime = t\n boostSessionActive = false\n root.setNodeCacheRange(base, base)\n return\n }\n\n const velocity = (delta / dt) * 1000\n const boosted =\n base > 0 ? Math.min(base * WF_FAST_SCROLL_MULTIPLIER, WF_FAST_SCROLL_NODE_CACHE_MAX) : 0\n const forwardDown = st >= lastProcessedScrollTop\n\n let backward = base\n let forward = base\n if (base > 0) {\n if (velocity > WF_FAST_SCROLL_VELOCITY_PX_PER_S) {\n boostSessionActive = true\n }\n if (boostSessionActive) {\n if (forwardDown) {\n forward = boosted\n backward = base\n } else {\n backward = boosted\n forward = base\n }\n }\n }\n\n root.setNodeCacheRange(backward, forward)\n lastProcessedScrollTop = st\n lastProcessedTime = t\n }\n\n function onScrollSample (scrollTop: number) {\n if (disposed) return\n\n const base = getBase()\n /** 基线已达快滑上限,跳过全部检测调度以减少开销 */\n if (base >= WF_FAST_SCROLL_NODE_CACHE_MAX) {\n boostSessionActive = false\n if (rafId != null) {\n cancelAnimationFrame(rafId)\n rafId = null\n }\n rafScheduled = false\n if (scrollStopTimer != null) {\n clearTimeout(scrollStopTimer)\n scrollStopTimer = null\n }\n if (restoreTimer != null) {\n clearTimeout(restoreTimer)\n restoreTimer = null\n }\n return\n }\n\n pendingScrollTop = scrollTop\n pendingTime = Date.now()\n if (!rafScheduled) {\n rafScheduled = true\n rafId = requestAnimationFrame(flushVelocity) as unknown as number\n }\n\n if (scrollStopTimer != null) {\n clearTimeout(scrollStopTimer)\n scrollStopTimer = null\n }\n if (restoreTimer != null) {\n clearTimeout(restoreTimer)\n restoreTimer = null\n }\n\n scrollStopTimer = setTimeout(() => {\n scrollStopTimer = null\n restoreTimer = setTimeout(() => {\n restoreTimer = null\n if (disposed) return\n boostSessionActive = false\n root.setNodeCacheRange(getBase(), getBase())\n }, WF_CACHE_RESTORE_DELAY_MS)\n }, WF_SCROLL_STOP_MS)\n }\n\n function dispose () {\n disposed = true\n if (rafId != null) {\n cancelAnimationFrame(rafId)\n rafId = null\n }\n rafScheduled = false\n if (scrollStopTimer != null) {\n clearTimeout(scrollStopTimer)\n scrollStopTimer = null\n }\n if (restoreTimer != null) {\n clearTimeout(restoreTimer)\n restoreTimer = null\n }\n }\n\n return { onScrollSample, dispose }\n}\n"],"names":[],"mappings":";;AAIA;AACO,MAAM,gCAAgC,GAAG;AAChD;AACO,MAAM,yBAAyB,GAAG;AACzC;AACO,MAAM,6BAA6B,GAAG;AAC7C;AACO,MAAM,iBAAiB,GAAG;AACjC;AACO,MAAM,yBAAyB,GAAG;AACzC;AACO,MAAM,wBAAwB,GAAG;AACxC;AACO,MAAM,0BAA0B,GAAG;AAO1C;;;AAGG;AACa,SAAA,+BAA+B,CAC7C,IAAU,EACV,OAAqB,EAAA;IAErB,IAAI,sBAAsB,GAAG,CAAC;IAC9B,IAAI,iBAAiB,GAAG,CAAC;IACzB,IAAI,YAAY,GAAG,KAAK;IACxB,IAAI,KAAK,GAAkB,IAAI;IAC/B,IAAI,gBAAgB,GAAG,CAAC;IACxB,IAAI,WAAW,GAAG,CAAC;IACnB,IAAI,eAAe,GAAyC,IAAI;IAChE,IAAI,YAAY,GAAyC,IAAI;IAC7D,IAAI,QAAQ,GAAG,KAAK;;IAEpB,IAAI,kBAAkB,GAAG,KAAK;AAE9B,IAAA,SAAS,aAAa,GAAA;AACpB,QAAA,IAAI,QAAQ;YAAE;QACd,KAAK,GAAG,IAAI;QACZ,YAAY,GAAG,KAAK;QACpB,MAAM,EAAE,GAAG,gBAAgB;QAC3B,MAAM,CAAC,GAAG,WAAW;AACrB,QAAA,MAAM,IAAI,GAAG,OAAO,EAAE;;AAGtB,QAAA,IAAI,IAAI,IAAI,6BAA6B,EAAE;YACzC,kBAAkB,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC;YAClC,sBAAsB,GAAG,EAAE;YAC3B,iBAAiB,GAAG,CAAC;YACrB;;AAGF,QAAA,IAAI,iBAAiB,KAAK,CAAC,EAAE;YAC3B,sBAAsB,GAAG,EAAE;YAC3B,iBAAiB,GAAG,CAAC;YACrB,kBAAkB,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC;YAClC;;AAGF,QAAA,MAAM,EAAE,GAAG,CAAC,GAAG,iBAAiB;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,sBAAsB,CAAC;AAEnD,QAAA,IAAI,EAAE,GAAG,wBAAwB,EAAE;YACjC,sBAAsB,GAAG,EAAE;YAC3B,iBAAiB,GAAG,CAAC;YACrB;;AAGF,QAAA,IAAI,EAAE,GAAG,0BAA0B,EAAE;YACnC,sBAAsB,GAAG,EAAE;YAC3B,iBAAiB,GAAG,CAAC;YACrB,kBAAkB,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC;YAClC;;QAGF,MAAM,QAAQ,GAAG,CAAC,KAAK,GAAG,EAAE,IAAI,IAAI;QACpC,MAAM,OAAO,GACX,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,yBAAyB,EAAE,6BAA6B,CAAC,GAAG,CAAC;AAC1F,QAAA,MAAM,WAAW,GAAG,EAAE,IAAI,sBAAsB;QAEhD,IAAI,QAAQ,GAAG,IAAI;QACnB,IAAI,OAAO,GAAG,IAAI;AAClB,QAAA,IAAI,IAAI,GAAG,CAAC,EAAE;AACZ,YAAA,IAAI,QAAQ,GAAG,gCAAgC,EAAE;gBAC/C,kBAAkB,GAAG,IAAI;;YAE3B,IAAI,kBAAkB,EAAE;gBACtB,IAAI,WAAW,EAAE;oBACf,OAAO,GAAG,OAAO;oBACjB,QAAQ,GAAG,IAAI;;qBACV;oBACL,QAAQ,GAAG,OAAO;oBAClB,OAAO,GAAG,IAAI;;;;AAKpB,QAAA,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC;QACzC,sBAAsB,GAAG,EAAE;QAC3B,iBAAiB,GAAG,CAAC;;IAGvB,SAAS,cAAc,CAAE,SAAiB,EAAA;AACxC,QAAA,IAAI,QAAQ;YAAE;AAEd,QAAA,MAAM,IAAI,GAAG,OAAO,EAAE;;AAEtB,QAAA,IAAI,IAAI,IAAI,6BAA6B,EAAE;YACzC,kBAAkB,GAAG,KAAK;AAC1B,YAAA,IAAI,KAAK,IAAI,IAAI,EAAE;gBACjB,oBAAoB,CAAC,KAAK,CAAC;gBAC3B,KAAK,GAAG,IAAI;;YAEd,YAAY,GAAG,KAAK;AACpB,YAAA,IAAI,eAAe,IAAI,IAAI,EAAE;gBAC3B,YAAY,CAAC,eAAe,CAAC;gBAC7B,eAAe,GAAG,IAAI;;AAExB,YAAA,IAAI,YAAY,IAAI,IAAI,EAAE;gBACxB,YAAY,CAAC,YAAY,CAAC;gBAC1B,YAAY,GAAG,IAAI;;YAErB;;QAGF,gBAAgB,GAAG,SAAS;AAC5B,QAAA,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE;QACxB,IAAI,CAAC,YAAY,EAAE;YACjB,YAAY,GAAG,IAAI;AACnB,YAAA,KAAK,GAAG,qBAAqB,CAAC,aAAa,CAAsB;;AAGnE,QAAA,IAAI,eAAe,IAAI,IAAI,EAAE;YAC3B,YAAY,CAAC,eAAe,CAAC;YAC7B,eAAe,GAAG,IAAI;;AAExB,QAAA,IAAI,YAAY,IAAI,IAAI,EAAE;YACxB,YAAY,CAAC,YAAY,CAAC;YAC1B,YAAY,GAAG,IAAI;;AAGrB,QAAA,eAAe,GAAG,UAAU,CAAC,MAAK;YAChC,eAAe,GAAG,IAAI;AACtB,YAAA,YAAY,GAAG,UAAU,CAAC,MAAK;gBAC7B,YAAY,GAAG,IAAI;AACnB,gBAAA,IAAI,QAAQ;oBAAE;gBACd,kBAAkB,GAAG,KAAK;gBAC1B,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC;aAC7C,EAAE,yBAAyB,CAAC;SAC9B,EAAE,iBAAiB,CAAC;;AAGvB,IAAA,SAAS,OAAO,GAAA;QACd,QAAQ,GAAG,IAAI;AACf,QAAA,IAAI,KAAK,IAAI,IAAI,EAAE;YACjB,oBAAoB,CAAC,KAAK,CAAC;YAC3B,KAAK,GAAG,IAAI;;QAEd,YAAY,GAAG,KAAK;AACpB,QAAA,IAAI,eAAe,IAAI,IAAI,EAAE;YAC3B,YAAY,CAAC,eAAe,CAAC;YAC7B,eAAe,GAAG,IAAI;;AAExB,QAAA,IAAI,YAAY,IAAI,IAAI,EAAE;YACxB,YAAY,CAAC,YAAY,CAAC;YAC1B,YAAY,GAAG,IAAI;;;AAIvB,IAAA,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE;AACpC;;;;"}
@@ -1,4 +1,3 @@
1
- import { ScrollViewProps } from '@tarojs/components';
2
- import { PropsWithChildren, ReactElement } from 'react';
1
+ import { PropsWithChildren } from 'react';
3
2
  import type { WaterFlowProps } from './interface';
4
- export declare function WaterFlow({ children, ...props }: PropsWithChildren<WaterFlowProps>): ReactElement<ScrollViewProps, string | import("react").JSXElementConstructor<any>>;
3
+ export declare const WaterFlow: import("react").ForwardRefExoticComponent<Omit<PropsWithChildren<WaterFlowProps>, "ref"> & import("react").RefAttributes<HTMLElement>>;