@tarojs/components-advanced 4.1.12-beta.6 → 4.1.12-beta.7

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.
@@ -1,4 +1,4 @@
1
- export { List, accumulate, isShaking } from './list/index.js';
1
+ export { List, ListScrollElementContext, accumulate, isShaking } from './list/index.js';
2
2
  export { VirtualList } from './virtual-list/index.js';
3
3
  export { VirtualWaterfall } from './virtual-waterfall/index.js';
4
4
  import './water-flow/index.js';
@@ -0,0 +1,10 @@
1
+ import type { RefObject } from 'react';
2
+ /**
3
+ * 测量 scrollElement 内 content 节点之前所有兄弟的高度/宽度之和,作为 startOffset。
4
+ * 用于 scrollElement 模式下无 Context 时自动计算上方内容高度(与下方 DOM stacking 对称)。
5
+ * 用「累加前兄弟尺寸」替代 offsetTop/offsetLeft,避免 offsetParent 包含外部区域导致偏大。
6
+ */
7
+ export declare function useMeasureStartOffset(scrollElRef: RefObject<HTMLElement | null>, contentRef: RefObject<HTMLElement | null>, options: {
8
+ enabled: boolean;
9
+ isHorizontal?: boolean;
10
+ }): number;
@@ -0,0 +1,43 @@
1
+ import { useState, useEffect } from 'react';
2
+
3
+ /**
4
+ * 测量 scrollElement 内 content 节点之前所有兄弟的高度/宽度之和,作为 startOffset。
5
+ * 用于 scrollElement 模式下无 Context 时自动计算上方内容高度(与下方 DOM stacking 对称)。
6
+ * 用「累加前兄弟尺寸」替代 offsetTop/offsetLeft,避免 offsetParent 包含外部区域导致偏大。
7
+ */
8
+ function useMeasureStartOffset(scrollElRef, contentRef, options) {
9
+ const { enabled, isHorizontal = false } = options;
10
+ const [measuredStartOffset, setMeasuredStartOffset] = useState(0);
11
+ useEffect(() => {
12
+ if (!enabled)
13
+ return;
14
+ const scrollEl = scrollElRef.current;
15
+ const contentEl = contentRef.current;
16
+ if (!scrollEl || !contentEl)
17
+ return;
18
+ const measure = () => {
19
+ const el = contentRef.current;
20
+ if (!el || el.parentElement !== scrollEl)
21
+ return;
22
+ let offset = 0;
23
+ let prev = el.previousElementSibling;
24
+ while (prev) {
25
+ offset += isHorizontal ? prev.offsetWidth : prev.offsetHeight;
26
+ prev = prev.previousElementSibling;
27
+ }
28
+ setMeasuredStartOffset((prevVal) => (Math.abs(prevVal - offset) < 1 ? prevVal : offset));
29
+ };
30
+ measure();
31
+ const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(measure) : null;
32
+ if (ro) {
33
+ ro.observe(scrollEl);
34
+ // 同时观察 scrollEl 的直系子节点:图片加载、展开/收起等会改变兄弟高度,但 scrollEl 自身 clientHeight 不变,需观察子节点
35
+ Array.from(scrollEl.children).forEach((child) => ro.observe(child));
36
+ return () => ro.disconnect();
37
+ }
38
+ }, [enabled, scrollElRef, contentRef, isHorizontal]);
39
+ return measuredStartOffset;
40
+ }
41
+
42
+ export { useMeasureStartOffset };
43
+ //# sourceMappingURL=useMeasureStartOffset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMeasureStartOffset.js","sources":["../../../../src/components/list/hooks/useMeasureStartOffset.ts"],"sourcesContent":["import { useEffect, useState } from 'react'\n\nimport type { RefObject } from 'react'\n\n/**\n * 测量 scrollElement 内 content 节点之前所有兄弟的高度/宽度之和,作为 startOffset。\n * 用于 scrollElement 模式下无 Context 时自动计算上方内容高度(与下方 DOM stacking 对称)。\n * 用「累加前兄弟尺寸」替代 offsetTop/offsetLeft,避免 offsetParent 包含外部区域导致偏大。\n */\nexport function useMeasureStartOffset(\n scrollElRef: RefObject<HTMLElement | null>,\n contentRef: RefObject<HTMLElement | null>,\n options: { enabled: boolean, isHorizontal?: boolean }\n): number {\n const { enabled, isHorizontal = false } = options\n const [measuredStartOffset, setMeasuredStartOffset] = useState(0)\n\n useEffect(() => {\n if (!enabled) return\n const scrollEl = scrollElRef.current\n const contentEl = contentRef.current\n if (!scrollEl || !contentEl) return\n\n const measure = () => {\n const el = contentRef.current\n if (!el || el.parentElement !== scrollEl) return\n let offset = 0\n let prev: Element | null = el.previousElementSibling\n while (prev) {\n offset += isHorizontal ? (prev as HTMLElement).offsetWidth : (prev as HTMLElement).offsetHeight\n prev = prev.previousElementSibling\n }\n setMeasuredStartOffset((prevVal) => (Math.abs(prevVal - offset) < 1 ? prevVal : offset))\n }\n measure()\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(measure) : null\n if (ro) {\n ro.observe(scrollEl)\n // 同时观察 scrollEl 的直系子节点:图片加载、展开/收起等会改变兄弟高度,但 scrollEl 自身 clientHeight 不变,需观察子节点\n Array.from(scrollEl.children).forEach((child) => ro.observe(child))\n return () => ro.disconnect()\n }\n }, [enabled, scrollElRef, contentRef, isHorizontal])\n\n return measuredStartOffset\n}\n"],"names":[],"mappings":";;AAIA;;;;AAIG;SACa,qBAAqB,CACnC,WAA0C,EAC1C,UAAyC,EACzC,OAAqD,EAAA;IAErD,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,KAAK,EAAE,GAAG,OAAO;IACjD,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAEjE,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO;AACpC,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO;AACpC,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS;YAAE;QAE7B,MAAM,OAAO,GAAG,MAAK;AACnB,YAAA,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO;AAC7B,YAAA,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,aAAa,KAAK,QAAQ;gBAAE;YAC1C,IAAI,MAAM,GAAG,CAAC;AACd,YAAA,IAAI,IAAI,GAAmB,EAAE,CAAC,sBAAsB;YACpD,OAAO,IAAI,EAAE;AACX,gBAAA,MAAM,IAAI,YAAY,GAAI,IAAoB,CAAC,WAAW,GAAI,IAAoB,CAAC,YAAY;AAC/F,gBAAA,IAAI,GAAG,IAAI,CAAC,sBAAsB;;YAEpC,sBAAsB,CAAC,CAAC,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;AAC1F,SAAC;AACD,QAAA,OAAO,EAAE;AACT,QAAA,MAAM,EAAE,GAAG,OAAO,cAAc,KAAK,WAAW,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,IAAI;QACrF,IAAI,EAAE,EAAE;AACN,YAAA,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;;YAEpB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACnE,YAAA,OAAO,MAAM,EAAE,CAAC,UAAU,EAAE;;KAE/B,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAEpD,IAAA,OAAO,mBAAmB;AAC5B;;;;"}
@@ -68,5 +68,7 @@ interface UseRefresherReturn {
68
68
  }
69
69
  export declare function useRefresher(config: ListRefresherConfig | null,
70
70
  /** 列表逻辑顶部对应的 scrollTop,用于触顶判断;H5「顶栏悬浮+只滚列表」时传 0,imperative 内以 DOM scrollTop 为准 */
71
- scrollTopAtLogicalTop: number): UseRefresherReturn;
71
+ scrollTopAtLogicalTop: number,
72
+ /** scrollElement 模式下可选:下拉起始点须在 List 内才触发刷新;未传时默认 true(沿用原逻辑) */
73
+ getIsTouchInListArea?: (ev: TouchEvent) => boolean): UseRefresherReturn;
72
74
  export {};
@@ -33,7 +33,9 @@ function dampIncrement(diff, totalMove, currentPull, screenHeight) {
33
33
  }
34
34
  function useRefresher(config,
35
35
  /** 列表逻辑顶部对应的 scrollTop,用于触顶判断;H5「顶栏悬浮+只滚列表」时传 0,imperative 内以 DOM scrollTop 为准 */
36
- scrollTopAtLogicalTop) {
36
+ scrollTopAtLogicalTop,
37
+ /** scrollElement 模式下可选:下拉起始点须在 List 内才触发刷新;未传时默认 true(沿用原逻辑) */
38
+ getIsTouchInListArea) {
37
39
  var _a, _b, _c, _d, _e, _f, _g;
38
40
  const [internalRefreshing, setInternalRefreshing] = useState(false);
39
41
  const [pullDistance, setPullDistance] = useState(0);
@@ -74,6 +76,8 @@ scrollTopAtLogicalTop) {
74
76
  const topThresholdPx = scrollTopWhenAtTop + AT_TOP_THRESHOLD;
75
77
  const topThresholdPxRef = useRef(topThresholdPx);
76
78
  topThresholdPxRef.current = topThresholdPx;
79
+ const getIsTouchInListAreaRef = useRef(getIsTouchInListArea);
80
+ getIsTouchInListAreaRef.current = getIsTouchInListArea;
77
81
  // ========================================
78
82
  // 小程序:原生 refresher-* API
79
83
  // ========================================
@@ -123,6 +127,8 @@ scrollTopAtLogicalTop) {
123
127
  const startX = { current: 0 };
124
128
  const lastY = { current: 0 };
125
129
  let touchStartedAtTop = false;
130
+ /** 下拉起始点是否在 List 内(scrollElement 模式);未传 getIsTouchInListArea 时恒为 true */
131
+ let touchStartedInListArea = true;
126
132
  let dragOnEdge = false;
127
133
  let lastPull = 0;
128
134
  /** 用于 onTouchEnd 判断是否触发刷新;刷新完成后必须置 0,否则下次点击(无 touchMove)会误用上次的 lastPull 再次触发 */
@@ -208,6 +214,7 @@ scrollTopAtLogicalTop) {
208
214
  };
209
215
  const isEdge = () => { var _a; return ((_a = scrollEl.scrollTop) !== null && _a !== void 0 ? _a : 0) <= topThresholdPxRef.current; };
210
216
  const onTouchStart = (e) => {
217
+ var _a, _b;
211
218
  if (refreshingLockRef.current || isRefreshingRef.current)
212
219
  return;
213
220
  if (rafRef.current != null) {
@@ -216,6 +223,7 @@ scrollTopAtLogicalTop) {
216
223
  }
217
224
  lastPull = lastPullRef.current;
218
225
  touchStartedAtTop = isEdge();
226
+ touchStartedInListArea = (_b = (_a = getIsTouchInListAreaRef.current) === null || _a === void 0 ? void 0 : _a.call(getIsTouchInListAreaRef, e)) !== null && _b !== void 0 ? _b : true;
219
227
  const t0 = e.touches[0];
220
228
  if (t0) {
221
229
  startY.current = t0.clientY;
@@ -227,16 +235,29 @@ scrollTopAtLogicalTop) {
227
235
  var _a, _b, _c, _d;
228
236
  if (refreshingLockRef.current || isRefreshingRef.current)
229
237
  return;
238
+ if (!touchStartedInListArea)
239
+ return;
230
240
  const touch = ev.touches[0];
231
241
  if (!touch)
232
242
  return;
233
243
  const currentY = touch.clientY;
234
244
  const currentX = touch.clientX;
235
- if (!touchStartedAtTop || !isEdge()) {
245
+ if (!isEdge()) {
236
246
  setPull(0);
237
247
  dragOnEdge = false;
238
248
  return;
239
249
  }
250
+ // 到顶后:若 touch 开始时不在顶部,在首次下拉(dy>0)时「采纳」该手势,使同一手势内滚到顶后继续下拉可触发刷新
251
+ if (!touchStartedAtTop && !dragOnEdge) {
252
+ const dyCheck = currentY - lastY.current;
253
+ if (dyCheck <= 0)
254
+ return;
255
+ touchStartedAtTop = true;
256
+ // 重置起点,避免采纳时 dy 过大导致刷新层瞬间拉满
257
+ startY.current = currentY;
258
+ startX.current = currentX;
259
+ lastY.current = currentY;
260
+ }
240
261
  const dy = currentY - lastY.current;
241
262
  // 还没进入下拉拖拽阶段(dragOnEdge=false)时,先看第一下是往上还是往下:
242
263
  // - 第一笔就是往上滑(dy<=0):视为正常滚动,直接交给原生 Scroll,不拦截、不启动下拉逻辑
@@ -338,6 +359,8 @@ scrollTopAtLogicalTop) {
338
359
  const onTouchEnd = () => {
339
360
  if (refreshingLockRef.current)
340
361
  return;
362
+ if (!touchStartedInListArea)
363
+ return;
341
364
  dragOnEdge = false;
342
365
  const current = lastPullRef.current;
343
366
  if (current >= thresholdRef.current) {
@@ -409,7 +432,7 @@ scrollTopAtLogicalTop) {
409
432
  justifyContent: 'center',
410
433
  alignItems: 'center',
411
434
  background,
412
- }, "data-testid": "list-refresher", children: hasCustomChildren ? config.children : (defaultText ? jsx(View, { style: textColor ? { color: textColor } : undefined, children: defaultText }) : null) }));
435
+ }, children: hasCustomChildren ? config.children : (defaultText ? jsx(View, { style: textColor ? { color: textColor } : undefined, children: defaultText }) : null) }));
413
436
  }, [config, pullDistance, isRefreshing]);
414
437
  // 受控 refresherTriggered:设为 true 时立即展示顶部加载指示器(对齐小程序:无需下拉即显示、固定在顶部)
415
438
  React.useEffect(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"useRefresher.js","sources":["../../../../src/components/list/hooks/useRefresher.tsx"],"sourcesContent":["import { Slot, View } from '@tarojs/components'\nimport React, { useCallback, useRef, useState } from 'react'\n\nimport { supportsNativeRefresher } from '../utils'\n\n/**\n * List 组件内部的 refresher 配置类型(独立于 Refresher 组件)\n * 与 ScrollView refresher 相关属性语义对齐\n */\nexport interface ListRefresherConfig {\n refresherEnabled?: boolean\n refresherThreshold?: number\n refresherDefaultStyle?: 'black' | 'white' | 'none'\n refresherBackground?: string\n refresherTriggered?: boolean\n /** 自定义刷新内容(来自 Refresher 子组件的 children) */\n children?: React.ReactNode\n onRefresherPulling?: (e?: { detail?: { deltaY?: number } }) => void\n onRefresherRefresh?: () => void | Promise<void>\n onRefresherRestore?: () => void\n onRefresherAbort?: () => void\n onRefresherWillRefresh?: () => void\n onRefresherStatusChange?: (e?: { detail?: { status?: number, dy?: number } }) => void\n}\n\n/**\n * useRefresher - 平台适配的下拉刷新\n *\n * - 小程序:weapp / jd / tt 使用 ScrollView 原生 refresher-*\n * - H5:对齐 taro-components-react pull-down-refresh(2.x 同源)逻辑:触顶 + 增量拖拽 + 阻尼 + 释放保持高度再回弹\n */\n\nconst BOUNCE_MS = 300\nconst AT_TOP_THRESHOLD = 3\n/** 最大下拉距离(px) */\nconst DISTANCE_Y_MAX_LIMIT = 150\n/** 阻尼系数:超过此值不再累加位移,与 2.x default damping 一致 */\nconst DAMPING = 100\n/** 角度上限(度),小于此值才视为下拉意图 */\nconst DEG_LIMIT = 40\n/** 默认刷新层高度(对齐 Dynamic),无自定义 children 时使用 */\nexport const DEFAULT_REFRESHER_HEIGHT = 50\n\n/** 下拉刷新状态枚举(对齐微信小程序 RefreshStatus) */\nexport const enum RefreshStatus {\n /** 空闲 */\n Idle = 0,\n /** 超过下拉刷新阈值 */\n CanRefresh = 1,\n /** 刷新中 */\n Refreshing = 2,\n /** 刷新完成 */\n Completed = 3,\n /** 刷新失败 */\n Failed = 4,\n}\n\n/**\n * 单次位移的阻尼(与 2.x PullDownRefresh.damping 一致)\n * ratio = 已拖拽总距离 / 屏幕高度,damped = diff * (1 - ratio) * 0.6;且当已超过 DAMPING 时不再加\n */\nfunction dampIncrement(\n diff: number,\n totalMove: number,\n currentPull: number,\n screenHeight: number\n): number {\n if (diff <= 0) return 0\n if (currentPull >= DAMPING) return 0\n const ratio = Math.min(totalMove / screenHeight, 1)\n return diff * (1 - ratio) * 0.6\n}\n\ninterface UseRefresherReturn {\n scrollViewRefresherProps: {\n refresherEnabled?: boolean\n refresherThreshold?: number\n refresherDefaultStyle?: string\n refresherBackground?: string\n refresherTriggered?: boolean\n }\n scrollViewRefresherHandlers: {\n onRefresherPulling?: (e: any) => void\n onRefresherRefresh?: (e: any) => void\n onRefresherRestore?: () => void\n onRefresherAbort?: () => void\n }\n h5RefresherProps: {\n touchHandlers: Record<string, unknown>\n pullDistance: number\n isRefreshing: boolean\n /** H5 单结构下恒为 true,仅兼容旧类型 */\n showRefresherLayer: boolean\n }\n addImperativeTouchListeners?: (el: HTMLElement) => () => void\n renderRefresherContent: () => React.ReactNode | null\n}\n\nexport function useRefresher(\n config: ListRefresherConfig | null,\n /** 列表逻辑顶部对应的 scrollTop,用于触顶判断;H5「顶栏悬浮+只滚列表」时传 0,imperative 内以 DOM scrollTop 为准 */\n scrollTopAtLogicalTop: number\n): UseRefresherReturn {\n const [internalRefreshing, setInternalRefreshing] = useState(false)\n const [pullDistance, setPullDistance] = useState(0)\n const pullDistanceRef = useRef(0)\n const rafRef = useRef<number | null>(null)\n const setPullDistanceRef = useRef(setPullDistance)\n const setInternalRefreshingRef = useRef(setInternalRefreshing)\n setPullDistanceRef.current = setPullDistance\n setInternalRefreshingRef.current = setInternalRefreshing\n pullDistanceRef.current = pullDistance\n\n const isControlled = typeof config?.refresherTriggered === 'boolean'\n const isRefreshing = isControlled ? (config?.refresherTriggered ?? false) : internalRefreshing\n const isRefreshingRef = useRef(isRefreshing)\n isRefreshingRef.current = isRefreshing\n /** 刷新中锁:runRefresh 内同步置 true,避免 setState 未重渲染前再次触摸触发刷新 */\n const refreshingLockRef = useRef(false)\n /** H5 当前刷新状态,用于 onRefresherStatusChange 避免重复触发 */\n const refreshStatusRef = useRef<RefreshStatus>(RefreshStatus.Idle)\n /** H5 是否启用下拉刷新:refresherEnabled === false 时不挂 touch、不显示顶栏 */\n const h5RefresherEnabled = !!config && config.refresherEnabled !== false\n\n /** touch 只挂一次,回调里读 ref 才能拿到最新配置,避免改预设后仍用旧值 */\n const thresholdRef = useRef(config?.refresherThreshold ?? 45)\n thresholdRef.current = config?.refresherThreshold ?? 45\n const configRef = useRef(config)\n configRef.current = config\n\n /** H5:触发 onRefresherStatusChange 回调(仅状态变化时触发) */\n const emitStatusChangeRef = useRef((status: RefreshStatus, dy: number) => {\n if (refreshStatusRef.current !== status) {\n refreshStatusRef.current = status\n configRef.current?.onRefresherStatusChange?.({ detail: { status, dy } })\n }\n })\n const isControlledRef = useRef(isControlled)\n isControlledRef.current = isControlled\n /** H5 顶栏悬浮时 List 传 0,触顶即 scrollTop<=0+阈值;否则由 List 传列表顶对应的 scrollTop */\n const scrollTopWhenAtTop = !supportsNativeRefresher && config ? scrollTopAtLogicalTop : 0\n const topThresholdPx = scrollTopWhenAtTop + AT_TOP_THRESHOLD\n const topThresholdPxRef = useRef(topThresholdPx)\n topThresholdPxRef.current = topThresholdPx\n\n // ========================================\n // 小程序:原生 refresher-* API\n // ========================================\n const scrollViewRefresherProps = config && supportsNativeRefresher ? {\n refresherEnabled: config.refresherEnabled ?? true,\n refresherThreshold: config.refresherThreshold ?? 45,\n refresherDefaultStyle: config.refresherDefaultStyle ?? 'black',\n refresherBackground: config.refresherBackground ?? '#fff',\n refresherTriggered: isRefreshing,\n } : {}\n\n const scrollViewRefresherHandlers = config && supportsNativeRefresher ? {\n onRefresherPulling: (e: any) => {\n config.onRefresherPulling?.({ detail: { deltaY: e.detail?.deltaY ?? 0 } })\n },\n onRefresherRefresh: async () => {\n if (!isControlled) setInternalRefreshing(true)\n try {\n await config.onRefresherRefresh?.()\n } finally {\n if (!isControlled) setInternalRefreshing(false)\n }\n },\n onRefresherRestore: () => config.onRefresherRestore?.(),\n onRefresherAbort: () => config.onRefresherAbort?.(),\n // 小程序特有事件:即将触发刷新(拖动超过 threshold 时)\n onRefresherWillRefresh: () => config.onRefresherWillRefresh?.(),\n // 小程序特有事件:下拉刷新状态变化\n onRefresherStatusChange: (e: any) => {\n config.onRefresherStatusChange?.({ detail: { status: e.detail?.status, dy: e.detail?.dy } })\n },\n } : {}\n\n // ========================================\n // H5:单一结构 + 原生 touch 监听(passive: false);refresherEnabled=false 时不挂\n // ========================================\n const addImperativeTouchListeners = React.useCallback((el: HTMLElement) => {\n if (supportsNativeRefresher || !configRef.current || !h5RefresherEnabled) return () => {}\n const scrollEl = el as HTMLDivElement\n const startY = { current: 0 }\n const startX = { current: 0 }\n const lastY = { current: 0 }\n let touchStartedAtTop = false\n let dragOnEdge = false\n let lastPull = 0\n /** 用于 onTouchEnd 判断是否触发刷新;刷新完成后必须置 0,否则下次点击(无 touchMove)会误用上次的 lastPull 再次触发 */\n const lastPullRef = { current: 0 }\n const pullAtReleaseRef = { current: 0 }\n const screenHeight = typeof window !== 'undefined' ? window.screen?.height ?? 600 : 600\n\n const setPull = (v: number) => {\n lastPull = v\n lastPullRef.current = v\n setPullDistanceRef.current(v)\n }\n\n const runBounceBack = (fromValue: number, onComplete?: () => void) => {\n if (rafRef.current != null) cancelAnimationFrame(rafRef.current)\n const startTime = performance.now()\n const animate = () => {\n const t = Math.min((performance.now() - startTime) / BOUNCE_MS, 1)\n const ease = 1 - Math.pow(1 - t, 3)\n const v = fromValue * (1 - ease)\n setPullDistanceRef.current(v)\n lastPullRef.current = v\n lastPull = v\n if (t < 1) {\n rafRef.current = requestAnimationFrame(animate)\n } else {\n setPullDistanceRef.current(0)\n // 修复闭包问题:使用 ref 获取最新值\n if (!isControlledRef.current) setInternalRefreshingRef.current(false)\n rafRef.current = null\n onComplete?.()\n }\n }\n rafRef.current = requestAnimationFrame(animate)\n }\n\n /** 未达阈值松手回弹结束:通知中止 */\n const runBounceBackAbort = (fromValue: number) => {\n if (rafRef.current != null) cancelAnimationFrame(rafRef.current)\n const startTime = performance.now()\n const animate = () => {\n const t = Math.min((performance.now() - startTime) / BOUNCE_MS, 1)\n const ease = 1 - Math.pow(1 - t, 3)\n const v = fromValue * (1 - ease)\n setPullDistanceRef.current(v)\n lastPullRef.current = v\n lastPull = v\n if (t < 1) rafRef.current = requestAnimationFrame(animate)\n else {\n setPullDistanceRef.current(0)\n rafRef.current = null\n lastPullRef.current = 0\n lastPull = 0\n configRef.current?.onRefresherAbort?.()\n // 状态变化:回到 Idle\n emitStatusChangeRef.current(RefreshStatus.Idle, 0)\n }\n }\n rafRef.current = requestAnimationFrame(animate)\n }\n\n /** 先动画到 refresherHeight(加载中保持高度),再执行刷新,完成后回弹;与 2.x release 时 setContentStyle(distanceToRefresh+1) 一致 */\n const runBounceToLoading = (fromValue: number, toValue: number, onReach: () => void) => {\n if (rafRef.current != null) cancelAnimationFrame(rafRef.current)\n const startTime = performance.now()\n const animate = () => {\n const t = Math.min((performance.now() - startTime) / BOUNCE_MS, 1)\n const ease = 1 - Math.pow(1 - t, 3)\n setPullDistanceRef.current(fromValue + (toValue - fromValue) * ease)\n if (t < 1) {\n rafRef.current = requestAnimationFrame(animate)\n } else {\n setPullDistanceRef.current(toValue)\n rafRef.current = null\n onReach()\n }\n }\n rafRef.current = requestAnimationFrame(animate)\n }\n\n const isEdge = () => (scrollEl.scrollTop ?? 0) <= topThresholdPxRef.current\n\n const onTouchStart = (e: TouchEvent) => {\n if (refreshingLockRef.current || isRefreshingRef.current) return\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current)\n rafRef.current = null\n }\n lastPull = lastPullRef.current\n touchStartedAtTop = isEdge()\n const t0 = e.touches[0]\n if (t0) {\n startY.current = t0.clientY\n startX.current = t0.clientX\n lastY.current = t0.clientY\n }\n }\n\n const onTouchMove = (ev: TouchEvent) => {\n if (refreshingLockRef.current || isRefreshingRef.current) return\n const touch = ev.touches[0]\n if (!touch) return\n const currentY = touch.clientY\n const currentX = touch.clientX\n if (!touchStartedAtTop || !isEdge()) {\n setPull(0)\n dragOnEdge = false\n return\n }\n\n const dy = currentY - lastY.current\n // 还没进入下拉拖拽阶段(dragOnEdge=false)时,先看第一下是往上还是往下:\n // - 第一笔就是往上滑(dy<=0):视为正常滚动,直接交给原生 Scroll,不拦截、不启动下拉逻辑\n // - 第一笔是往下滑(dy>0):才认为是一次「下拉刷新」手势,进入拖拽模式\n if (!dragOnEdge) {\n if (dy <= 0) {\n lastY.current = currentY\n startY.current = currentY\n startX.current = currentX\n return\n }\n // 真正开始下拉刷新\n dragOnEdge = true\n startY.current = currentY\n startX.current = currentX\n }\n\n if (ev.cancelable) ev.preventDefault()\n const totalMove = currentY - startY.current\n const dx = currentX - startX.current\n if (dy <= 0) {\n lastY.current = currentY\n const next = Math.max(0, lastPull + dy)\n setPull(next)\n return\n }\n const deg = Math.atan(Math.abs(dx) / dy) * (180 / Math.PI)\n if (deg > DEG_LIMIT) {\n startY.current = currentY\n startX.current = currentX\n lastY.current = currentY\n return\n }\n lastY.current = currentY\n const damped = dampIncrement(dy, totalMove, lastPull, screenHeight)\n const next = Math.min(lastPull + damped, DISTANCE_Y_MAX_LIMIT)\n setPull(next)\n configRef.current?.onRefresherPulling?.({ detail: { deltaY: next } })\n if (next >= thresholdRef.current) {\n configRef.current?.onRefresherWillRefresh?.()\n emitStatusChangeRef.current(RefreshStatus.CanRefresh, next)\n } else {\n emitStatusChangeRef.current(RefreshStatus.Idle, next)\n }\n }\n\n const runRefresh = () => {\n const cfg = configRef.current\n if (!cfg || refreshingLockRef.current || isRefreshingRef.current) return\n refreshingLockRef.current = true\n const pullValue = lastPull\n const height = DEFAULT_REFRESHER_HEIGHT\n pullAtReleaseRef.current = pullValue\n if (!isControlledRef.current) setInternalRefreshingRef.current(true)\n // 状态变化:Refreshing\n emitStatusChangeRef.current(RefreshStatus.Refreshing, pullValue)\n runBounceToLoading(pullValue, height, () => {\n const safeReset = () => {\n setPullDistanceRef.current(0)\n if (!isControlledRef.current) setInternalRefreshingRef.current(false)\n refreshingLockRef.current = false\n lastPullRef.current = 0\n lastPull = 0\n pullAtReleaseRef.current = 0\n configRef.current?.onRefresherRestore?.()\n // 状态变化:回到 Idle\n emitStatusChangeRef.current(RefreshStatus.Idle, 0)\n }\n const timeoutId = setTimeout(safeReset, BOUNCE_MS + 400)\n Promise.resolve(configRef.current?.onRefresherRefresh?.())\n .then(\n () => {\n // 若已经通过 safeReset 提前结束刷新(例如超时),则不再执行回弹动画,避免二次「吐舌头」闪现\n if (!refreshingLockRef.current) return\n // 状态变化:Completed\n emitStatusChangeRef.current(RefreshStatus.Completed, DEFAULT_REFRESHER_HEIGHT)\n requestAnimationFrame(() =>\n runBounceBack(DEFAULT_REFRESHER_HEIGHT, () => {\n clearTimeout(timeoutId)\n refreshingLockRef.current = false\n lastPullRef.current = 0\n lastPull = 0\n pullAtReleaseRef.current = 0\n configRef.current?.onRefresherRestore?.()\n // 状态变化:回到 Idle\n emitStatusChangeRef.current(RefreshStatus.Idle, 0)\n })\n )\n },\n () => {\n clearTimeout(timeoutId)\n safeReset()\n }\n )\n })\n }\n\n const onTouchEnd = () => {\n if (refreshingLockRef.current) return\n dragOnEdge = false\n const current = lastPullRef.current\n if (current >= thresholdRef.current) {\n runRefresh()\n } else {\n if (current > 0) {\n runBounceBackAbort(current)\n }\n }\n }\n\n const optsMove = { passive: false, capture: true }\n const optsEnd = { passive: true, capture: true }\n el.addEventListener('touchstart', onTouchStart, { passive: true })\n el.addEventListener('touchmove', onTouchMove, optsMove)\n el.addEventListener('touchend', onTouchEnd, optsEnd)\n el.addEventListener('touchcancel', onTouchEnd, optsEnd)\n return () => {\n if (rafRef.current != null) cancelAnimationFrame(rafRef.current)\n el.removeEventListener('touchstart', onTouchStart)\n el.removeEventListener('touchmove', onTouchMove, optsMove)\n el.removeEventListener('touchend', onTouchEnd, optsEnd)\n el.removeEventListener('touchcancel', onTouchEnd, optsEnd)\n }\n }, [h5RefresherEnabled])\n\n const renderRefresherContent = useCallback(() => {\n if (!config) return null\n const threshold = config.refresherThreshold ?? 45\n const defaultStyle = config.refresherDefaultStyle ?? 'black'\n const background = config.refresherBackground ?? '#fff'\n const hasCustomChildren = config.children != null\n\n // 小程序:自定义内容时返回 Slot(name=refresher),避免 View 的 slot 属性在模板层被过滤\n // 样式对齐 H5:由内层 View 统一承载容器样式\n if (supportsNativeRefresher) {\n // 小程序需要名为 refresher 的插槽来指定自定义刷新内容\n return hasCustomChildren && defaultStyle === 'none'\n ? (\n <Slot\n name=\"refresher\"\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n zIndex: 0,\n }}\n >\n <View\n style={{\n width: '100%',\n flexShrink: 0,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background,\n }}\n >\n {config.children}\n </View>\n </Slot>\n )\n : null\n }\n\n // H5:refresherDefaultStyle 控制默认指示器样式(对齐小程序 black/white/none)\n // black=深色文案 white=浅色文案 none=仅展示 children,不展示默认「下拉/释放/加载中」\n const textColor = defaultStyle === 'white' ? '#fff' : defaultStyle === 'black' ? '#333' : undefined\n // 有自定义 children 且 style=none 时隐藏默认文字\n const showDefaultText = !(defaultStyle === 'none' && hasCustomChildren)\n const defaultText = showDefaultText\n ? (isRefreshing ? '加载中...' : pullDistance >= threshold ? '释放刷新' : '下拉刷新')\n : null\n\n return (\n <View\n style={{\n width: '100%',\n minHeight: hasCustomChildren ? undefined : DEFAULT_REFRESHER_HEIGHT,\n height: hasCustomChildren ? 'auto' : DEFAULT_REFRESHER_HEIGHT,\n flexShrink: 0,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background,\n }}\n data-testid=\"list-refresher\"\n >\n {hasCustomChildren ? config.children : (\n defaultText ? <View style={textColor ? { color: textColor } : undefined}>{defaultText}</View> : null\n )}\n </View>\n )\n }, [config, pullDistance, isRefreshing])\n\n // 受控 refresherTriggered:设为 true 时立即展示顶部加载指示器(对齐小程序:无需下拉即显示、固定在顶部)\n React.useEffect(() => {\n if (!isControlled || !config || config.refresherTriggered !== true) return\n if (pullDistanceRef.current >= DEFAULT_REFRESHER_HEIGHT) return\n setPullDistanceRef.current(DEFAULT_REFRESHER_HEIGHT)\n pullDistanceRef.current = DEFAULT_REFRESHER_HEIGHT\n // 触发 Refreshing 状态变化\n emitStatusChangeRef.current(RefreshStatus.Refreshing, DEFAULT_REFRESHER_HEIGHT)\n }, [isControlled, config?.refresherTriggered])\n\n // 受控 refresherTriggered:父组件设为 false 时同步回弹并清零\n const prevTriggeredRef = useRef(config?.refresherTriggered)\n React.useEffect(() => {\n if (!isControlled || !config || config.refresherTriggered !== false) {\n prevTriggeredRef.current = config?.refresherTriggered\n return\n }\n const prev = prevTriggeredRef.current\n prevTriggeredRef.current = false\n if (prev === true && (pullDistanceRef.current > 0 || isRefreshingRef.current)) {\n if (rafRef.current != null) cancelAnimationFrame(rafRef.current)\n const from = pullDistanceRef.current > 0 ? pullDistanceRef.current : DEFAULT_REFRESHER_HEIGHT\n // 触发 Completed 状态变化\n emitStatusChangeRef.current(RefreshStatus.Completed, from)\n const startTime = performance.now()\n const animate = () => {\n const t = Math.min((performance.now() - startTime) / BOUNCE_MS, 1)\n const ease = 1 - Math.pow(1 - t, 3)\n const v = from * (1 - ease)\n setPullDistanceRef.current(v)\n pullDistanceRef.current = v\n if (t < 1) rafRef.current = requestAnimationFrame(animate)\n else {\n setPullDistanceRef.current(0)\n pullDistanceRef.current = 0\n // 修复闭包问题:使用 ref 获取最新值\n if (!isControlledRef.current) setInternalRefreshingRef.current(false)\n rafRef.current = null\n config.onRefresherRestore?.()\n // 触发 Idle 状态变化\n emitStatusChangeRef.current(RefreshStatus.Idle, 0)\n }\n }\n rafRef.current = requestAnimationFrame(animate)\n }\n }, [isControlled, config?.refresherTriggered])\n\n return {\n scrollViewRefresherProps,\n scrollViewRefresherHandlers,\n h5RefresherProps: {\n touchHandlers: {},\n pullDistance,\n isRefreshing,\n showRefresherLayer: !supportsNativeRefresher && !!config && h5RefresherEnabled,\n },\n addImperativeTouchListeners: !supportsNativeRefresher && config && h5RefresherEnabled ? addImperativeTouchListeners : undefined,\n renderRefresherContent,\n }\n}\n"],"names":["_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"useRefresher.js","sources":["../../../../src/components/list/hooks/useRefresher.tsx"],"sourcesContent":["import { Slot, View } from '@tarojs/components'\nimport React, { useCallback, useRef, useState } from 'react'\n\nimport { supportsNativeRefresher } from '../utils'\n\n/**\n * List 组件内部的 refresher 配置类型(独立于 Refresher 组件)\n * 与 ScrollView refresher 相关属性语义对齐\n */\nexport interface ListRefresherConfig {\n refresherEnabled?: boolean\n refresherThreshold?: number\n refresherDefaultStyle?: 'black' | 'white' | 'none'\n refresherBackground?: string\n refresherTriggered?: boolean\n /** 自定义刷新内容(来自 Refresher 子组件的 children) */\n children?: React.ReactNode\n onRefresherPulling?: (e?: { detail?: { deltaY?: number } }) => void\n onRefresherRefresh?: () => void | Promise<void>\n onRefresherRestore?: () => void\n onRefresherAbort?: () => void\n onRefresherWillRefresh?: () => void\n onRefresherStatusChange?: (e?: { detail?: { status?: number, dy?: number } }) => void\n}\n\n/**\n * useRefresher - 平台适配的下拉刷新\n *\n * - 小程序:weapp / jd / tt 使用 ScrollView 原生 refresher-*\n * - H5:对齐 taro-components-react pull-down-refresh(2.x 同源)逻辑:触顶 + 增量拖拽 + 阻尼 + 释放保持高度再回弹\n */\n\nconst BOUNCE_MS = 300\nconst AT_TOP_THRESHOLD = 3\n/** 最大下拉距离(px) */\nconst DISTANCE_Y_MAX_LIMIT = 150\n/** 阻尼系数:超过此值不再累加位移,与 2.x default damping 一致 */\nconst DAMPING = 100\n/** 角度上限(度),小于此值才视为下拉意图 */\nconst DEG_LIMIT = 40\n/** 默认刷新层高度(对齐 Dynamic),无自定义 children 时使用 */\nexport const DEFAULT_REFRESHER_HEIGHT = 50\n\n/** 下拉刷新状态枚举(对齐微信小程序 RefreshStatus) */\nexport const enum RefreshStatus {\n /** 空闲 */\n Idle = 0,\n /** 超过下拉刷新阈值 */\n CanRefresh = 1,\n /** 刷新中 */\n Refreshing = 2,\n /** 刷新完成 */\n Completed = 3,\n /** 刷新失败 */\n Failed = 4,\n}\n\n/**\n * 单次位移的阻尼(与 2.x PullDownRefresh.damping 一致)\n * ratio = 已拖拽总距离 / 屏幕高度,damped = diff * (1 - ratio) * 0.6;且当已超过 DAMPING 时不再加\n */\nfunction dampIncrement(\n diff: number,\n totalMove: number,\n currentPull: number,\n screenHeight: number\n): number {\n if (diff <= 0) return 0\n if (currentPull >= DAMPING) return 0\n const ratio = Math.min(totalMove / screenHeight, 1)\n return diff * (1 - ratio) * 0.6\n}\n\ninterface UseRefresherReturn {\n scrollViewRefresherProps: {\n refresherEnabled?: boolean\n refresherThreshold?: number\n refresherDefaultStyle?: string\n refresherBackground?: string\n refresherTriggered?: boolean\n }\n scrollViewRefresherHandlers: {\n onRefresherPulling?: (e: any) => void\n onRefresherRefresh?: (e: any) => void\n onRefresherRestore?: () => void\n onRefresherAbort?: () => void\n }\n h5RefresherProps: {\n touchHandlers: Record<string, unknown>\n pullDistance: number\n isRefreshing: boolean\n /** H5 单结构下恒为 true,仅兼容旧类型 */\n showRefresherLayer: boolean\n }\n addImperativeTouchListeners?: (el: HTMLElement) => () => void\n renderRefresherContent: () => React.ReactNode | null\n}\n\nexport function useRefresher(\n config: ListRefresherConfig | null,\n /** 列表逻辑顶部对应的 scrollTop,用于触顶判断;H5「顶栏悬浮+只滚列表」时传 0,imperative 内以 DOM scrollTop 为准 */\n scrollTopAtLogicalTop: number,\n /** scrollElement 模式下可选:下拉起始点须在 List 内才触发刷新;未传时默认 true(沿用原逻辑) */\n getIsTouchInListArea?: (ev: TouchEvent) => boolean\n): UseRefresherReturn {\n const [internalRefreshing, setInternalRefreshing] = useState(false)\n const [pullDistance, setPullDistance] = useState(0)\n const pullDistanceRef = useRef(0)\n const rafRef = useRef<number | null>(null)\n const setPullDistanceRef = useRef(setPullDistance)\n const setInternalRefreshingRef = useRef(setInternalRefreshing)\n setPullDistanceRef.current = setPullDistance\n setInternalRefreshingRef.current = setInternalRefreshing\n pullDistanceRef.current = pullDistance\n\n const isControlled = typeof config?.refresherTriggered === 'boolean'\n const isRefreshing = isControlled ? (config?.refresherTriggered ?? false) : internalRefreshing\n const isRefreshingRef = useRef(isRefreshing)\n isRefreshingRef.current = isRefreshing\n /** 刷新中锁:runRefresh 内同步置 true,避免 setState 未重渲染前再次触摸触发刷新 */\n const refreshingLockRef = useRef(false)\n /** H5 当前刷新状态,用于 onRefresherStatusChange 避免重复触发 */\n const refreshStatusRef = useRef<RefreshStatus>(RefreshStatus.Idle)\n /** H5 是否启用下拉刷新:refresherEnabled === false 时不挂 touch、不显示顶栏 */\n const h5RefresherEnabled = !!config && config.refresherEnabled !== false\n\n /** touch 只挂一次,回调里读 ref 才能拿到最新配置,避免改预设后仍用旧值 */\n const thresholdRef = useRef(config?.refresherThreshold ?? 45)\n thresholdRef.current = config?.refresherThreshold ?? 45\n const configRef = useRef(config)\n configRef.current = config\n\n /** H5:触发 onRefresherStatusChange 回调(仅状态变化时触发) */\n const emitStatusChangeRef = useRef((status: RefreshStatus, dy: number) => {\n if (refreshStatusRef.current !== status) {\n refreshStatusRef.current = status\n configRef.current?.onRefresherStatusChange?.({ detail: { status, dy } })\n }\n })\n const isControlledRef = useRef(isControlled)\n isControlledRef.current = isControlled\n /** H5 顶栏悬浮时 List 传 0,触顶即 scrollTop<=0+阈值;否则由 List 传列表顶对应的 scrollTop */\n const scrollTopWhenAtTop = !supportsNativeRefresher && config ? scrollTopAtLogicalTop : 0\n const topThresholdPx = scrollTopWhenAtTop + AT_TOP_THRESHOLD\n const topThresholdPxRef = useRef(topThresholdPx)\n topThresholdPxRef.current = topThresholdPx\n\n const getIsTouchInListAreaRef = useRef(getIsTouchInListArea)\n getIsTouchInListAreaRef.current = getIsTouchInListArea\n\n // ========================================\n // 小程序:原生 refresher-* API\n // ========================================\n const scrollViewRefresherProps = config && supportsNativeRefresher ? {\n refresherEnabled: config.refresherEnabled ?? true,\n refresherThreshold: config.refresherThreshold ?? 45,\n refresherDefaultStyle: config.refresherDefaultStyle ?? 'black',\n refresherBackground: config.refresherBackground ?? '#fff',\n refresherTriggered: isRefreshing,\n } : {}\n\n const scrollViewRefresherHandlers = config && supportsNativeRefresher ? {\n onRefresherPulling: (e: any) => {\n config.onRefresherPulling?.({ detail: { deltaY: e.detail?.deltaY ?? 0 } })\n },\n onRefresherRefresh: async () => {\n if (!isControlled) setInternalRefreshing(true)\n try {\n await config.onRefresherRefresh?.()\n } finally {\n if (!isControlled) setInternalRefreshing(false)\n }\n },\n onRefresherRestore: () => config.onRefresherRestore?.(),\n onRefresherAbort: () => config.onRefresherAbort?.(),\n // 小程序特有事件:即将触发刷新(拖动超过 threshold 时)\n onRefresherWillRefresh: () => config.onRefresherWillRefresh?.(),\n // 小程序特有事件:下拉刷新状态变化\n onRefresherStatusChange: (e: any) => {\n config.onRefresherStatusChange?.({ detail: { status: e.detail?.status, dy: e.detail?.dy } })\n },\n } : {}\n\n // ========================================\n // H5:单一结构 + 原生 touch 监听(passive: false);refresherEnabled=false 时不挂\n // ========================================\n const addImperativeTouchListeners = React.useCallback((el: HTMLElement) => {\n if (supportsNativeRefresher || !configRef.current || !h5RefresherEnabled) return () => {}\n const scrollEl = el as HTMLDivElement\n const startY = { current: 0 }\n const startX = { current: 0 }\n const lastY = { current: 0 }\n let touchStartedAtTop = false\n /** 下拉起始点是否在 List 内(scrollElement 模式);未传 getIsTouchInListArea 时恒为 true */\n let touchStartedInListArea = true\n let dragOnEdge = false\n let lastPull = 0\n /** 用于 onTouchEnd 判断是否触发刷新;刷新完成后必须置 0,否则下次点击(无 touchMove)会误用上次的 lastPull 再次触发 */\n const lastPullRef = { current: 0 }\n const pullAtReleaseRef = { current: 0 }\n const screenHeight = typeof window !== 'undefined' ? window.screen?.height ?? 600 : 600\n\n const setPull = (v: number) => {\n lastPull = v\n lastPullRef.current = v\n setPullDistanceRef.current(v)\n }\n\n const runBounceBack = (fromValue: number, onComplete?: () => void) => {\n if (rafRef.current != null) cancelAnimationFrame(rafRef.current)\n const startTime = performance.now()\n const animate = () => {\n const t = Math.min((performance.now() - startTime) / BOUNCE_MS, 1)\n const ease = 1 - Math.pow(1 - t, 3)\n const v = fromValue * (1 - ease)\n setPullDistanceRef.current(v)\n lastPullRef.current = v\n lastPull = v\n if (t < 1) {\n rafRef.current = requestAnimationFrame(animate)\n } else {\n setPullDistanceRef.current(0)\n // 修复闭包问题:使用 ref 获取最新值\n if (!isControlledRef.current) setInternalRefreshingRef.current(false)\n rafRef.current = null\n onComplete?.()\n }\n }\n rafRef.current = requestAnimationFrame(animate)\n }\n\n /** 未达阈值松手回弹结束:通知中止 */\n const runBounceBackAbort = (fromValue: number) => {\n if (rafRef.current != null) cancelAnimationFrame(rafRef.current)\n const startTime = performance.now()\n const animate = () => {\n const t = Math.min((performance.now() - startTime) / BOUNCE_MS, 1)\n const ease = 1 - Math.pow(1 - t, 3)\n const v = fromValue * (1 - ease)\n setPullDistanceRef.current(v)\n lastPullRef.current = v\n lastPull = v\n if (t < 1) rafRef.current = requestAnimationFrame(animate)\n else {\n setPullDistanceRef.current(0)\n rafRef.current = null\n lastPullRef.current = 0\n lastPull = 0\n configRef.current?.onRefresherAbort?.()\n // 状态变化:回到 Idle\n emitStatusChangeRef.current(RefreshStatus.Idle, 0)\n }\n }\n rafRef.current = requestAnimationFrame(animate)\n }\n\n /** 先动画到 refresherHeight(加载中保持高度),再执行刷新,完成后回弹;与 2.x release 时 setContentStyle(distanceToRefresh+1) 一致 */\n const runBounceToLoading = (fromValue: number, toValue: number, onReach: () => void) => {\n if (rafRef.current != null) cancelAnimationFrame(rafRef.current)\n const startTime = performance.now()\n const animate = () => {\n const t = Math.min((performance.now() - startTime) / BOUNCE_MS, 1)\n const ease = 1 - Math.pow(1 - t, 3)\n setPullDistanceRef.current(fromValue + (toValue - fromValue) * ease)\n if (t < 1) {\n rafRef.current = requestAnimationFrame(animate)\n } else {\n setPullDistanceRef.current(toValue)\n rafRef.current = null\n onReach()\n }\n }\n rafRef.current = requestAnimationFrame(animate)\n }\n\n const isEdge = () => (scrollEl.scrollTop ?? 0) <= topThresholdPxRef.current\n\n const onTouchStart = (e: TouchEvent) => {\n if (refreshingLockRef.current || isRefreshingRef.current) return\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current)\n rafRef.current = null\n }\n lastPull = lastPullRef.current\n touchStartedAtTop = isEdge()\n touchStartedInListArea = getIsTouchInListAreaRef.current?.(e) ?? true\n const t0 = e.touches[0]\n if (t0) {\n startY.current = t0.clientY\n startX.current = t0.clientX\n lastY.current = t0.clientY\n }\n }\n\n const onTouchMove = (ev: TouchEvent) => {\n if (refreshingLockRef.current || isRefreshingRef.current) return\n if (!touchStartedInListArea) return\n const touch = ev.touches[0]\n if (!touch) return\n const currentY = touch.clientY\n const currentX = touch.clientX\n if (!isEdge()) {\n setPull(0)\n dragOnEdge = false\n return\n }\n // 到顶后:若 touch 开始时不在顶部,在首次下拉(dy>0)时「采纳」该手势,使同一手势内滚到顶后继续下拉可触发刷新\n if (!touchStartedAtTop && !dragOnEdge) {\n const dyCheck = currentY - lastY.current\n if (dyCheck <= 0) return\n touchStartedAtTop = true\n // 重置起点,避免采纳时 dy 过大导致刷新层瞬间拉满\n startY.current = currentY\n startX.current = currentX\n lastY.current = currentY\n }\n\n const dy = currentY - lastY.current\n // 还没进入下拉拖拽阶段(dragOnEdge=false)时,先看第一下是往上还是往下:\n // - 第一笔就是往上滑(dy<=0):视为正常滚动,直接交给原生 Scroll,不拦截、不启动下拉逻辑\n // - 第一笔是往下滑(dy>0):才认为是一次「下拉刷新」手势,进入拖拽模式\n if (!dragOnEdge) {\n if (dy <= 0) {\n lastY.current = currentY\n startY.current = currentY\n startX.current = currentX\n return\n }\n // 真正开始下拉刷新\n dragOnEdge = true\n startY.current = currentY\n startX.current = currentX\n }\n\n if (ev.cancelable) ev.preventDefault()\n const totalMove = currentY - startY.current\n const dx = currentX - startX.current\n if (dy <= 0) {\n lastY.current = currentY\n const next = Math.max(0, lastPull + dy)\n setPull(next)\n return\n }\n const deg = Math.atan(Math.abs(dx) / dy) * (180 / Math.PI)\n if (deg > DEG_LIMIT) {\n startY.current = currentY\n startX.current = currentX\n lastY.current = currentY\n return\n }\n lastY.current = currentY\n const damped = dampIncrement(dy, totalMove, lastPull, screenHeight)\n const next = Math.min(lastPull + damped, DISTANCE_Y_MAX_LIMIT)\n setPull(next)\n configRef.current?.onRefresherPulling?.({ detail: { deltaY: next } })\n if (next >= thresholdRef.current) {\n configRef.current?.onRefresherWillRefresh?.()\n emitStatusChangeRef.current(RefreshStatus.CanRefresh, next)\n } else {\n emitStatusChangeRef.current(RefreshStatus.Idle, next)\n }\n }\n\n const runRefresh = () => {\n const cfg = configRef.current\n if (!cfg || refreshingLockRef.current || isRefreshingRef.current) return\n refreshingLockRef.current = true\n const pullValue = lastPull\n const height = DEFAULT_REFRESHER_HEIGHT\n pullAtReleaseRef.current = pullValue\n if (!isControlledRef.current) setInternalRefreshingRef.current(true)\n // 状态变化:Refreshing\n emitStatusChangeRef.current(RefreshStatus.Refreshing, pullValue)\n runBounceToLoading(pullValue, height, () => {\n const safeReset = () => {\n setPullDistanceRef.current(0)\n if (!isControlledRef.current) setInternalRefreshingRef.current(false)\n refreshingLockRef.current = false\n lastPullRef.current = 0\n lastPull = 0\n pullAtReleaseRef.current = 0\n configRef.current?.onRefresherRestore?.()\n // 状态变化:回到 Idle\n emitStatusChangeRef.current(RefreshStatus.Idle, 0)\n }\n const timeoutId = setTimeout(safeReset, BOUNCE_MS + 400)\n Promise.resolve(configRef.current?.onRefresherRefresh?.())\n .then(\n () => {\n // 若已经通过 safeReset 提前结束刷新(例如超时),则不再执行回弹动画,避免二次「吐舌头」闪现\n if (!refreshingLockRef.current) return\n // 状态变化:Completed\n emitStatusChangeRef.current(RefreshStatus.Completed, DEFAULT_REFRESHER_HEIGHT)\n requestAnimationFrame(() =>\n runBounceBack(DEFAULT_REFRESHER_HEIGHT, () => {\n clearTimeout(timeoutId)\n refreshingLockRef.current = false\n lastPullRef.current = 0\n lastPull = 0\n pullAtReleaseRef.current = 0\n configRef.current?.onRefresherRestore?.()\n // 状态变化:回到 Idle\n emitStatusChangeRef.current(RefreshStatus.Idle, 0)\n })\n )\n },\n () => {\n clearTimeout(timeoutId)\n safeReset()\n }\n )\n })\n }\n\n const onTouchEnd = () => {\n if (refreshingLockRef.current) return\n if (!touchStartedInListArea) return\n dragOnEdge = false\n const current = lastPullRef.current\n if (current >= thresholdRef.current) {\n runRefresh()\n } else {\n if (current > 0) {\n runBounceBackAbort(current)\n }\n }\n }\n\n const optsMove = { passive: false, capture: true }\n const optsEnd = { passive: true, capture: true }\n el.addEventListener('touchstart', onTouchStart, { passive: true })\n el.addEventListener('touchmove', onTouchMove, optsMove)\n el.addEventListener('touchend', onTouchEnd, optsEnd)\n el.addEventListener('touchcancel', onTouchEnd, optsEnd)\n return () => {\n if (rafRef.current != null) cancelAnimationFrame(rafRef.current)\n el.removeEventListener('touchstart', onTouchStart)\n el.removeEventListener('touchmove', onTouchMove, optsMove)\n el.removeEventListener('touchend', onTouchEnd, optsEnd)\n el.removeEventListener('touchcancel', onTouchEnd, optsEnd)\n }\n }, [h5RefresherEnabled])\n\n const renderRefresherContent = useCallback(() => {\n if (!config) return null\n const threshold = config.refresherThreshold ?? 45\n const defaultStyle = config.refresherDefaultStyle ?? 'black'\n const background = config.refresherBackground ?? '#fff'\n const hasCustomChildren = config.children != null\n\n // 小程序:自定义内容时返回 Slot(name=refresher),避免 View 的 slot 属性在模板层被过滤\n // 样式对齐 H5:由内层 View 统一承载容器样式\n if (supportsNativeRefresher) {\n // 小程序需要名为 refresher 的插槽来指定自定义刷新内容\n return hasCustomChildren && defaultStyle === 'none'\n ? (\n <Slot\n name=\"refresher\"\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n zIndex: 0,\n }}\n >\n <View\n style={{\n width: '100%',\n flexShrink: 0,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background,\n }}\n >\n {config.children}\n </View>\n </Slot>\n )\n : null\n }\n\n // H5:refresherDefaultStyle 控制默认指示器样式(对齐小程序 black/white/none)\n // black=深色文案 white=浅色文案 none=仅展示 children,不展示默认「下拉/释放/加载中」\n const textColor = defaultStyle === 'white' ? '#fff' : defaultStyle === 'black' ? '#333' : undefined\n // 有自定义 children 且 style=none 时隐藏默认文字\n const showDefaultText = !(defaultStyle === 'none' && hasCustomChildren)\n const defaultText = showDefaultText\n ? (isRefreshing ? '加载中...' : pullDistance >= threshold ? '释放刷新' : '下拉刷新')\n : null\n\n return (\n <View\n style={{\n width: '100%',\n minHeight: hasCustomChildren ? undefined : DEFAULT_REFRESHER_HEIGHT,\n height: hasCustomChildren ? 'auto' : DEFAULT_REFRESHER_HEIGHT,\n flexShrink: 0,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background,\n }}\n >\n {hasCustomChildren ? config.children : (\n defaultText ? <View style={textColor ? { color: textColor } : undefined}>{defaultText}</View> : null\n )}\n </View>\n )\n }, [config, pullDistance, isRefreshing])\n\n // 受控 refresherTriggered:设为 true 时立即展示顶部加载指示器(对齐小程序:无需下拉即显示、固定在顶部)\n React.useEffect(() => {\n if (!isControlled || !config || config.refresherTriggered !== true) return\n if (pullDistanceRef.current >= DEFAULT_REFRESHER_HEIGHT) return\n setPullDistanceRef.current(DEFAULT_REFRESHER_HEIGHT)\n pullDistanceRef.current = DEFAULT_REFRESHER_HEIGHT\n // 触发 Refreshing 状态变化\n emitStatusChangeRef.current(RefreshStatus.Refreshing, DEFAULT_REFRESHER_HEIGHT)\n }, [isControlled, config?.refresherTriggered])\n\n // 受控 refresherTriggered:父组件设为 false 时同步回弹并清零\n const prevTriggeredRef = useRef(config?.refresherTriggered)\n React.useEffect(() => {\n if (!isControlled || !config || config.refresherTriggered !== false) {\n prevTriggeredRef.current = config?.refresherTriggered\n return\n }\n const prev = prevTriggeredRef.current\n prevTriggeredRef.current = false\n if (prev === true && (pullDistanceRef.current > 0 || isRefreshingRef.current)) {\n if (rafRef.current != null) cancelAnimationFrame(rafRef.current)\n const from = pullDistanceRef.current > 0 ? pullDistanceRef.current : DEFAULT_REFRESHER_HEIGHT\n // 触发 Completed 状态变化\n emitStatusChangeRef.current(RefreshStatus.Completed, from)\n const startTime = performance.now()\n const animate = () => {\n const t = Math.min((performance.now() - startTime) / BOUNCE_MS, 1)\n const ease = 1 - Math.pow(1 - t, 3)\n const v = from * (1 - ease)\n setPullDistanceRef.current(v)\n pullDistanceRef.current = v\n if (t < 1) rafRef.current = requestAnimationFrame(animate)\n else {\n setPullDistanceRef.current(0)\n pullDistanceRef.current = 0\n // 修复闭包问题:使用 ref 获取最新值\n if (!isControlledRef.current) setInternalRefreshingRef.current(false)\n rafRef.current = null\n config.onRefresherRestore?.()\n // 触发 Idle 状态变化\n emitStatusChangeRef.current(RefreshStatus.Idle, 0)\n }\n }\n rafRef.current = requestAnimationFrame(animate)\n }\n }, [isControlled, config?.refresherTriggered])\n\n return {\n scrollViewRefresherProps,\n scrollViewRefresherHandlers,\n h5RefresherProps: {\n touchHandlers: {},\n pullDistance,\n isRefreshing,\n showRefresherLayer: !supportsNativeRefresher && !!config && h5RefresherEnabled,\n },\n addImperativeTouchListeners: !supportsNativeRefresher && config && h5RefresherEnabled ? addImperativeTouchListeners : undefined,\n renderRefresherContent,\n }\n}\n"],"names":["_jsx"],"mappings":"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"}
@@ -70,6 +70,12 @@ export interface ListProps {
70
70
  dy?: number;
71
71
  };
72
72
  }) => void;
73
+ /** 滚动模式:default=自有 ScrollView;nested=使用父级滚动(需配合 scrollElement 或 Context) */
74
+ type?: 'default' | 'nested';
75
+ /** 自定义滚动容器 ref,type=nested 时从 props 或 Context 获取 */
76
+ scrollElement?: React.RefObject<HTMLElement | null>;
77
+ /** 任务 2.3:暴露滚动容器 ref,供内层 List/WaterFlow(type=nested)使用 */
78
+ scrollRef?: React.MutableRefObject<HTMLElement | null>;
73
79
  }
74
80
  export interface ListHandle {
75
81
  scroll: (options?: {
@@ -79,6 +85,14 @@ export interface ListHandle {
79
85
  }
80
86
  export declare function accumulate(arr: number[]): number[];
81
87
  export declare function isShaking(diffList: number[]): boolean;
88
+ /** 任务 4.1/4.2:List 内嵌 WaterFlow/List 时,向子组件提供 scrollRef、containerHeight、startOffset、reportNestedHeightChange */
89
+ export declare const ListScrollElementContext: React.Context<{
90
+ scrollRef: React.MutableRefObject<HTMLElement | null>;
91
+ containerHeight: number;
92
+ startOffset: number;
93
+ /** 任务 4.2:内层 WaterFlow 报告 scrollHeight 时调用,List 会加上 header 估算后更新 sizeCache */
94
+ reportNestedHeightChange?: (scrollHeight: number) => void;
95
+ }>;
82
96
  declare const List: React.ForwardRefExoticComponent<ListProps & React.RefAttributes<ListHandle>>;
83
97
  export { List, ListItem, NoMore, StickyHeader, StickySection };
84
98
  export default List;