@tarojs/components-advanced 4.2.1-beta.0 → 4.2.1-beta.1

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 (85) 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 +15 -0
  16. package/dist/components/list/hooks/useListScrollElementAttachWeapp.js +135 -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 +14 -0
  22. package/dist/components/list/hooks/useMeasureStartOffsetWeapp.js +87 -0
  23. package/dist/components/list/hooks/useMeasureStartOffsetWeapp.js.map +1 -0
  24. package/dist/components/list/hooks/useRefresher.d.ts +80 -0
  25. package/dist/components/list/hooks/useRefresher.js +561 -0
  26. package/dist/components/list/hooks/useRefresher.js.map +1 -0
  27. package/dist/components/list/hooks/useResizeObserver.d.ts +29 -0
  28. package/dist/components/list/hooks/useResizeObserver.js +153 -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 +74 -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 +1081 -162
  38. package/dist/components/list/index.js.map +1 -1
  39. package/dist/components/list/utils.d.ts +28 -0
  40. package/dist/components/list/utils.js +41 -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 +18 -11
  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 +32 -2
  50. package/dist/components/water-flow/node.d.ts +3 -0
  51. package/dist/components/water-flow/node.js +34 -1
  52. package/dist/components/water-flow/node.js.map +1 -1
  53. package/dist/components/water-flow/root.d.ts +39 -4
  54. package/dist/components/water-flow/root.js +144 -44
  55. package/dist/components/water-flow/root.js.map +1 -1
  56. package/dist/components/water-flow/section.d.ts +11 -1
  57. package/dist/components/water-flow/section.js +81 -19
  58. package/dist/components/water-flow/section.js.map +1 -1
  59. package/dist/components/water-flow/utils.d.ts +4 -0
  60. package/dist/components/water-flow/utils.js +5 -1
  61. package/dist/components/water-flow/utils.js.map +1 -1
  62. package/dist/components/water-flow/water-flow-node-cache.d.ts +24 -0
  63. package/dist/components/water-flow/water-flow-node-cache.js +161 -0
  64. package/dist/components/water-flow/water-flow-node-cache.js.map +1 -0
  65. package/dist/components/water-flow/water-flow.d.ts +2 -3
  66. package/dist/components/water-flow/water-flow.js +316 -36
  67. package/dist/components/water-flow/water-flow.js.map +1 -1
  68. package/dist/index.js +4 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/utils/dom.d.ts +2 -2
  71. package/dist/utils/dom.js +7 -6
  72. package/dist/utils/dom.js.map +1 -1
  73. package/dist/utils/index.d.ts +2 -0
  74. package/dist/utils/index.js +2 -0
  75. package/dist/utils/index.js.map +1 -1
  76. package/dist/utils/scrollElementContext.d.ts +15 -0
  77. package/dist/utils/scrollElementContext.js +14 -0
  78. package/dist/utils/scrollElementContext.js.map +1 -0
  79. package/dist/utils/scrollParent.d.ts +33 -0
  80. package/dist/utils/scrollParent.js +88 -0
  81. package/dist/utils/scrollParent.js.map +1 -0
  82. package/dist/utils/weapp-scope.d.ts +7 -0
  83. package/dist/utils/weapp-scope.js +20 -0
  84. package/dist/utils/weapp-scope.js.map +1 -0
  85. package/package.json +9 -8
@@ -1,52 +1,145 @@
1
1
  import { __rest } from 'tslib';
2
- import { ScrollView, View } from '@tarojs/components';
3
- import { nextTick } from '@tarojs/taro';
4
- import { useId, useMemo, useRef, Children, cloneElement, useEffect, createElement } from 'react';
2
+ import { View, ScrollView } from '@tarojs/components';
3
+ import Taro, { nextTick } from '@tarojs/taro';
4
+ import { useContext, useRef, useCallback, useId, useMemo, useLayoutEffect, useEffect, Children, cloneElement, createElement, forwardRef } from 'react';
5
5
  import '../../utils/index.js';
6
+ import { ScrollElementContextOrFallback } from '../../utils/scrollElementContext.js';
7
+ import { useMeasureStartOffset } from '../list/hooks/useMeasureStartOffset.js';
8
+ import { useMeasureStartOffsetWeapp } from '../list/hooks/useMeasureStartOffsetWeapp.js';
9
+ import { useScrollParentAutoFind } from '../list/hooks/useScrollParentAutoFind.js';
6
10
  import { Root, RootEvents } from './root.js';
7
11
  import { Section } from './section.js';
8
12
  import { useMemoizedFn } from './use-memoized-fn.js';
9
13
  import { useObservedAttr } from './use-observed-attr.js';
10
- import { getSysInfo } from './utils.js';
14
+ import { getSysInfo, isH5, isWeapp } from './utils.js';
15
+ import { createWaterFlowNodeCacheControl } from './water-flow-node-cache.js';
11
16
  import { getScrollViewContextNode } from '../../utils/dom.js';
12
17
  import { debounce } from '../../utils/lodash.js';
18
+ import { weappScope } from '../../utils/weapp-scope.js';
13
19
 
14
20
  getSysInfo();
15
- function WaterFlow(_a) {
21
+ /** 仅有效数字才作为 ScrollView 受控滚动偏移,避免 undefined/null 在 H5 经 Number(null)→0 归顶 */
22
+ function pickControlledScrollOffset(value) {
23
+ return typeof value === 'number' && !Number.isNaN(value) ? value : undefined;
24
+ }
25
+ const InnerWaterFlow = (_a, ref) => {
26
+ var _b, _c, _d, _e;
16
27
  var { children } = _a, props = __rest(_a, ["children"]);
17
- const { id, style = {}, className, cacheCount = 1, onScrollToUpper, onScrollToLower, upperThresholdCount, lowerThresholdCount, scrollIntoView } = props, rest = __rest(props, ["id", "style", "className", "cacheCount", "onScrollToUpper", "onScrollToLower", "upperThresholdCount", "lowerThresholdCount", "scrollIntoView"]);
28
+ const { id, style = {}, className, cacheCount = 1, onScrollToUpper, onScrollToLower, upperThresholdCount, lowerThresholdCount, scrollIntoView, nestedScroll, scrollElement, startOffset, containerHeight, onScrollHeightChange, onScrollIntoViewComplete, onScroll: onScrollProp, scrollTop, scrollLeft } = props, rest = __rest(props, ["id", "style", "className", "cacheCount", "onScrollToUpper", "onScrollToLower", "upperThresholdCount", "lowerThresholdCount", "scrollIntoView", "nestedScroll", "scrollElement", "startOffset", "containerHeight", "onScrollHeightChange", "onScrollIntoViewComplete", "onScroll", "scrollTop", "scrollLeft"]);
29
+ const flowType = nestedScroll === true ? 'nested' : 'default';
30
+ // 从 ScrollElementContext 获取 scrollRef(List/ScrollView 内嵌时提供);无 Context 时兜底为 fallback
31
+ const scrollElementCtx = useContext(ScrollElementContextOrFallback);
32
+ const contentWrapperRef = useRef(null);
33
+ const setContainerRef = useCallback((el) => {
34
+ contentWrapperRef.current = el;
35
+ if (typeof ref === 'function')
36
+ ref(el);
37
+ else if (ref)
38
+ ref.current = el;
39
+ }, [ref]);
18
40
  const defaultId = useId().replace(/:/g, '');
41
+ /** 仅在原有 id 后追加同一实例内共享的随机数尾缀,不替换原 id 串 */
42
+ const instanceIdSuffixRef = useRef(null);
43
+ if (instanceIdSuffixRef.current === null) {
44
+ instanceIdSuffixRef.current = String(Math.floor(Math.random() * 1e9));
45
+ }
46
+ const instanceSuffix = instanceIdSuffixRef.current;
47
+ const contentId = useMemo(() => `${id !== null && id !== void 0 ? id : defaultId}_${instanceSuffix}`, [id, defaultId, instanceSuffix]);
48
+ const needAutoFind = flowType === 'nested' &&
49
+ !scrollElement &&
50
+ !(scrollElementCtx === null || scrollElementCtx === void 0 ? void 0 : scrollElementCtx.scrollRef) &&
51
+ (isH5 || isWeapp);
52
+ const { scrollParentRef: autoFoundRef, status: autoFindStatus } = useScrollParentAutoFind(contentWrapperRef, { enabled: !!needAutoFind, isHorizontal: false, contentId: isWeapp ? contentId : undefined });
53
+ const effectiveScrollElement = (_b = scrollElement !== null && scrollElement !== void 0 ? scrollElement : scrollElementCtx === null || scrollElementCtx === void 0 ? void 0 : scrollElementCtx.scrollRef) !== null && _b !== void 0 ? _b : (needAutoFind && autoFindStatus === 'found' ? autoFoundRef : null);
54
+ const ctxStart = scrollElementCtx === null || scrollElementCtx === void 0 ? void 0 : scrollElementCtx.startOffset;
55
+ const hasExplicitStartOffset = ctxStart != null && ctxStart > 0;
56
+ const needMeasureStartOffset = flowType === 'nested' &&
57
+ effectiveScrollElement &&
58
+ isH5 &&
59
+ startOffset == null &&
60
+ !hasExplicitStartOffset;
61
+ const needMeasureStartOffsetWeapp = flowType === 'nested' &&
62
+ effectiveScrollElement &&
63
+ isWeapp &&
64
+ startOffset == null &&
65
+ !hasExplicitStartOffset;
66
+ const measuredStartOffset = useMeasureStartOffset(effectiveScrollElement !== null && effectiveScrollElement !== void 0 ? effectiveScrollElement : { current: null }, contentWrapperRef, { enabled: !!needMeasureStartOffset, isHorizontal: false });
67
+ const effectiveStartOffsetRef = useRef(0);
68
+ const measuredStartOffsetWeapp = useMeasureStartOffsetWeapp(effectiveScrollElement !== null && effectiveScrollElement !== void 0 ? effectiveScrollElement : { current: null }, contentId, { enabled: !!needMeasureStartOffsetWeapp, isHorizontal: false, startOffsetRef: effectiveStartOffsetRef });
69
+ const effectiveStartOffset = (_e = (_d = (_c = startOffset !== null && startOffset !== void 0 ? startOffset : (ctxStart != null && ctxStart > 0 ? ctxStart : null)) !== null && _c !== void 0 ? _c : measuredStartOffset) !== null && _d !== void 0 ? _d : measuredStartOffsetWeapp) !== null && _e !== void 0 ? _e : 0;
70
+ const effectiveContainerHeight = containerHeight !== null && containerHeight !== void 0 ? containerHeight : scrollElementCtx === null || scrollElementCtx === void 0 ? void 0 : scrollElementCtx.containerHeight;
71
+ const startOffsetRef = useRef(effectiveStartOffset);
72
+ const containerHeightRef = useRef(effectiveContainerHeight);
73
+ const lastReportedHeightRef = useRef(0);
74
+ startOffsetRef.current = effectiveStartOffset;
75
+ if (!needMeasureStartOffsetWeapp) {
76
+ effectiveStartOffsetRef.current = effectiveStartOffset;
77
+ }
78
+ containerHeightRef.current = effectiveContainerHeight;
79
+ const useScrollElementMode = flowType === 'nested' && !!(effectiveScrollElement && (isH5 || isWeapp));
80
+ const renderView = useScrollElementMode || (!!needAutoFind && autoFindStatus === 'pending');
81
+ const scrollViewShellRef = useRef(null);
82
+ if (flowType === 'nested' && !effectiveScrollElement && (isH5 || isWeapp) && autoFindStatus === 'not-found') {
83
+ // eslint-disable-next-line no-console
84
+ console.warn('[WaterFlow] nestedScroll 模式但无 scrollElement(props/Context/自动查找),回退为 default,将渲染自有 ScrollView');
85
+ }
19
86
  /**
20
87
  * 初始化数据模型
21
88
  */
22
89
  const root = useMemo(() => {
23
90
  return new Root({
24
- id: id !== null && id !== void 0 ? id : defaultId,
91
+ id: contentId,
25
92
  cacheCount,
26
93
  upperThresholdCount,
27
94
  lowerThresholdCount,
95
+ skipContainerMeasure: useScrollElementMode || (!!needAutoFind && autoFindStatus === 'pending'),
28
96
  });
29
- }, [id, cacheCount, upperThresholdCount, lowerThresholdCount]);
97
+ }, [contentId, upperThresholdCount, lowerThresholdCount, useScrollElementMode, needAutoFind, autoFindStatus]);
98
+ /** props 动态修改 cacheCount 时同步到 Root,避免重建 Root;并收敛快滑单边放大到新的基线 */
99
+ useLayoutEffect(() => {
100
+ root.cacheCount = cacheCount;
101
+ root.setNodeCacheRange(cacheCount, cacheCount);
102
+ }, [root, cacheCount]);
30
103
  const isScrolling$ = useObservedAttr(root, 'isScrolling');
31
104
  const scrollHeight$ = useObservedAttr(root, 'scrollHeight');
32
105
  const renderRange$ = useObservedAttr(root, 'renderRange');
33
106
  const refEventOrig = useRef();
107
+ const nodeCacheCtlRef = useRef(null);
108
+ useLayoutEffect(() => {
109
+ if (root.skipContainerMeasure)
110
+ return;
111
+ const shell = renderView ? contentWrapperRef.current : scrollViewShellRef.current;
112
+ root.measureContainerSize(shell).catch(() => { });
113
+ }, [root, renderView, needAutoFind, autoFindStatus]);
114
+ useEffect(() => {
115
+ const ctl = createWaterFlowNodeCacheControl(root, () => root.cacheCount);
116
+ nodeCacheCtlRef.current = ctl;
117
+ return () => {
118
+ ctl.dispose();
119
+ nodeCacheCtlRef.current = null;
120
+ };
121
+ }, [root]);
34
122
  /**
35
123
  * 滚动事件
36
124
  */
37
125
  const handleScroll = useMemoizedFn((ev) => {
126
+ var _a;
38
127
  refEventOrig.current = ev;
39
- root.sections.forEach((section) => section.getNodeRenderRange());
40
- const { scrollTop } = ev.detail;
41
- // 确定滚动方向
42
- const scrollDirection = root.getState().scrollOffset < scrollTop ? 'forward' : 'backward';
43
- // 设置滚动信息,包括方向和偏移量
128
+ const { scrollTop: detailScrollTop } = ev.detail;
129
+ (_a = nodeCacheCtlRef.current) === null || _a === void 0 ? void 0 : _a.onScrollSample(detailScrollTop);
130
+ const scrollDirection = root.getState().scrollOffset < detailScrollTop ? 'forward' : 'backward';
44
131
  root.setStateBatch({
45
132
  scrollDirection: scrollDirection,
46
- scrollOffset: scrollTop,
133
+ scrollOffset: detailScrollTop,
47
134
  isScrolling: true,
48
135
  });
49
136
  });
137
+ const onScrollMerged = useMemoizedFn((ev) => {
138
+ handleScroll(ev);
139
+ onScrollProp === null || onScrollProp === void 0 ? void 0 : onScrollProp(ev);
140
+ });
141
+ const controlledScrollTop = pickControlledScrollOffset(scrollTop);
142
+ const controlledScrollLeft = pickControlledScrollOffset(scrollLeft);
50
143
  const sections = useMemo(() => {
51
144
  var _a;
52
145
  const [start, end] = renderRange$;
@@ -62,7 +155,7 @@ function WaterFlow(_a) {
62
155
  if (section) {
63
156
  const originalCount = section.count;
64
157
  if (childCount > originalCount) {
65
- section.pushNodes(childCount - originalCount);
158
+ section.pushNodesStructuralOnly(childCount - originalCount);
66
159
  }
67
160
  }
68
161
  else {
@@ -78,10 +171,42 @@ function WaterFlow(_a) {
78
171
  return cloneElement(child, { section, key: `${props.id}-${order}` });
79
172
  })) === null || _a === void 0 ? void 0 : _a.slice(start, end + 1);
80
173
  }, [renderRange$[0], renderRange$[1], children, root, props.id]);
174
+ /** 配对 pushNodesStructuralOnly:在 layout 阶段完成 Section 状态,避免 useMemo 内 setState 告警 */
175
+ useLayoutEffect(() => {
176
+ Children.forEach(children, (child, order) => {
177
+ var _a;
178
+ if (Object.is(child, null)) {
179
+ return;
180
+ }
181
+ const sectionProps = child.props;
182
+ const sectionId = sectionProps.id || `section-${order}`;
183
+ (_a = root.findSection(sectionId)) === null || _a === void 0 ? void 0 : _a.finalizePushNodesStateIfNeeded();
184
+ });
185
+ }, [children, root]);
81
186
  const scrollTo = useMemoizedFn((scrollOffset = 0) => {
187
+ var _a;
82
188
  scrollOffset = Math.max(0, scrollOffset);
83
189
  if (root.getState().scrollOffset === scrollOffset)
84
190
  return;
191
+ if (useScrollElementMode && (effectiveScrollElement === null || effectiveScrollElement === void 0 ? void 0 : effectiveScrollElement.current)) {
192
+ const el = effectiveScrollElement.current;
193
+ const startOff = isWeapp ? effectiveStartOffsetRef.current : ((_a = startOffsetRef.current) !== null && _a !== void 0 ? _a : 0);
194
+ const scrollTarget = scrollOffset + startOff;
195
+ if (isH5) {
196
+ el.scrollTo({ top: scrollTarget });
197
+ }
198
+ else if (isWeapp) {
199
+ const scrollViewId = el.id || `_wf_${contentId}`;
200
+ if (!el.id)
201
+ el.id = scrollViewId;
202
+ getScrollViewContextNode(`#${scrollViewId}`).then((node) => {
203
+ var _a;
204
+ (_a = node === null || node === void 0 ? void 0 : node.scrollTo) === null || _a === void 0 ? void 0 : _a.call(node, { top: scrollTarget, animated: true, duration: 300 });
205
+ });
206
+ }
207
+ root.setStateBatch({ scrollOffset, isScrolling: true });
208
+ return;
209
+ }
85
210
  getScrollViewContextNode(`#${root.id}`).then((node) => {
86
211
  node.scrollTo({
87
212
  animated: true,
@@ -99,6 +224,7 @@ function WaterFlow(_a) {
99
224
  }, [isScrolling$]);
100
225
  /**
101
226
  * 处理滚动阈值
227
+ * root 需入参:autoFind 从 pending→found 时 root 会重建,必须对新 root 重新订阅
102
228
  */
103
229
  useEffect(() => {
104
230
  const disposers = [
@@ -114,38 +240,191 @@ function WaterFlow(_a) {
114
240
  disposer();
115
241
  });
116
242
  };
117
- }, [onScrollToUpper, onScrollToLower]);
243
+ }, [root, onScrollToUpper, onScrollToLower]);
118
244
  /**
119
245
  * 处理 scrollIntoView
246
+ * 竞态:快速切换目标时,取消前一次滚动,避免后发先至
120
247
  */
121
248
  useEffect(() => {
249
+ let cancelled = false;
122
250
  handleScrollIntoView();
123
251
  async function handleScrollIntoView() {
124
- if (scrollIntoView) {
125
- if (root.getState().scrollOffset > 0) {
126
- // 说明在自动滚动前手动滚动过了,不应该自动滚动了,避免造成困扰
252
+ if (!scrollIntoView)
253
+ return;
254
+ const targetNode = root.findNode(scrollIntoView);
255
+ if (!targetNode) {
256
+ nextTick(() => { if (!cancelled)
257
+ onScrollIntoViewComplete === null || onScrollIntoViewComplete === void 0 ? void 0 : onScrollIntoViewComplete(); });
258
+ return;
259
+ }
260
+ const targetSection = targetNode.section;
261
+ const doScroll = () => {
262
+ if (cancelled)
263
+ return;
264
+ scrollTo(targetNode.getState().scrollTop);
265
+ if (cancelled)
127
266
  return;
267
+ nextTick(() => { if (!cancelled)
268
+ onScrollIntoViewComplete === null || onScrollIntoViewComplete === void 0 ? void 0 : onScrollIntoViewComplete(); });
269
+ };
270
+ if (!targetSection.getState().layouted) {
271
+ const order = targetSection.order;
272
+ root.setStateIn('renderRange', [
273
+ Math.min(renderRange$[0], order),
274
+ Math.max(renderRange$[1], order),
275
+ ]);
276
+ nextTick(async () => {
277
+ await targetNode.section.layoutedSignal.promise;
278
+ if (cancelled)
279
+ return;
280
+ doScroll();
281
+ });
282
+ return;
283
+ }
284
+ await targetSection.layoutedSignal.promise;
285
+ if (cancelled)
286
+ return;
287
+ doScroll();
288
+ }
289
+ return () => { cancelled = true; };
290
+ }, [scrollIntoView, renderRange$[0], renderRange$[1], onScrollIntoViewComplete]);
291
+ // scrollElement 模式下监听外部滚动,更新 root.scrollOffset;effectiveStartOffset 变化时重新同步;内嵌时 scrollRef 可能尚未就绪,需重试
292
+ useEffect(() => {
293
+ if (!useScrollElementMode || !effectiveScrollElement)
294
+ return;
295
+ let cancelled = false;
296
+ let teardown = null;
297
+ const maxRetries = 20;
298
+ const tryAttach = (retryCount = 0) => {
299
+ if (cancelled)
300
+ return;
301
+ const target = effectiveScrollElement.current;
302
+ if (!target) {
303
+ if (retryCount < maxRetries) {
304
+ setTimeout(() => tryAttach(retryCount + 1), 50);
128
305
  }
129
- const targetNode = root.findNode(scrollIntoView);
130
- if (targetNode) {
131
- const targetSection = targetNode.section;
132
- if (!targetSection.getState().layouted) {
133
- const order = targetSection.order;
134
- root.setStateIn('renderRange', [renderRange$[0], order]);
135
- nextTick(async () => {
136
- await targetNode.section.layoutedSignal.promise;
137
- scrollTo(targetNode.getState().scrollTop);
138
- });
306
+ return;
307
+ }
308
+ const getStartOffset = () => { var _a; return (isWeapp ? effectiveStartOffsetRef.current : ((_a = startOffsetRef.current) !== null && _a !== void 0 ? _a : 0)); };
309
+ const handler = (e) => {
310
+ var _a, _b, _c, _d, _e, _f;
311
+ const scrollTop = isWeapp
312
+ ? ((_e = (_b = (_a = e === null || e === void 0 ? void 0 : e.target) === null || _a === void 0 ? void 0 : _a.scrollTop) !== null && _b !== void 0 ? _b : (_d = (_c = e === null || e === void 0 ? void 0 : e.mpEvent) === null || _c === void 0 ? void 0 : _c.detail) === null || _d === void 0 ? void 0 : _d.scrollTop) !== null && _e !== void 0 ? _e : 0)
313
+ : target.scrollTop;
314
+ const offset = scrollTop - getStartOffset();
315
+ const effectiveOffset = Math.max(0, offset);
316
+ const prevOffset = root.getState().scrollOffset;
317
+ const scrollDirection = prevOffset < effectiveOffset ? 'forward' : 'backward';
318
+ (_f = nodeCacheCtlRef.current) === null || _f === void 0 ? void 0 : _f.onScrollSample(effectiveOffset);
319
+ root.setStateBatch({
320
+ scrollDirection,
321
+ scrollOffset: effectiveOffset,
322
+ isScrolling: true,
323
+ });
324
+ };
325
+ if (isWeapp) {
326
+ if (!target.id)
327
+ target.id = `_wf_${contentId}`;
328
+ const scrollViewId = target.id;
329
+ const scope = weappScope({ current: target });
330
+ const query = scope != null
331
+ ? Taro.createSelectorQuery().in(scope)
332
+ : Taro.createSelectorQuery();
333
+ query.select(`#${scrollViewId}`).scrollOffset().exec((res) => {
334
+ var _a;
335
+ if (cancelled)
139
336
  return;
337
+ const info = res === null || res === void 0 ? void 0 : res[0];
338
+ if (info) {
339
+ const scrollTopVal = (_a = info.scrollTop) !== null && _a !== void 0 ? _a : 0;
340
+ const initialOffset = Math.max(0, scrollTopVal - getStartOffset());
341
+ root.setStateBatch({ scrollOffset: initialOffset, isScrolling: true });
140
342
  }
141
- await targetNode.section.layoutedSignal.promise;
142
- scrollTo(targetNode.getState().scrollTop);
143
- }
343
+ });
344
+ }
345
+ else {
346
+ const initialOffset = Math.max(0, target.scrollTop - getStartOffset());
347
+ root.setStateBatch({ scrollOffset: initialOffset, isScrolling: true });
144
348
  }
349
+ target.addEventListener('scroll', handler, isWeapp ? undefined : { passive: true });
350
+ teardown = () => target.removeEventListener('scroll', handler);
351
+ };
352
+ tryAttach();
353
+ return () => {
354
+ cancelled = true;
355
+ teardown === null || teardown === void 0 ? void 0 : teardown();
356
+ };
357
+ }, [useScrollElementMode, effectiveScrollElement, root, effectiveStartOffset, contentId]);
358
+ // scrollHeight 变化时回调(props 优先,其次从 Context),便于 List 动高联动;防抖 150ms 上报
359
+ const reportHeight = onScrollHeightChange !== null && onScrollHeightChange !== void 0 ? onScrollHeightChange : scrollElementCtx === null || scrollElementCtx === void 0 ? void 0 : scrollElementCtx.reportNestedHeightChange;
360
+ useEffect(() => {
361
+ if (!reportHeight || scrollHeight$ <= 0)
362
+ return;
363
+ const timer = setTimeout(() => {
364
+ if (Math.abs(lastReportedHeightRef.current - scrollHeight$) < 1)
365
+ return;
366
+ lastReportedHeightRef.current = scrollHeight$;
367
+ reportHeight(scrollHeight$);
368
+ }, 150);
369
+ return () => clearTimeout(timer);
370
+ }, [scrollHeight$, reportHeight]);
371
+ // scrollElement 模式下监听容器尺寸:H5 用 ResizeObserver,小程序用 createSelectorQuery 轮询
372
+ useEffect(() => {
373
+ if (!useScrollElementMode || !effectiveScrollElement)
374
+ return;
375
+ const el = effectiveScrollElement.current;
376
+ if (!el)
377
+ return;
378
+ if (isWeapp) {
379
+ if (!el.id)
380
+ el.id = `_wf_${contentId}`;
381
+ const scrollViewId = el.id;
382
+ const measure = () => {
383
+ const scope = weappScope({ current: el });
384
+ const query = scope != null
385
+ ? Taro.createSelectorQuery().in(scope)
386
+ : Taro.createSelectorQuery();
387
+ query.select(`#${scrollViewId}`).boundingClientRect().exec((res) => {
388
+ var _a;
389
+ const rect = res === null || res === void 0 ? void 0 : res[0];
390
+ if (rect && rect.height > 0 && rect.width > 0) {
391
+ const height = (_a = containerHeightRef.current) !== null && _a !== void 0 ? _a : rect.height;
392
+ root.setStateIn('containerSize', { width: rect.width, height });
393
+ }
394
+ });
395
+ };
396
+ measure();
397
+ const interval = setInterval(measure, 150);
398
+ return () => clearInterval(interval);
145
399
  }
146
- }, [scrollIntoView, renderRange$[0]]);
147
- return createElement(ScrollView, Object.assign({ id: root.id, style: Object.assign({ WebkitOverflowScrolling: 'touch', overflow: 'auto' }, style), className, scrollY: true, onScroll: handleScroll }, rest), createElement(View, {
148
- id: 'waterflow-root',
400
+ if (typeof ResizeObserver === 'undefined')
401
+ return;
402
+ const update = () => {
403
+ var _a;
404
+ const height = (_a = containerHeightRef.current) !== null && _a !== void 0 ? _a : el.clientHeight;
405
+ const width = el.clientWidth;
406
+ if (height > 0 && width > 0) {
407
+ root.setStateIn('containerSize', { width, height });
408
+ }
409
+ };
410
+ update();
411
+ const ro = new ResizeObserver(update);
412
+ ro.observe(el);
413
+ return () => ro.disconnect();
414
+ }, [useScrollElementMode, effectiveScrollElement, root, effectiveContainerHeight, contentId]);
415
+ if (renderView) {
416
+ return createElement(View, {
417
+ ref: setContainerRef,
418
+ id: root.id,
419
+ style: Object.assign(Object.assign({}, style), { width: '100%', position: 'relative', height: scrollHeight$, pointerEvents: isScrolling$ ? 'none' : 'auto' }),
420
+ className,
421
+ }, sections);
422
+ }
423
+ return createElement(ScrollView, Object.assign(Object.assign(Object.assign({ id: root.id, ref: (el) => {
424
+ scrollViewShellRef.current = el;
425
+ }, style: Object.assign({ WebkitOverflowScrolling: 'touch', overflow: 'auto' }, style), className, scrollY: true, onScroll: onScrollMerged }, (controlledScrollTop !== undefined ? { scrollTop: controlledScrollTop } : {})), (controlledScrollLeft !== undefined ? { scrollLeft: controlledScrollLeft } : {})), rest), createElement(View, {
426
+ ref: setContainerRef,
427
+ id: `waterflow-root_${instanceSuffix}`,
149
428
  style: {
150
429
  width: '100%',
151
430
  position: 'relative',
@@ -153,7 +432,8 @@ function WaterFlow(_a) {
153
432
  pointerEvents: isScrolling$ ? 'none' : 'auto',
154
433
  },
155
434
  }, sections));
156
- }
435
+ };
436
+ const WaterFlow = forwardRef(InnerWaterFlow);
157
437
 
158
438
  export { WaterFlow };
159
439
  //# sourceMappingURL=water-flow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"water-flow.js","sources":["../../../src/components/water-flow/water-flow.ts"],"sourcesContent":["import { BaseEventOrig, ScrollView, ScrollViewProps, View } from '@tarojs/components'\nimport { nextTick } from '@tarojs/taro'\nimport {\n Children,\n cloneElement,\n createElement,\n PropsWithChildren,\n ReactElement,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from 'react'\n\nimport { debounce, getScrollViewContextNode } from '../../utils'\nimport { _FlowSectionProps } from './flow-section'\nimport { Root, RootEvents } from './root'\nimport { Section } from './section'\nimport { useMemoizedFn } from './use-memoized-fn'\nimport { useObservedAttr } from './use-observed-attr'\nimport { getSysInfo } from './utils'\n\nimport type { ScrollDirection, WaterFlowProps } from './interface'\n\ngetSysInfo()\n\nexport function WaterFlow({ children, ...props }: PropsWithChildren<WaterFlowProps>) {\n const {\n id,\n style = {},\n className,\n cacheCount = 1,\n onScrollToUpper,\n onScrollToLower,\n upperThresholdCount,\n lowerThresholdCount,\n scrollIntoView,\n ...rest\n } = props\n const defaultId = useId().replace(/:/g, '')\n /**\n * 初始化数据模型\n */\n const root = useMemo(() => {\n return new Root({\n id: id ?? defaultId,\n cacheCount,\n upperThresholdCount,\n lowerThresholdCount,\n })\n }, [id, cacheCount, upperThresholdCount, lowerThresholdCount])\n const isScrolling$ = useObservedAttr(root, 'isScrolling')\n const scrollHeight$ = useObservedAttr(root, 'scrollHeight')\n const renderRange$ = useObservedAttr(root, 'renderRange')\n const refEventOrig = useRef<BaseEventOrig>()\n\n /**\n * 滚动事件\n */\n const handleScroll = useMemoizedFn((ev: BaseEventOrig<ScrollViewProps.onScrollDetail>) => {\n refEventOrig.current = ev\n root.sections.forEach((section) => section.getNodeRenderRange())\n const { scrollTop } = ev.detail\n // 确定滚动方向\n const scrollDirection: ScrollDirection = root.getState().scrollOffset < scrollTop ? 'forward' : 'backward'\n // 设置滚动信息,包括方向和偏移量\n root.setStateBatch({\n scrollDirection: scrollDirection,\n scrollOffset: scrollTop,\n isScrolling: true,\n })\n })\n\n const sections = useMemo(() => {\n const [start, end] = renderRange$\n return Children.map(children, (child: ReactElement<PropsWithChildren<_FlowSectionProps>>, order) => {\n if (Object.is(child, null)) {\n return null\n }\n const sectionProps = child.props\n const sectionId = sectionProps.id || `section-${order}`\n const childCount = Children.count(sectionProps.children)\n let section = root.findSection(sectionId)\n if (section) {\n const originalCount = section.count\n if (childCount > originalCount) {\n section.pushNodes(childCount - originalCount)\n }\n } else {\n section = new Section(root, {\n id: sectionId,\n order,\n col: sectionProps.column ?? 1,\n rowGap: sectionProps.rowGap || 0,\n columnGap: sectionProps.columnGap || 0,\n count: Children.count(sectionProps.children),\n })\n }\n\n return cloneElement(child, { section, key: `${props.id}-${order}` })\n })?.slice(start, end + 1)\n }, [renderRange$[0], renderRange$[1], children, root, props.id])\n\n const scrollTo = useMemoizedFn((scrollOffset = 0) => {\n scrollOffset = Math.max(0, scrollOffset)\n if (root.getState().scrollOffset === scrollOffset) return\n getScrollViewContextNode(`#${root.id}`).then((node: any) => {\n node.scrollTo({\n animated: true,\n duration: 300,\n top: scrollOffset,\n })\n })\n })\n\n const resetScrolling = useMemoizedFn(() => {\n root.setStateIn('isScrolling', false)\n })\n\n const debouncedResetScrolling = debounce(resetScrolling)\n\n useEffect(() => {\n debouncedResetScrolling()\n }, [isScrolling$])\n\n /**\n * 处理滚动阈值\n */\n useEffect(() => {\n const disposers = [\n root.sub(\n RootEvents.ReachUpperThreshold,\n debounce(() => {\n onScrollToUpper?.(refEventOrig.current!)\n })\n ),\n root.sub(\n RootEvents.ReachLowerThreshold,\n debounce(() => {\n onScrollToLower?.(refEventOrig.current!)\n })\n ),\n ]\n return () => {\n disposers.forEach((disposer) => {\n disposer()\n })\n }\n }, [onScrollToUpper, onScrollToLower])\n\n /**\n * 处理 scrollIntoView\n */\n useEffect(() => {\n handleScrollIntoView()\n async function handleScrollIntoView() {\n if (scrollIntoView) {\n if (root.getState().scrollOffset > 0) {\n // 说明在自动滚动前手动滚动过了,不应该自动滚动了,避免造成困扰\n return\n }\n const targetNode = root.findNode(scrollIntoView)\n if (targetNode) {\n const targetSection = targetNode.section\n if (!targetSection.getState().layouted) {\n const order = targetSection.order\n root.setStateIn('renderRange', [renderRange$[0], order])\n nextTick(async () => {\n await targetNode.section.layoutedSignal.promise\n scrollTo(targetNode.getState().scrollTop)\n })\n return\n }\n await targetNode.section.layoutedSignal.promise\n scrollTo(targetNode.getState().scrollTop)\n }\n }\n }\n }, [scrollIntoView, renderRange$[0]])\n\n return createElement(\n ScrollView,\n {\n id: root.id,\n style: {\n WebkitOverflowScrolling: 'touch',\n overflow: 'auto',\n ...style,\n },\n className,\n scrollY: true,\n onScroll: handleScroll,\n ...rest,\n },\n createElement(\n View,\n {\n id: 'waterflow-root',\n style: {\n width: '100%',\n position: 'relative',\n height: scrollHeight$,\n pointerEvents: isScrolling$ ? 'none' : 'auto',\n },\n },\n sections\n )\n )\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"water-flow.js","sources":["../../../src/components/water-flow/water-flow.ts"],"sourcesContent":["import { BaseEventOrig, ScrollView, ScrollViewProps, View } from '@tarojs/components'\nimport Taro, { nextTick } from '@tarojs/taro'\nimport {\n Children,\n cloneElement,\n createElement,\n forwardRef,\n PropsWithChildren,\n ReactElement,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react'\n\nimport { debounce, getScrollViewContextNode, weappScope } from '../../utils'\nimport {\n type ScrollElementContextValueShape,\n ScrollElementContextOrFallback,\n} from '../../utils/scrollElementContext'\nimport { useMeasureStartOffset } from '../list/hooks/useMeasureStartOffset'\nimport { useMeasureStartOffsetWeapp } from '../list/hooks/useMeasureStartOffsetWeapp'\nimport { useScrollParentAutoFind } from '../list/hooks/useScrollParentAutoFind'\nimport { _FlowSectionProps } from './flow-section'\nimport { Root, RootEvents } from './root'\nimport { Section } from './section'\nimport { useMemoizedFn } from './use-memoized-fn'\nimport { useObservedAttr } from './use-observed-attr'\nimport { getSysInfo, isH5, isWeapp } from './utils'\nimport { createWaterFlowNodeCacheControl } from './water-flow-node-cache'\n\nimport type { ScrollDirection, WaterFlowProps } from './interface'\n\ngetSysInfo()\n\n/** 仅有效数字才作为 ScrollView 受控滚动偏移,避免 undefined/null 在 H5 经 Number(null)→0 归顶 */\nfunction pickControlledScrollOffset (value: unknown): number | undefined {\n return typeof value === 'number' && !Number.isNaN(value) ? value : undefined\n}\n\nconst InnerWaterFlow = (\n { children, ...props }: PropsWithChildren<WaterFlowProps>,\n ref: React.ForwardedRef<HTMLElement>\n) => {\n const {\n id,\n style = {},\n className,\n cacheCount = 1,\n onScrollToUpper,\n onScrollToLower,\n upperThresholdCount,\n lowerThresholdCount,\n scrollIntoView,\n nestedScroll,\n scrollElement,\n startOffset,\n containerHeight,\n onScrollHeightChange,\n onScrollIntoViewComplete,\n onScroll: onScrollProp,\n scrollTop,\n scrollLeft,\n ...rest\n } = props\n const flowType = nestedScroll === true ? 'nested' : 'default'\n // 从 ScrollElementContext 获取 scrollRef(List/ScrollView 内嵌时提供);无 Context 时兜底为 fallback\n const scrollElementCtx = useContext(ScrollElementContextOrFallback) as ScrollElementContextValueShape | null\n const contentWrapperRef = useRef<HTMLDivElement>(null)\n const setContainerRef = useCallback(\n (el: HTMLElement | null) => {\n (contentWrapperRef as React.MutableRefObject<HTMLElement | null>).current = el\n if (typeof ref === 'function') ref(el)\n else if (ref) (ref as React.MutableRefObject<HTMLElement | null>).current = el\n },\n [ref]\n )\n const defaultId = useId().replace(/:/g, '')\n /** 仅在原有 id 后追加同一实例内共享的随机数尾缀,不替换原 id 串 */\n const instanceIdSuffixRef = useRef<string | null>(null)\n if (instanceIdSuffixRef.current === null) {\n instanceIdSuffixRef.current = String(Math.floor(Math.random() * 1e9))\n }\n const instanceSuffix = instanceIdSuffixRef.current\n const contentId = useMemo(\n () => `${id ?? defaultId}_${instanceSuffix}`,\n [id, defaultId, instanceSuffix]\n )\n const needAutoFind =\n flowType === 'nested' &&\n !scrollElement &&\n !scrollElementCtx?.scrollRef &&\n (isH5 || isWeapp)\n const { scrollParentRef: autoFoundRef, status: autoFindStatus } = useScrollParentAutoFind(\n contentWrapperRef,\n { enabled: !!needAutoFind, isHorizontal: false, contentId: isWeapp ? contentId : undefined }\n )\n const effectiveScrollElement =\n scrollElement ??\n scrollElementCtx?.scrollRef ??\n (needAutoFind && autoFindStatus === 'found' ? autoFoundRef : null)\n const ctxStart = scrollElementCtx?.startOffset\n const hasExplicitStartOffset = ctxStart != null && ctxStart > 0\n const needMeasureStartOffset =\n flowType === 'nested' &&\n effectiveScrollElement &&\n isH5 &&\n startOffset == null &&\n !hasExplicitStartOffset\n const needMeasureStartOffsetWeapp =\n flowType === 'nested' &&\n effectiveScrollElement &&\n isWeapp &&\n startOffset == null &&\n !hasExplicitStartOffset\n const measuredStartOffset = useMeasureStartOffset(\n effectiveScrollElement ?? { current: null },\n contentWrapperRef,\n { enabled: !!needMeasureStartOffset, isHorizontal: false }\n )\n const effectiveStartOffsetRef = useRef(0)\n const measuredStartOffsetWeapp = useMeasureStartOffsetWeapp(\n effectiveScrollElement ?? { current: null },\n contentId,\n { enabled: !!needMeasureStartOffsetWeapp, isHorizontal: false, startOffsetRef: effectiveStartOffsetRef }\n )\n const effectiveStartOffset =\n startOffset ??\n (ctxStart != null && ctxStart > 0 ? ctxStart : null) ??\n measuredStartOffset ??\n measuredStartOffsetWeapp ??\n 0\n\n const effectiveContainerHeight = containerHeight ?? scrollElementCtx?.containerHeight\n\n const startOffsetRef = useRef(effectiveStartOffset)\n const containerHeightRef = useRef(effectiveContainerHeight)\n const lastReportedHeightRef = useRef<number>(0)\n startOffsetRef.current = effectiveStartOffset\n if (!needMeasureStartOffsetWeapp) {\n effectiveStartOffsetRef.current = effectiveStartOffset\n }\n containerHeightRef.current = effectiveContainerHeight\n\n const useScrollElementMode =\n flowType === 'nested' && !!(effectiveScrollElement && (isH5 || isWeapp))\n const renderView =\n useScrollElementMode || (!!needAutoFind && autoFindStatus === 'pending')\n const scrollViewShellRef = useRef<HTMLElement | null>(null)\n if (flowType === 'nested' && !effectiveScrollElement && (isH5 || isWeapp) && autoFindStatus === 'not-found') {\n // eslint-disable-next-line no-console\n console.warn('[WaterFlow] nestedScroll 模式但无 scrollElement(props/Context/自动查找),回退为 default,将渲染自有 ScrollView')\n }\n /**\n * 初始化数据模型\n */\n const root = useMemo(() => {\n return new Root({\n id: contentId,\n cacheCount,\n upperThresholdCount,\n lowerThresholdCount,\n skipContainerMeasure: useScrollElementMode || (!!needAutoFind && autoFindStatus === 'pending'),\n })\n }, [contentId, upperThresholdCount, lowerThresholdCount, useScrollElementMode, needAutoFind, autoFindStatus])\n\n /** props 动态修改 cacheCount 时同步到 Root,避免重建 Root;并收敛快滑单边放大到新的基线 */\n useLayoutEffect(() => {\n root.cacheCount = cacheCount\n root.setNodeCacheRange(cacheCount, cacheCount)\n }, [root, cacheCount])\n const isScrolling$ = useObservedAttr(root, 'isScrolling')\n const scrollHeight$ = useObservedAttr(root, 'scrollHeight')\n const renderRange$ = useObservedAttr(root, 'renderRange')\n const refEventOrig = useRef<BaseEventOrig>()\n const nodeCacheCtlRef = useRef<ReturnType<typeof createWaterFlowNodeCacheControl> | null>(null)\n\n useLayoutEffect(() => {\n if (root.skipContainerMeasure) return\n const shell = renderView ? contentWrapperRef.current : scrollViewShellRef.current\n root.measureContainerSize(shell as HTMLElement | null).catch(() => {})\n }, [root, renderView, needAutoFind, autoFindStatus])\n\n useEffect(() => {\n const ctl = createWaterFlowNodeCacheControl(root, () => root.cacheCount)\n nodeCacheCtlRef.current = ctl\n return () => {\n ctl.dispose()\n nodeCacheCtlRef.current = null\n }\n }, [root])\n\n /**\n * 滚动事件\n */\n const handleScroll = useMemoizedFn((ev: BaseEventOrig<ScrollViewProps.onScrollDetail>) => {\n refEventOrig.current = ev\n const { scrollTop: detailScrollTop } = ev.detail\n nodeCacheCtlRef.current?.onScrollSample(detailScrollTop)\n const scrollDirection: ScrollDirection = root.getState().scrollOffset < detailScrollTop ? 'forward' : 'backward'\n root.setStateBatch({\n scrollDirection: scrollDirection,\n scrollOffset: detailScrollTop,\n isScrolling: true,\n })\n })\n\n const onScrollMerged = useMemoizedFn((ev: BaseEventOrig<ScrollViewProps.onScrollDetail>) => {\n handleScroll(ev)\n onScrollProp?.(ev)\n })\n\n const controlledScrollTop = pickControlledScrollOffset(scrollTop)\n const controlledScrollLeft = pickControlledScrollOffset(scrollLeft)\n\n const sections = useMemo(() => {\n const [start, end] = renderRange$\n return Children.map(children, (child: ReactElement<PropsWithChildren<_FlowSectionProps>>, order) => {\n if (Object.is(child, null)) {\n return null\n }\n const sectionProps = child.props\n const sectionId = sectionProps.id || `section-${order}`\n const childCount = Children.count(sectionProps.children)\n let section = root.findSection(sectionId)\n if (section) {\n const originalCount = section.count\n if (childCount > originalCount) {\n section.pushNodesStructuralOnly(childCount - originalCount)\n }\n } else {\n section = new Section(root, {\n id: sectionId,\n order,\n col: sectionProps.column ?? 1,\n rowGap: sectionProps.rowGap || 0,\n columnGap: sectionProps.columnGap || 0,\n count: Children.count(sectionProps.children),\n })\n }\n\n return cloneElement(child, { section, key: `${props.id}-${order}` })\n })?.slice(start, end + 1)\n }, [renderRange$[0], renderRange$[1], children, root, props.id])\n\n /** 配对 pushNodesStructuralOnly:在 layout 阶段完成 Section 状态,避免 useMemo 内 setState 告警 */\n useLayoutEffect(() => {\n Children.forEach(children, (child: ReactElement<PropsWithChildren<_FlowSectionProps>>, order) => {\n if (Object.is(child, null)) {\n return\n }\n const sectionProps = child.props\n const sectionId = sectionProps.id || `section-${order}`\n root.findSection(sectionId)?.finalizePushNodesStateIfNeeded()\n })\n }, [children, root])\n\n const scrollTo = useMemoizedFn((scrollOffset = 0) => {\n scrollOffset = Math.max(0, scrollOffset)\n if (root.getState().scrollOffset === scrollOffset) return\n if (useScrollElementMode && effectiveScrollElement?.current) {\n const el = effectiveScrollElement.current as any\n const startOff = isWeapp ? effectiveStartOffsetRef.current : (startOffsetRef.current ?? 0)\n const scrollTarget = scrollOffset + startOff\n if (isH5) {\n el.scrollTo({ top: scrollTarget })\n } else if (isWeapp) {\n const scrollViewId = el.id || `_wf_${contentId}`\n if (!el.id) el.id = scrollViewId\n getScrollViewContextNode(`#${scrollViewId}`).then((node: any) => {\n node?.scrollTo?.({ top: scrollTarget, animated: true, duration: 300 })\n })\n }\n root.setStateBatch({ scrollOffset, isScrolling: true })\n return\n }\n getScrollViewContextNode(`#${root.id}`).then((node: any) => {\n node.scrollTo({\n animated: true,\n duration: 300,\n top: scrollOffset,\n })\n })\n })\n\n const resetScrolling = useMemoizedFn(() => {\n root.setStateIn('isScrolling', false)\n })\n\n const debouncedResetScrolling = debounce(resetScrolling)\n\n useEffect(() => {\n debouncedResetScrolling()\n }, [isScrolling$])\n\n /**\n * 处理滚动阈值\n * root 需入参:autoFind 从 pending→found 时 root 会重建,必须对新 root 重新订阅\n */\n useEffect(() => {\n const disposers = [\n root.sub(\n RootEvents.ReachUpperThreshold,\n debounce(() => {\n onScrollToUpper?.(refEventOrig.current!)\n })\n ),\n root.sub(\n RootEvents.ReachLowerThreshold,\n debounce(() => {\n onScrollToLower?.(refEventOrig.current!)\n })\n ),\n ]\n return () => {\n disposers.forEach((disposer) => {\n disposer()\n })\n }\n }, [root, onScrollToUpper, onScrollToLower])\n\n /**\n * 处理 scrollIntoView\n * 竞态:快速切换目标时,取消前一次滚动,避免后发先至\n */\n useEffect(() => {\n let cancelled = false\n handleScrollIntoView()\n async function handleScrollIntoView() {\n if (!scrollIntoView) return\n const targetNode = root.findNode(scrollIntoView)\n if (!targetNode) {\n nextTick(() => { if (!cancelled) onScrollIntoViewComplete?.() })\n return\n }\n const targetSection = targetNode.section\n const doScroll = () => {\n if (cancelled) return\n scrollTo(targetNode.getState().scrollTop)\n if (cancelled) return\n nextTick(() => { if (!cancelled) onScrollIntoViewComplete?.() })\n }\n if (!targetSection.getState().layouted) {\n const order = targetSection.order\n root.setStateIn('renderRange', [\n Math.min(renderRange$[0], order),\n Math.max(renderRange$[1], order),\n ])\n nextTick(async () => {\n await targetNode.section.layoutedSignal.promise\n if (cancelled) return\n doScroll()\n })\n return\n }\n await targetSection.layoutedSignal.promise\n if (cancelled) return\n doScroll()\n }\n return () => { cancelled = true }\n }, [scrollIntoView, renderRange$[0], renderRange$[1], onScrollIntoViewComplete])\n\n // scrollElement 模式下监听外部滚动,更新 root.scrollOffset;effectiveStartOffset 变化时重新同步;内嵌时 scrollRef 可能尚未就绪,需重试\n useEffect(() => {\n if (!useScrollElementMode || !effectiveScrollElement) return\n\n let cancelled = false\n let teardown: (() => void) | null = null\n const maxRetries = 20\n\n const tryAttach = (retryCount = 0) => {\n if (cancelled) return\n const target = effectiveScrollElement.current as any\n if (!target) {\n if (retryCount < maxRetries) {\n setTimeout(() => tryAttach(retryCount + 1), 50)\n }\n return\n }\n\n const getStartOffset = () => (isWeapp ? effectiveStartOffsetRef.current : (startOffsetRef.current ?? 0))\n\n const handler = (e?: any) => {\n const scrollTop = isWeapp\n ? (e?.target?.scrollTop ?? e?.mpEvent?.detail?.scrollTop ?? 0)\n : target.scrollTop\n const offset = scrollTop - getStartOffset()\n const effectiveOffset = Math.max(0, offset)\n const prevOffset = root.getState().scrollOffset\n const scrollDirection: ScrollDirection = prevOffset < effectiveOffset ? 'forward' : 'backward'\n\n nodeCacheCtlRef.current?.onScrollSample(effectiveOffset)\n root.setStateBatch({\n scrollDirection,\n scrollOffset: effectiveOffset,\n isScrolling: true,\n })\n }\n\n if (isWeapp) {\n if (!target.id) target.id = `_wf_${contentId}`\n const scrollViewId = target.id\n const scope = weappScope({ current: target })\n const query = scope != null\n ? Taro.createSelectorQuery().in(scope as any)\n : Taro.createSelectorQuery()\n query.select(`#${scrollViewId}`).scrollOffset().exec((res) => {\n if (cancelled) return\n const info = res?.[0]\n if (info) {\n const scrollTopVal = info.scrollTop ?? 0\n const initialOffset = Math.max(0, scrollTopVal - getStartOffset())\n root.setStateBatch({ scrollOffset: initialOffset, isScrolling: true })\n }\n })\n } else {\n const initialOffset = Math.max(0, target.scrollTop - getStartOffset())\n root.setStateBatch({ scrollOffset: initialOffset, isScrolling: true })\n }\n\n target.addEventListener('scroll', handler, isWeapp ? undefined : { passive: true })\n teardown = () => target.removeEventListener('scroll', handler)\n }\n\n tryAttach()\n return () => {\n cancelled = true\n teardown?.()\n }\n }, [useScrollElementMode, effectiveScrollElement, root, effectiveStartOffset, contentId])\n\n // scrollHeight 变化时回调(props 优先,其次从 Context),便于 List 动高联动;防抖 150ms 上报\n const reportHeight = onScrollHeightChange ?? scrollElementCtx?.reportNestedHeightChange\n useEffect(() => {\n if (!reportHeight || scrollHeight$ <= 0) return\n const timer = setTimeout(() => {\n if (Math.abs(lastReportedHeightRef.current - scrollHeight$) < 1) return\n lastReportedHeightRef.current = scrollHeight$\n reportHeight(scrollHeight$)\n }, 150)\n return () => clearTimeout(timer)\n }, [scrollHeight$, reportHeight])\n\n // scrollElement 模式下监听容器尺寸:H5 用 ResizeObserver,小程序用 createSelectorQuery 轮询\n useEffect(() => {\n if (!useScrollElementMode || !effectiveScrollElement) return\n const el = effectiveScrollElement.current as any\n if (!el) return\n\n if (isWeapp) {\n if (!el.id) el.id = `_wf_${contentId}`\n const scrollViewId = el.id\n const measure = () => {\n const scope = weappScope({ current: el })\n const query = scope != null\n ? Taro.createSelectorQuery().in(scope as any)\n : Taro.createSelectorQuery()\n query.select(`#${scrollViewId}`).boundingClientRect().exec((res) => {\n const rect = res?.[0]\n if (rect && rect.height > 0 && rect.width > 0) {\n const height = containerHeightRef.current ?? rect.height\n root.setStateIn('containerSize', { width: rect.width, height })\n }\n })\n }\n measure()\n const interval = setInterval(measure, 150)\n return () => clearInterval(interval)\n }\n\n if (typeof ResizeObserver === 'undefined') return\n const update = () => {\n const height = containerHeightRef.current ?? el.clientHeight\n const width = el.clientWidth\n if (height > 0 && width > 0) {\n root.setStateIn('containerSize', { width, height })\n }\n }\n update()\n const ro = new ResizeObserver(update)\n ro.observe(el)\n return () => ro.disconnect()\n }, [useScrollElementMode, effectiveScrollElement, root, effectiveContainerHeight, contentId])\n\n if (renderView) {\n return createElement(\n View,\n {\n ref: setContainerRef as any,\n id: root.id,\n style: {\n ...style,\n width: '100%',\n position: 'relative',\n height: scrollHeight$,\n pointerEvents: isScrolling$ ? 'none' : 'auto',\n },\n className,\n },\n sections\n )\n }\n\n return createElement(\n ScrollView,\n {\n id: root.id,\n ref: (el: any) => {\n scrollViewShellRef.current = el\n },\n style: {\n WebkitOverflowScrolling: 'touch',\n overflow: 'auto',\n ...style,\n },\n className,\n scrollY: true,\n onScroll: onScrollMerged,\n ...(controlledScrollTop !== undefined ? { scrollTop: controlledScrollTop } : {}),\n ...(controlledScrollLeft !== undefined ? { scrollLeft: controlledScrollLeft } : {}),\n ...rest,\n },\n createElement(\n View,\n {\n ref: setContainerRef as any,\n id: `waterflow-root_${instanceSuffix}`,\n style: {\n width: '100%',\n position: 'relative',\n height: scrollHeight$,\n pointerEvents: isScrolling$ ? 'none' : 'auto',\n },\n },\n sections\n )\n )\n}\n\nexport const WaterFlow = forwardRef<HTMLElement, PropsWithChildren<WaterFlowProps>>(InnerWaterFlow)\n"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,7 +1,9 @@
1
1
  import './components/index.js';
2
2
  import './utils/index.js';
3
+ export { ScrollElementContextOrFallback as ListScrollElementContext } from './utils/scrollElementContext.js';
3
4
  export { List, accumulate, isShaking } from './components/list/index.js';
4
5
  export { ListItem } from './components/list/ListItem.js';
6
+ export { NoMore } from './components/list/NoMore.js';
5
7
  export { StickyHeader } from './components/list/StickyHeader.js';
6
8
  export { StickySection } from './components/list/StickySection.js';
7
9
  export { VirtualList } from './components/virtual-list/index.js';
@@ -14,5 +16,7 @@ export { getRectSize, getRectSizeSync, getScrollViewContextNode } from './utils/
14
16
  export { defaultItemKey, getOffsetForIndexAndAlignment } from './utils/helper.js';
15
17
  export { debounce, omit, throttle } from './utils/lodash.js';
16
18
  export { getMiddleNumber, isCosDistributing } from './utils/math.js';
19
+ export { findScrollParent, findScrollParentTaro, isScrollableElement } from './utils/scrollParent.js';
17
20
  export { cancelTimeout, requestTimeout } from './utils/timer.js';
21
+ export { weappScope } from './utils/weapp-scope.js';
18
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
- export declare function getRectSize(id: string, success?: TFunc, fail?: TFunc, retryMs?: number): void;
2
- export declare function getRectSizeSync(id: string, retryMs?: number, retryTimes?: number): Promise<{
1
+ export declare function getRectSize(id: string, success?: TFunc, fail?: TFunc, retryMs?: number, scope?: object): void;
2
+ export declare function getRectSizeSync(id: string, retryMs?: number, retryTimes?: number, scope?: object): Promise<{
3
3
  width?: number;
4
4
  height?: number;
5
5
  }>;
package/dist/utils/dom.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { createSelectorQuery } from '@tarojs/taro';
2
2
 
3
- function getRectSize(id, success, fail, retryMs = 500) {
4
- const query = createSelectorQuery();
3
+ function getRectSize(id, success, fail, retryMs = 500, scope) {
4
+ const rootQuery = createSelectorQuery();
5
+ const query = scope != null ? rootQuery.in(scope) : rootQuery;
5
6
  try {
6
7
  query.select(id).boundingClientRect((res) => {
7
8
  if (res instanceof Array ? res.length > 0 : res) {
@@ -14,18 +15,18 @@ function getRectSize(id, success, fail, retryMs = 500) {
14
15
  }
15
16
  catch (err) {
16
17
  setTimeout(() => {
17
- getRectSize(id, success, fail, retryMs);
18
+ getRectSize(id, success, fail, retryMs, scope);
18
19
  }, retryMs);
19
20
  }
20
21
  }
21
- function getRectSizeSync(id, retryMs = 500, retryTimes = 5) {
22
+ function getRectSizeSync(id, retryMs = 500, retryTimes = 5, scope) {
22
23
  return new Promise((resolve) => {
23
24
  function retry() {
24
25
  if (retryTimes <= 0)
25
26
  return;
26
27
  setTimeout(async () => {
27
28
  try {
28
- const res = await getRectSizeSync(id, retryMs, --retryTimes);
29
+ const res = await getRectSizeSync(id, retryMs, --retryTimes, scope);
29
30
  resolve(res);
30
31
  }
31
32
  catch (err) {
@@ -33,7 +34,7 @@ function getRectSizeSync(id, retryMs = 500, retryTimes = 5) {
33
34
  }
34
35
  }, retryMs);
35
36
  }
36
- getRectSize(id, resolve, retry, retryMs);
37
+ getRectSize(id, resolve, retry, retryMs, scope);
37
38
  });
38
39
  }
39
40
  async function getScrollViewContextNode(id) {