@tarojs/components-advanced 4.2.2-alpha.1 → 4.2.2-alpha.2

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