@tarojs/components-advanced 4.1.12-beta.43 → 4.1.12-beta.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/list/hooks/useListNestedScroll.d.ts +1 -1
- package/dist/components/list/hooks/useListNestedScroll.js +2 -2
- package/dist/components/list/hooks/useListNestedScroll.js.map +1 -1
- package/dist/components/list/hooks/useListScrollElementAttachWeapp.d.ts +2 -1
- package/dist/components/list/hooks/useListScrollElementAttachWeapp.js +7 -6
- package/dist/components/list/hooks/useListScrollElementAttachWeapp.js.map +1 -1
- package/dist/components/list/hooks/useMeasureStartOffsetWeapp.d.ts +4 -4
- package/dist/components/list/hooks/useMeasureStartOffsetWeapp.js +30 -25
- package/dist/components/list/hooks/useMeasureStartOffsetWeapp.js.map +1 -1
- package/dist/components/list/hooks/useResizeObserver.d.ts +4 -2
- package/dist/components/list/hooks/useResizeObserver.js +7 -6
- package/dist/components/list/hooks/useResizeObserver.js.map +1 -1
- package/dist/components/list/index.d.ts +0 -2
- package/dist/components/list/index.js +7 -7
- package/dist/components/list/index.js.map +1 -1
- package/dist/components/list/utils.d.ts +11 -4
- package/dist/components/list/utils.js +18 -12
- package/dist/components/list/utils.js.map +1 -1
- package/dist/components/water-flow/flow-item.js +12 -7
- package/dist/components/water-flow/flow-item.js.map +1 -1
- package/dist/components/water-flow/node.d.ts +3 -0
- package/dist/components/water-flow/node.js +34 -1
- package/dist/components/water-flow/node.js.map +1 -1
- package/dist/components/water-flow/root.d.ts +4 -0
- package/dist/components/water-flow/root.js +37 -9
- package/dist/components/water-flow/root.js.map +1 -1
- package/dist/components/water-flow/section.d.ts +2 -0
- package/dist/components/water-flow/section.js +16 -9
- package/dist/components/water-flow/section.js.map +1 -1
- package/dist/components/water-flow/water-flow.js +26 -11
- package/dist/components/water-flow/water-flow.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/dom.d.ts +2 -2
- package/dist/utils/dom.js +7 -6
- package/dist/utils/dom.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/weapp-scope.d.ts +7 -0
- package/dist/utils/weapp-scope.js +20 -0
- package/dist/utils/weapp-scope.js.map +1 -0
- package/package.json +9 -9
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
import Taro from '@tarojs/taro';
|
|
2
|
+
import { weappScope } from '../../utils/weapp-scope.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* List 组件工具函数
|
|
5
6
|
*/
|
|
6
|
-
/**
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
/**
|
|
8
|
+
* 小程序:用 `weappScope(ref)` 取节点 `_scope`;有则 `createSelectorQuery().in(scope)`,无则不调 `in`。
|
|
9
|
+
* 与 WaterFlow、DongDesign jdpopover 同源,替代原先业务侧传入的 `selectorQueryScope`。
|
|
10
|
+
*/
|
|
11
|
+
function createSelectorQueryForRef(ref) {
|
|
12
|
+
const scope = weappScope(ref);
|
|
13
|
+
if (scope != null) {
|
|
14
|
+
return Taro.createSelectorQuery().in(scope);
|
|
10
15
|
}
|
|
11
|
-
|
|
12
|
-
return (instance === null || instance === void 0 ? void 0 : instance.page)
|
|
13
|
-
? Taro.createSelectorQuery().in(instance.page)
|
|
14
|
-
: Taro.createSelectorQuery();
|
|
16
|
+
return Taro.createSelectorQuery();
|
|
15
17
|
}
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* 仅用于 `Taro.createIntersectionObserver` 的第一个参数:优先 `weappScope(ref)`,无 `_scope` 时用当前 page。
|
|
20
|
+
* (微信要求 IO 挂在组件实例上;与旧实现里「未传 scope 时用 page」的兜底一致。)
|
|
21
|
+
*/
|
|
22
|
+
function getIntersectionObserverScopeForRef(ref) {
|
|
23
|
+
var _a;
|
|
24
|
+
return ((_a = weappScope(ref)) !== null && _a !== void 0 ? _a : Taro.getCurrentInstance().page);
|
|
19
25
|
}
|
|
20
26
|
/** 判断是否为微信小程序 */
|
|
21
27
|
const isWeapp = process.env.TARO_ENV === 'weapp';
|
|
@@ -31,5 +37,5 @@ const isMiniProgram = isWeapp || isAlipay || process.env.TARO_ENV === 'swan' ||
|
|
|
31
37
|
*/
|
|
32
38
|
const supportsNativeRefresher = isMiniProgram;
|
|
33
39
|
|
|
34
|
-
export {
|
|
40
|
+
export { createSelectorQueryForRef, getIntersectionObserverScopeForRef, isAlipay, isH5, isMiniProgram, isWeapp, supportsNativeRefresher };
|
|
35
41
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/components/list/utils.ts"],"sourcesContent":["/**\n * List 组件工具函数\n */\n\nimport Taro from '@tarojs/taro'\n\
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/components/list/utils.ts"],"sourcesContent":["/**\n * List 组件工具函数\n */\n\nimport Taro from '@tarojs/taro'\n\nimport { weappScope } from '../../utils/weapp-scope'\n\nimport type { RefObject } from 'react'\n\n/**\n * 小程序:用 `weappScope(ref)` 取节点 `_scope`;有则 `createSelectorQuery().in(scope)`,无则不调 `in`。\n * 与 WaterFlow、DongDesign jdpopover 同源,替代原先业务侧传入的 `selectorQueryScope`。\n */\nexport function createSelectorQueryForRef (\n ref: RefObject<any> | null | undefined\n) {\n const scope = weappScope(ref)\n if (scope != null) {\n return Taro.createSelectorQuery().in(scope as any)\n }\n return Taro.createSelectorQuery()\n}\n\n/**\n * 仅用于 `Taro.createIntersectionObserver` 的第一个参数:优先 `weappScope(ref)`,无 `_scope` 时用当前 page。\n * (微信要求 IO 挂在组件实例上;与旧实现里「未传 scope 时用 page」的兜底一致。)\n */\nexport function getIntersectionObserverScopeForRef (\n ref: RefObject<any> | null | undefined\n) {\n return (weappScope(ref) ?? Taro.getCurrentInstance().page) as any\n}\n\n/** 判断是否为微信小程序 */\nexport const isWeapp = process.env.TARO_ENV === 'weapp'\n\n/** 判断是否为支付宝小程序 */\nexport const isAlipay = process.env.TARO_ENV === 'alipay'\n\n/** 判断是否为 H5 */\nexport const isH5 = process.env.TARO_ENV === 'h5'\n\n/** 判断是否为小程序环境(微信/支付宝/百度/京东/头条等) */\nexport const isMiniProgram = isWeapp || isAlipay || process.env.TARO_ENV === 'swan' || process.env.TARO_ENV === 'tt' || process.env.TARO_ENV === 'jd'\n\n/**\n * 是否支持原生 refresher(ScrollView refresher-*)\n * 以各平台 components 为准:weapp/jd/tt 的 ScrollView 有 refresher-enabled 等;harmony-hybrid 的 harmony-definition 中 refresher-* 为 false,走自定义下拉\n */\nexport const supportsNativeRefresher = isMiniProgram\n"],"names":[],"mappings":";;;AAAA;;AAEG;AAQH;;;AAGG;AACG,SAAU,yBAAyB,CACvC,GAAsC,EAAA;AAEtC,IAAA,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC;AAC7B,IAAA,IAAI,KAAK,IAAI,IAAI,EAAE;QACjB,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,KAAY,CAAC;;AAEpD,IAAA,OAAO,IAAI,CAAC,mBAAmB,EAAE;AACnC;AAEA;;;AAGG;AACG,SAAU,kCAAkC,CAChD,GAAsC,EAAA;;AAEtC,IAAA,QAAQ,CAAA,EAAA,GAAA,UAAU,CAAC,GAAG,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI;AAC3D;AAEA;AACa,MAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK;AAEhD;AACa,MAAA,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK;AAEjD;AACa,MAAA,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK;AAE7C;AACO,MAAM,aAAa,GAAG,OAAO,IAAI,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK;AAEjJ;;;AAGG;AACI,MAAM,uBAAuB,GAAG;;;;"}
|
|
@@ -15,9 +15,7 @@ const useFlowItemPositioner = () => {
|
|
|
15
15
|
const scrollTop$ = useObservedAttr(nodeModel, 'scrollTop');
|
|
16
16
|
return {
|
|
17
17
|
resize: useMemoizedFn(() => {
|
|
18
|
-
|
|
19
|
-
nodeModel.pub(NodeEvents.Resize);
|
|
20
|
-
}
|
|
18
|
+
nodeModel.pub(NodeEvents.Resize);
|
|
21
19
|
}),
|
|
22
20
|
top: top$,
|
|
23
21
|
scrollTop: scrollTop$,
|
|
@@ -45,24 +43,31 @@ function FlowItemContainer(_a) {
|
|
|
45
43
|
}
|
|
46
44
|
return Object.assign(Object.assign({}, baseStyle), { height: height$ });
|
|
47
45
|
}, [top$, layouted$, height$]);
|
|
46
|
+
const setInnerMeasureRef = useMemoizedFn((el) => {
|
|
47
|
+
const innerRef = refFlowItem;
|
|
48
|
+
innerRef.current = el !== null && el !== void 0 ? el : undefined;
|
|
49
|
+
node.attachMeasureElement(el);
|
|
50
|
+
});
|
|
48
51
|
useEffect(() => {
|
|
49
52
|
let observer;
|
|
50
|
-
|
|
53
|
+
const el = refFlowItem.current;
|
|
54
|
+
if (isWeb() && typeof ResizeObserver !== 'undefined' && el) {
|
|
51
55
|
observer = new ResizeObserver(() => {
|
|
52
56
|
node.pub(NodeEvents.Resize);
|
|
53
57
|
});
|
|
54
|
-
observer.observe(
|
|
58
|
+
observer.observe(el);
|
|
55
59
|
}
|
|
56
60
|
return () => {
|
|
57
61
|
if (observer) {
|
|
58
62
|
observer.disconnect();
|
|
59
63
|
}
|
|
64
|
+
node.attachMeasureElement(null);
|
|
60
65
|
};
|
|
61
66
|
}, [node]);
|
|
62
67
|
useLayoutEffect(() => {
|
|
63
|
-
node.measure();
|
|
68
|
+
node.measure().catch(() => { });
|
|
64
69
|
}, [node]);
|
|
65
|
-
return createElement(View, { style: itemStyle, key: node.id }, createElement(View, { id: node.id, ref:
|
|
70
|
+
return createElement(View, { style: itemStyle, key: node.id }, createElement(View, { id: node.id, ref: setInnerMeasureRef }, createElement(FlowItemContext.Provider, { value: { node } }, children)));
|
|
66
71
|
}
|
|
67
72
|
function FlowItem(props) {
|
|
68
73
|
return props.children;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-item.js","sources":["../../../src/components/water-flow/flow-item.ts"],"sourcesContent":["import { View } from '@tarojs/components'\nimport {\n type CSSProperties,\n type PropsWithChildren,\n createContext,\n createElement,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react'\n\nimport { Node, NodeEvents } from './node'\nimport { useMemoizedFn } from './use-memoized-fn'\nimport { useObservedAttr } from './use-observed-attr'\nimport { isWeb } from './utils'\n\nimport type { FlowItemContainerProps } from './interface'\n\nconst FlowItemContext = createContext<{ node: Node }>(Object.create(null))\nexport const useFlowItemPositioner = () => {\n const nodeModel = useContext(FlowItemContext).node\n const width$ = useObservedAttr(nodeModel, 'width')\n const height$ = useObservedAttr(nodeModel, 'height')\n const top$ = useObservedAttr(nodeModel, 'top')\n const scrollTop$ = useObservedAttr(nodeModel, 'scrollTop')\n\n return {\n resize: useMemoizedFn(() => {\n
|
|
1
|
+
{"version":3,"file":"flow-item.js","sources":["../../../src/components/water-flow/flow-item.ts"],"sourcesContent":["import { View } from '@tarojs/components'\nimport {\n type CSSProperties,\n type PropsWithChildren,\n createContext,\n createElement,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react'\n\nimport { Node, NodeEvents } from './node'\nimport { useMemoizedFn } from './use-memoized-fn'\nimport { useObservedAttr } from './use-observed-attr'\nimport { isWeb } from './utils'\n\nimport type { FlowItemContainerProps } from './interface'\n\nconst FlowItemContext = createContext<{ node: Node }>(Object.create(null))\nexport const useFlowItemPositioner = () => {\n const nodeModel = useContext(FlowItemContext).node\n const width$ = useObservedAttr(nodeModel, 'width')\n const height$ = useObservedAttr(nodeModel, 'height')\n const top$ = useObservedAttr(nodeModel, 'top')\n const scrollTop$ = useObservedAttr(nodeModel, 'scrollTop')\n\n return {\n resize: useMemoizedFn(() => {\n nodeModel.pub(NodeEvents.Resize)\n }),\n top: top$,\n scrollTop: scrollTop$,\n width: width$,\n height: height$,\n }\n}\n\nexport function FlowItemContainer({\n children,\n ...props\n}: PropsWithChildren<FlowItemContainerProps>) {\n const { node } = props\n const layouted$ = useObservedAttr(node, 'layouted')\n const top$ = useObservedAttr(node, 'top')\n const height$ = useObservedAttr(node, 'height')\n const refFlowItem = useRef<HTMLElement>()\n\n const itemStyle: CSSProperties = useMemo(() => {\n const baseStyle: CSSProperties = {\n width: '100%',\n position: 'absolute',\n top: 0,\n left: 0,\n transform: `translate3d(0px, ${top$}px, 0px)`,\n }\n if (!layouted$) {\n return {\n ...baseStyle,\n minHeight: node.section.defaultSize,\n }\n }\n return {\n ...baseStyle,\n height: height$,\n }\n }, [top$, layouted$, height$])\n\n const setInnerMeasureRef = useMemoizedFn((el: HTMLElement | null) => {\n const innerRef = refFlowItem as React.MutableRefObject<HTMLElement | undefined>\n innerRef.current = el ?? undefined\n node.attachMeasureElement(el)\n })\n\n useEffect(() => {\n let observer: ResizeObserver\n const el = refFlowItem.current\n if (isWeb() && typeof ResizeObserver !== 'undefined' && el) {\n observer = new ResizeObserver(() => {\n node.pub(NodeEvents.Resize)\n })\n observer.observe(el)\n }\n return () => {\n if (observer) {\n observer.disconnect()\n }\n node.attachMeasureElement(null)\n }\n }, [node])\n\n useLayoutEffect(() => {\n node.measure().catch(() => {})\n }, [node])\n\n return createElement(\n View,\n { style: itemStyle, key: node.id },\n createElement(\n View,\n { id: node.id, ref: setInnerMeasureRef as any },\n createElement(FlowItemContext.Provider, { value: { node } }, children)\n )\n )\n}\n\nexport function FlowItem(props: PropsWithChildren) {\n return props.children\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,8 @@ export declare const NodeEvents: {
|
|
|
29
29
|
export declare class Node extends StatefulEventBus<NodeState> {
|
|
30
30
|
root: Root;
|
|
31
31
|
section: Section;
|
|
32
|
+
/** 小程序:测量用内层 View 的 DOM;H5:getBoundingClientRect 用 */
|
|
33
|
+
private _measureEl;
|
|
32
34
|
id: string;
|
|
33
35
|
/**
|
|
34
36
|
* 原始索引,即一维数组中的索引
|
|
@@ -43,6 +45,7 @@ export declare class Node extends StatefulEventBus<NodeState> {
|
|
|
43
45
|
*/
|
|
44
46
|
col: number;
|
|
45
47
|
constructor(root: Root, section: Section, props: NodeProps);
|
|
48
|
+
attachMeasureElement(el: HTMLElement | null): void;
|
|
46
49
|
private setupSubscriptions;
|
|
47
50
|
/**
|
|
48
51
|
* 测量节点的尺寸信息
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import '../../utils/index.js';
|
|
2
2
|
import { SectionEvents } from './section.js';
|
|
3
3
|
import { StatefulEventBus } from './stateful-event-bus.js';
|
|
4
|
+
import { isWeb, isWeapp } from './utils.js';
|
|
5
|
+
import { weappScope } from '../../utils/weapp-scope.js';
|
|
4
6
|
import { getRectSizeSync } from '../../utils/dom.js';
|
|
5
7
|
|
|
6
8
|
const NodeEvents = {
|
|
@@ -18,10 +20,15 @@ class Node extends StatefulEventBus {
|
|
|
18
20
|
});
|
|
19
21
|
this.root = root;
|
|
20
22
|
this.section = section;
|
|
23
|
+
/** 小程序:测量用内层 View 的 DOM;H5:getBoundingClientRect 用 */
|
|
24
|
+
this._measureEl = null;
|
|
21
25
|
const nodeId = `${root.id}-${section.id}-item-${childIndex}`;
|
|
22
26
|
Object.assign(this, { id: nodeId, childIndex, order, col });
|
|
23
27
|
this.setupSubscriptions();
|
|
24
28
|
}
|
|
29
|
+
attachMeasureElement(el) {
|
|
30
|
+
this._measureEl = el;
|
|
31
|
+
}
|
|
25
32
|
setupSubscriptions() {
|
|
26
33
|
this.sub('layouted', () => {
|
|
27
34
|
/**
|
|
@@ -56,7 +63,33 @@ class Node extends StatefulEventBus {
|
|
|
56
63
|
* 测量节点的尺寸信息
|
|
57
64
|
*/
|
|
58
65
|
async measure() {
|
|
59
|
-
|
|
66
|
+
let width;
|
|
67
|
+
let height;
|
|
68
|
+
if (isWeb() && this._measureEl) {
|
|
69
|
+
const r = this._measureEl.getBoundingClientRect();
|
|
70
|
+
width = r.width;
|
|
71
|
+
height = r.height;
|
|
72
|
+
}
|
|
73
|
+
else if (isWeapp && this._measureEl) {
|
|
74
|
+
const scope = weappScope({ current: this._measureEl });
|
|
75
|
+
const res = await getRectSizeSync(`#${this.id}`, 100, 3, scope);
|
|
76
|
+
width = res.width;
|
|
77
|
+
height = res.height;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
const res = await getRectSizeSync(`#${this.id}`, 100, 3);
|
|
81
|
+
width = res.width;
|
|
82
|
+
height = res.height;
|
|
83
|
+
}
|
|
84
|
+
if (typeof width !== 'number' ||
|
|
85
|
+
typeof height !== 'number' ||
|
|
86
|
+
!Number.isFinite(width) ||
|
|
87
|
+
!Number.isFinite(height) ||
|
|
88
|
+
width <= 0 ||
|
|
89
|
+
height <= 0) {
|
|
90
|
+
const s = this.getState();
|
|
91
|
+
return { width: s.width, height: s.height };
|
|
92
|
+
}
|
|
60
93
|
this.setStateBatch({
|
|
61
94
|
width,
|
|
62
95
|
height,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sources":["../../../src/components/water-flow/node.ts"],"sourcesContent":["import { getRectSizeSync } from '../../utils'\nimport { Root } from './root'\nimport { Section, SectionEvents } from './section'\nimport { StatefulEventBus } from './stateful-event-bus'\n\ninterface NodeProps {\n /**\n * 原始索引,即一维数组中的索引\n */\n childIndex: number\n /**\n * 在列里的顺序\n */\n order: number\n /**\n * 位于哪一列\n */\n col: number\n height: number\n}\n\ntype NodeState = {\n top: number\n width: number\n height: number\n layouted: boolean\n scrollTop: number\n};\n\nexport const NodeEvents = {\n Resize: Symbol.for('resize'),\n}\n\nexport class Node extends StatefulEventBus<NodeState> {\n id: string\n /**\n * 原始索引,即一维数组中的索引\n */\n childIndex: number\n /**\n * 在列里的顺序\n */\n order: number\n /**\n * 位于哪一列\n */\n col: number\n constructor(public root: Root, public section: Section, props: NodeProps) {\n const { height, childIndex, order, col } = props\n super({\n top: 0,\n width: 0,\n height,\n scrollTop: 0,\n layouted: false,\n })\n const nodeId = `${root.id}-${section.id}-item-${childIndex}`\n Object.assign(this, { id: nodeId, childIndex, order, col })\n this.setupSubscriptions()\n }\n\n private setupSubscriptions() {\n this.sub('layouted', () => {\n /**\n * 如果当前分组所有的节点都完成布局计算,那么向分组推送 `AllNodesLayouted` 事件,section会在这个时机做一些计算\n */\n if (\n [...this.section.nodes.values()].every(\n (node) => node.getState().layouted\n )\n ) {\n this.section.notify(SectionEvents.AllNodesLayouted)\n }\n })\n\n /**\n * 如果节点的尺寸发生了变化(这通常出现在节点内容包含网络数据的情况下,比如图片,这时要求用户调用 useFlowItemPositioner 返回的 resize 方法通知数据模型去重新计算布局)\n *\n * - 更新当前节点所在列之后的所有节点的位置信息\n *\n * - 通知 section 更新布局\n */\n this.sub(NodeEvents.Resize, async () => {\n const { width, height } = this.getState()\n const newSize = await this.measure()\n if (newSize.height === height && newSize.width === width) {\n return\n }\n this.updateBehindNodesPosition()\n this.section.pub(SectionEvents.Resize, {\n node: this,\n newSize,\n originalSize: { width, height },\n })\n })\n }\n\n /**\n * 测量节点的尺寸信息\n */\n public async measure() {\n const {
|
|
1
|
+
{"version":3,"file":"node.js","sources":["../../../src/components/water-flow/node.ts"],"sourcesContent":["import { getRectSizeSync, weappScope } from '../../utils'\nimport { Root } from './root'\nimport { Section, SectionEvents } from './section'\nimport { StatefulEventBus } from './stateful-event-bus'\nimport { isWeapp, isWeb } from './utils'\n\ninterface NodeProps {\n /**\n * 原始索引,即一维数组中的索引\n */\n childIndex: number\n /**\n * 在列里的顺序\n */\n order: number\n /**\n * 位于哪一列\n */\n col: number\n height: number\n}\n\ntype NodeState = {\n top: number\n width: number\n height: number\n layouted: boolean\n scrollTop: number\n};\n\nexport const NodeEvents = {\n Resize: Symbol.for('resize'),\n}\n\nexport class Node extends StatefulEventBus<NodeState> {\n /** 小程序:测量用内层 View 的 DOM;H5:getBoundingClientRect 用 */\n private _measureEl: HTMLElement | null = null\n\n id: string\n /**\n * 原始索引,即一维数组中的索引\n */\n childIndex: number\n /**\n * 在列里的顺序\n */\n order: number\n /**\n * 位于哪一列\n */\n col: number\n constructor(public root: Root, public section: Section, props: NodeProps) {\n const { height, childIndex, order, col } = props\n super({\n top: 0,\n width: 0,\n height,\n scrollTop: 0,\n layouted: false,\n })\n const nodeId = `${root.id}-${section.id}-item-${childIndex}`\n Object.assign(this, { id: nodeId, childIndex, order, col })\n this.setupSubscriptions()\n }\n\n attachMeasureElement (el: HTMLElement | null) {\n this._measureEl = el\n }\n\n private setupSubscriptions() {\n this.sub('layouted', () => {\n /**\n * 如果当前分组所有的节点都完成布局计算,那么向分组推送 `AllNodesLayouted` 事件,section会在这个时机做一些计算\n */\n if (\n [...this.section.nodes.values()].every(\n (node) => node.getState().layouted\n )\n ) {\n this.section.notify(SectionEvents.AllNodesLayouted)\n }\n })\n\n /**\n * 如果节点的尺寸发生了变化(这通常出现在节点内容包含网络数据的情况下,比如图片,这时要求用户调用 useFlowItemPositioner 返回的 resize 方法通知数据模型去重新计算布局)\n *\n * - 更新当前节点所在列之后的所有节点的位置信息\n *\n * - 通知 section 更新布局\n */\n this.sub(NodeEvents.Resize, async () => {\n const { width, height } = this.getState()\n const newSize = await this.measure()\n if (newSize.height === height && newSize.width === width) {\n return\n }\n this.updateBehindNodesPosition()\n this.section.pub(SectionEvents.Resize, {\n node: this,\n newSize,\n originalSize: { width, height },\n })\n })\n }\n\n /**\n * 测量节点的尺寸信息\n */\n public async measure() {\n let width: number | undefined\n let height: number | undefined\n if (isWeb() && this._measureEl) {\n const r = this._measureEl.getBoundingClientRect()\n width = r.width\n height = r.height\n } else if (isWeapp && this._measureEl) {\n const scope = weappScope({ current: this._measureEl as any })\n const res = await getRectSizeSync(`#${this.id}`, 100, 3, scope)\n width = res.width\n height = res.height\n } else {\n const res = await getRectSizeSync(`#${this.id}`, 100, 3)\n width = res.width\n height = res.height\n }\n if (\n typeof width !== 'number' ||\n typeof height !== 'number' ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n const s = this.getState()\n return { width: s.width, height: s.height }\n }\n this.setStateBatch({\n width,\n height,\n layouted: true,\n })\n return { width, height }\n }\n\n /**\n * 更新节点所在列后面的节点的位置\n */\n updateBehindNodesPosition() {\n const currentColumn = this.section.columnMap[this.col]\n let start = this.order + 1\n\n if (start > currentColumn.length - 1) {\n return\n }\n for (; start < currentColumn.length; start++) {\n const node = currentColumn[start]\n const previousNode = currentColumn[start - 1]\n const {\n top: previousNodeTop,\n height: previousNodeHeight,\n scrollTop: previousNodeScrollTop,\n } = previousNode.getState()\n const rowGap = this.section.rowGap\n node.setStateBatch({\n top: previousNodeTop + previousNodeHeight + rowGap,\n scrollTop: previousNodeScrollTop + previousNodeHeight + rowGap,\n })\n }\n }\n\n /**\n * 节点是否可见\n */\n get isInRange() {\n const { scrollBoundaryStart, scrollBoundaryEnd } = this.root\n const { height: nodeHeight, scrollTop: nodeScrollTop } = this.getState()\n return (\n nodeScrollTop < scrollBoundaryEnd &&\n nodeScrollTop + nodeHeight > scrollBoundaryStart\n )\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -85,6 +85,10 @@ export declare class Root extends StatefulEventBus<RootState, Events> {
|
|
|
85
85
|
/** scrollHeight 更新防抖(raf),减轻 pushNodes 后测量前后的高度跳变 */
|
|
86
86
|
private _scrollHeightRafId;
|
|
87
87
|
constructor(props: RootProps);
|
|
88
|
+
/**
|
|
89
|
+
* 挂载后由 WaterFlow 调用:用当前根容器 DOM(与 #id 同节点或 ScrollView 外壳)测量 containerSize。
|
|
90
|
+
*/
|
|
91
|
+
measureContainerSize(measureEl: HTMLElement | null): Promise<void>;
|
|
88
92
|
/**
|
|
89
93
|
* 设置订阅事件
|
|
90
94
|
*/
|
|
@@ -2,7 +2,8 @@ import { cancelAnimationFrame, requestAnimationFrame } from '@tarojs/runtime';
|
|
|
2
2
|
import { nextTick } from '@tarojs/taro';
|
|
3
3
|
import '../../utils/index.js';
|
|
4
4
|
import { StatefulEventBus } from './stateful-event-bus.js';
|
|
5
|
-
import { getSysInfo, isSameRenderRange } from './utils.js';
|
|
5
|
+
import { getSysInfo, isH5, isWeapp, isSameRenderRange } from './utils.js';
|
|
6
|
+
import { weappScope } from '../../utils/weapp-scope.js';
|
|
6
7
|
import { getRectSizeSync } from '../../utils/dom.js';
|
|
7
8
|
|
|
8
9
|
/* eslint-disable no-labels */
|
|
@@ -83,16 +84,43 @@ class Root extends StatefulEventBus {
|
|
|
83
84
|
this.nodeCacheBackward = cacheCount;
|
|
84
85
|
this.nodeCacheForward = cacheCount;
|
|
85
86
|
this.setupSubscriptions();
|
|
86
|
-
if (!skipContainerMeasure) {
|
|
87
|
-
getRectSizeSync(`#${id}`, 100).then(({ width = windowWidth, height = windowHeight }) => {
|
|
88
|
-
this.setStateIn('containerSize', {
|
|
89
|
-
width,
|
|
90
|
-
height,
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
87
|
this.renderInitialLayout();
|
|
95
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* 挂载后由 WaterFlow 调用:用当前根容器 DOM(与 #id 同节点或 ScrollView 外壳)测量 containerSize。
|
|
91
|
+
*/
|
|
92
|
+
async measureContainerSize(measureEl) {
|
|
93
|
+
var _a, _b, _c, _d;
|
|
94
|
+
if (this.skipContainerMeasure)
|
|
95
|
+
return;
|
|
96
|
+
const { windowWidth, windowHeight } = getSysInfo();
|
|
97
|
+
let width = windowWidth;
|
|
98
|
+
let height = windowHeight;
|
|
99
|
+
if (isH5 && measureEl && typeof measureEl.getBoundingClientRect === 'function') {
|
|
100
|
+
const r = measureEl.getBoundingClientRect();
|
|
101
|
+
width = r.width;
|
|
102
|
+
height = r.height;
|
|
103
|
+
}
|
|
104
|
+
else if (isWeapp && measureEl) {
|
|
105
|
+
const scope = weappScope({ current: measureEl });
|
|
106
|
+
const res = await getRectSizeSync(`#${this.id}`, 100, 5, scope);
|
|
107
|
+
width = (_a = res.width) !== null && _a !== void 0 ? _a : width;
|
|
108
|
+
height = (_b = res.height) !== null && _b !== void 0 ? _b : height;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
const res = await getRectSizeSync(`#${this.id}`, 100, 5);
|
|
112
|
+
width = (_c = res.width) !== null && _c !== void 0 ? _c : width;
|
|
113
|
+
height = (_d = res.height) !== null && _d !== void 0 ? _d : height;
|
|
114
|
+
}
|
|
115
|
+
if (typeof width === 'number' &&
|
|
116
|
+
typeof height === 'number' &&
|
|
117
|
+
Number.isFinite(width) &&
|
|
118
|
+
Number.isFinite(height) &&
|
|
119
|
+
width > 0 &&
|
|
120
|
+
height > 0) {
|
|
121
|
+
this.setStateIn('containerSize', { width, height });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
96
124
|
/**
|
|
97
125
|
* 设置订阅事件
|
|
98
126
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.js","sources":["../../../src/components/water-flow/root.ts"],"sourcesContent":["/* eslint-disable no-labels */\nimport { cancelAnimationFrame, requestAnimationFrame } from '@tarojs/runtime'\nimport { nextTick } from '@tarojs/taro'\n\nimport { getRectSizeSync } from '../../utils'\nimport { Node } from './node'\nimport { Section } from './section'\nimport { StatefulEventBus } from './stateful-event-bus'\nimport { getSysInfo, isSameRenderRange } from './utils'\n\nimport type { BaseProps, ScrollDirection, Size, WaterFlowProps } from './interface'\n\nexport type RootProps = Pick<WaterFlowProps, 'cacheCount' | 'lowerThresholdCount' | 'upperThresholdCount'> &\nRequired<Pick<BaseProps, 'id'>> & {\n /** scrollElement 模式下为 true,不测量自有容器;此时需布局全部 section 以展开完整高度 */\n skipContainerMeasure?: boolean\n}\n\nconst { windowHeight, windowWidth } = getSysInfo()\n\ntype RootState = {\n /** 是否在滚动中 */\n isScrolling: boolean\n /** 滚动偏移量 */\n scrollOffset: number\n /**\n * 滚动方向\n *\n * - forward 向下滚动\n *\n * - backward 向上滚动\n */\n scrollDirection: ScrollDirection\n /** 滚动高度 */\n scrollHeight: number\n /** 容器的尺寸信息 */\n containerSize: Size\n /** 渲染的分组区间范围 */\n renderRange: [number, number]\n}\n\nexport const RootEvents = {\n ReachUpperThreshold: Symbol.for('ReachUpperThreshold'),\n ReachLowerThreshold: Symbol.for('ReachLowerThreshold'),\n Resize: Symbol.for('Resize'),\n AllSectionsLayouted: Symbol.for('AllSectionsLayouted'),\n InitialRenderCompleted: Symbol.for('InitialRenderCompleted'),\n}\n\ntype Events = keyof typeof RootEvents\n\n/**\n * 数据模型继承自有状态的事件总线,便于在节点之间通信,以及通过 useSyncExternalStore 关联 React 视图\n */\nexport class Root extends StatefulEventBus<RootState, Events> {\n /**\n * 瀑布流根节点唯一标识\n */\n id: string\n /**\n * 分组映射表,便于查找分组\n */\n sectionMap: Map<string, Section> = new Map()\n /**\n * 节点映射表,便于查找节点\n */\n nodeMap: Map<string, Node> = new Map()\n /**\n * 分组列表,基于计算出的渲染的分组区间范围 sections.slice(start, end + 1) 进行渲染\n */\n sections: Section[] = []\n /**\n * 设置预加载的 Item 条数(与 props.cacheCount 一致,收敛目标)。\n */\n cacheCount = 1\n\n /**\n * Node 层向上(列索引减小方向)预缓存条数,可与 cacheCount 不同(快速滑动单边放大)。\n */\n nodeCacheBackward = 1\n\n /**\n * Node 层向下(列索引增大方向)预缓存条数。\n */\n nodeCacheForward = 1\n\n upperThresholdCount = 0\n\n lowerThresholdCount = 0\n\n /**\n * 触发滚动阈值对应的 scrollTop 值\n */\n upperThresholdScrollTop = -Infinity\n\n /**\n * 触发滚动阈值对应的 scrollTop 值\n */\n lowerThresholdScrollTop = Infinity\n\n /** scrollElement 模式下为 true,需布局全部 section 以展开完整高度供父容器滚动 */\n skipContainerMeasure = false\n\n /** 当前是否处于触顶区域;初始为 true(起始在顶部),只有从 false→true 时才触发事件 */\n private _inUpperZone = true\n /** 当前是否处于触底区域;初始为 false */\n private _inLowerZone = false\n /** scrollHeight 更新防抖(raf),减轻 pushNodes 后测量前后的高度跳变 */\n private _scrollHeightRafId: number | null = null\n\n constructor(props: RootProps) {\n const { id, cacheCount, lowerThresholdCount, upperThresholdCount, skipContainerMeasure } = props\n super({\n isScrolling: false,\n scrollOffset: 0,\n scrollDirection: 'forward',\n scrollHeight: windowHeight,\n renderRange: [0, 0],\n containerSize: {\n width: windowWidth,\n height: windowHeight,\n },\n })\n Object.assign(this, {\n id,\n cacheCount,\n lowerThresholdCount,\n upperThresholdCount,\n skipContainerMeasure: !!skipContainerMeasure,\n })\n this.nodeCacheBackward = cacheCount\n this.nodeCacheForward = cacheCount\n this.setupSubscriptions()\n if (!skipContainerMeasure) {\n getRectSizeSync(`#${id}`, 100).then(({ width = windowWidth, height = windowHeight }) => {\n this.setStateIn('containerSize', {\n width,\n height,\n })\n })\n }\n this.renderInitialLayout()\n }\n\n /**\n * 设置订阅事件\n */\n private setupSubscriptions() {\n /** 滚动:先更新触底阈值,再判触顶/触底并更新分组与总高度,避免同一帧内沿用无效阈值。 */\n this.sub('scrollOffset', () => {\n const sectionSize = this.sections.length\n const lastSection = this.sections[sectionSize - 1]\n if (lastSection?.columnMap.every((column) => column[column.length - 1]?.getState().layouted)) {\n this.setLowerThresholdScrollTop()\n }\n this.setStateIn('renderRange', this.getSectionRenderRange())\n this.handleReachThreshold()\n this.updateScrollHeight()\n })\n\n this.sub(RootEvents.AllSectionsLayouted, () => {\n this.updateScrollHeight()\n this.setUpperThresholdScrollTop()\n this.setLowerThresholdScrollTop()\n })\n\n this.sub(RootEvents.Resize, () => {\n this.updateScrollHeight()\n this.setUpperThresholdScrollTop()\n this.setLowerThresholdScrollTop()\n })\n }\n\n /**\n * 渐进式渲染\n *\n * 因为初始没法知道每个分组的高度信息,不知道渲染边界,所以需要渐进式渲染\n *\n * 当目前的渲染批次的首个分组的scrollTop大于容器的高度,说明容器可视区域已经填满,没必要再往下渲染了\n *\n * @param [i=0] 从第几个分组开始渲染\n *\n */\n renderInitialLayout(i = 0) {\n nextTick(() => {\n const sectionSize = this.sections.length\n\n if (i >= sectionSize || i < 0) {\n this.pub(RootEvents.InitialRenderCompleted, null)\n return\n }\n const section = this.sections[i]\n section.layoutedSignal.promise.then(() => {\n this.setStateIn('renderRange', [0, i + 1 > sectionSize ? sectionSize - 1 : i + 1])\n // skipContainerMeasure(nestedScroll 模式):需布局全部 section,使 scrollHeight 展开供父容器滚动\n // default 模式:容器可视区域已填满则提前终止,减少首屏渲染\n if (\n !this.skipContainerMeasure &&\n section.getState().scrollTop > this.getState().containerSize.height\n ) {\n this.pub(RootEvents.InitialRenderCompleted, section)\n return\n }\n\n this.renderInitialLayout(i + 1)\n })\n })\n }\n\n /**\n * 计算滚动阈值对应的 scrollTop 并设置 upperThresholdScrollTop\n * 当距顶部还有 upperThresholdCount 个 FlowItem 时的 scrollTop 值\n */\n private setUpperThresholdScrollTop() {\n // 如果没有设置阈值或阈值为0,则返回0\n if (!this.upperThresholdCount) {\n this.upperThresholdScrollTop = 0\n return 0\n }\n const sectionSize = this.sections.length\n const tracker = Array.from(\n { length: sectionSize },\n () => new Map<number, { accCount: number, accHeight: number }>() // Map<列, { 当前列累计个数,当前列累计高度 }>\n )\n\n // 从第一个分组开始扫描\n loopSeciton: for (let i = 0; i < sectionSize; i++) {\n const section = this.sections[i]\n const sectionTracker = tracker[i]\n const columnMap = section.columnMap\n // 扫描当前分组的每一列\n for (let col = 0; col < columnMap.length; col++) {\n const column = columnMap[col]\n const columnSize = column.length\n if (!sectionTracker.has(col)) {\n if (i === 0) {\n sectionTracker.set(col, { accCount: 0, accHeight: 0 })\n } else {\n const previousSectionTracker = tracker[i - 1]\n sectionTracker.set(col, {\n accCount: Math.max(...[...previousSectionTracker.values()].map((nodeTracker) => nodeTracker.accCount)),\n accHeight: section.getState().scrollTop,\n })\n }\n }\n const colTracker = sectionTracker.get(col)!\n // 扫描当前列的每一行\n loopItem: for (let j = 0; j < columnSize; j++) {\n colTracker.accCount += 1\n colTracker.accHeight += column[j].getState().height + (j === 0 ? 0 : section.rowGap)\n if (colTracker.accCount >= this.upperThresholdCount) {\n break loopItem\n }\n }\n }\n for (const [, colTracker] of sectionTracker) {\n if (colTracker.accCount >= this.upperThresholdCount) {\n this.upperThresholdScrollTop = colTracker.accHeight\n break loopSeciton\n }\n }\n }\n return this.upperThresholdScrollTop\n }\n\n /**\n * 计算滚动阈值对应的 scrollTop 并设置 lowerThresholdScrollTop\n * 当距底部还有 lowerThresholdCount 个 FlowItem 时的 scrollTop 值\n */\n private setLowerThresholdScrollTop() {\n // 与 setUpperThresholdScrollTop 一致:0 或 undefined 时用「内容底 - 容器高」作为触底阈值\n if (!this.lowerThresholdCount) {\n // 必须用 sectionRange 实时计算,避免依赖可能未更新的 scrollHeight 状态\n const range = this.sectionRange\n const totalHeight = range.length > 0 ? range[range.length - 1][1] : 0\n // 触底判定:scrollOffset + containerSize.height >= lowerThresholdScrollTop\n // 须存内容底边 totalHeight(H)。若误存 H-h,则顶部时 h 与 H-h 比较,当 2h>=H 会恒判为在触底区,误触 onScrollToLower。\n this.lowerThresholdScrollTop = totalHeight\n return 0\n }\n const sectionSize = this.sections.length\n const tracker = Array.from(\n { length: sectionSize },\n () => new Map<number, { accCount: number, scrollTop: number }>()\n )\n // 从最后一个分组开始计算\n loopSeciton: for (let i = sectionSize - 1; i >= 0; i--) {\n const section = this.sections[i]\n const sectionTracker = tracker[i]\n const columnMap = section.columnMap\n // 扫描当前分组的每一列\n for (let col = 0; col < columnMap.length; col++) {\n const column = columnMap[col]\n const columnSize = column.length\n if (!sectionTracker.has(col)) {\n if (i === sectionSize - 1) {\n sectionTracker.set(col, { accCount: 0, scrollTop: 0 })\n } else {\n const belowSectionTracker = tracker[i + 1]\n sectionTracker.set(col, {\n accCount: Math.max(...[...belowSectionTracker.values()].map((nodeTracker) => nodeTracker.accCount)),\n scrollTop: 0,\n })\n }\n }\n const colTracker = sectionTracker.get(col)!\n // 从当前列的最后一行开始往前扫描\n loopItem: for (let j = columnSize - 1; j >= 0; j--) {\n colTracker.accCount += 1\n colTracker.scrollTop = column[j].getState().scrollTop\n if (colTracker.accCount >= this.lowerThresholdCount) {\n break loopItem\n }\n }\n }\n\n for (const [, colTracker] of sectionTracker) {\n if (colTracker.accCount >= this.lowerThresholdCount) {\n this.lowerThresholdScrollTop = colTracker.scrollTop\n break loopSeciton\n }\n }\n }\n\n return this.lowerThresholdScrollTop\n }\n\n /**\n * 处理滚动到阈值的情况\n * 检测当前滚动位置是否达到了上下阈值,并触发相应的事件\n * scrollElement 模式:scrollOffset 为内容内偏移(scrollTop - startOffset),upper/lowerThresholdScrollTop 基于本组件内容计算,触顶/触底以本 WaterFlow 内容为基准\n */\n private handleReachThreshold() {\n const { scrollOffset, containerSize } = this.getState()\n const inUpper = this.upperThresholdScrollTop !== -Infinity && scrollOffset <= this.upperThresholdScrollTop\n const inLower = this.lowerThresholdScrollTop !== Infinity && scrollOffset + containerSize.height >= this.lowerThresholdScrollTop\n if (inUpper && !this._inUpperZone) this.pub(RootEvents.ReachUpperThreshold)\n if (inLower && !this._inLowerZone) this.pub(RootEvents.ReachLowerThreshold)\n this._inUpperZone = inUpper\n this._inLowerZone = inLower\n }\n\n /**\n * 列表追加并完成 finalize 后调用:重置触底边沿状态(_inLowerZone),\n * 使用户仍在底部时下一次滚动能再次触发 onScrollToLower,而不必先上滑再下滑。\n * 不在此处同步调用 handleReachThreshold,避免仍在底部时立刻连发触底(与误触区分)。\n */\n public resetLowerReachEdgeAfterContentChange () {\n this._inLowerZone = false\n }\n\n /**\n * 容器的滚动上边界\n */\n get scrollBoundaryStart() {\n return this.getState().scrollOffset\n }\n\n /**\n * 容器的滚动下边界\n */\n get scrollBoundaryEnd() {\n return this.scrollBoundaryStart + this.getStateIn('containerSize').height\n }\n\n /**\n * 计算每个section的底部位置\n *\n * sectionBottomRange = [ [section1.top, section1.bottom], [section2.top, section2.bottom], ..., [sectionN.top, sectionN.bottom] ]\n *\n * @returns [number,number][]\n */\n get sectionRange() {\n const length = this.sections.length\n if (length === 0) return []\n const range = Array.from({ length }, () => [0, this.sections[0].maxColumnHeight])\n for (let i = 1; i < length; i++) {\n const previous = range[i - 1]\n const prevSection = this.sections[i - 1]\n const gap = prevSection.rowGap ?? 0\n range[i] = [previous[1] + gap, previous[1] + gap + this.sections[i].maxColumnHeight]\n }\n\n return range\n }\n\n /**\n * 更新总滚动高度(各 Section 累计)。\n * @param immediate true 时跳过 raf 防抖(如 finalizePushNodesStateIfNeeded),避免高度滞后引起跳动\n */\n public updateScrollHeight(immediate = false) {\n const flush = () => {\n const next = this.sectionRange[this.sectionRange.length - 1]?.[1] ?? 0\n this.setStateIn('scrollHeight', next)\n }\n if (immediate) {\n if (this._scrollHeightRafId != null) {\n cancelAnimationFrame(this._scrollHeightRafId)\n this._scrollHeightRafId = null\n }\n flush()\n return\n }\n if (this._scrollHeightRafId != null) {\n cancelAnimationFrame(this._scrollHeightRafId)\n }\n this._scrollHeightRafId = requestAnimationFrame(() => {\n this._scrollHeightRafId = null\n flush()\n })\n }\n\n /**\n * 注册分组\n */\n public registerSection(section: Section) {\n const { id, order } = section\n this.sectionMap.set(id, section)\n this.sections[order] = section\n }\n\n /**\n * 注册节点\n */\n public registerNode(node: Node) {\n this.nodeMap.set(node.id, node)\n }\n\n /**\n * 查找分组\n */\n public findSection(id: string) {\n return this.sectionMap.get(id)\n }\n\n /**\n * 查找节点\n */\n public findNode(id: string) {\n return this.nodeMap.get(id)\n }\n\n /**\n * 设置 Node 层上下方向预缓存条数,并刷新可见分组内的列渲染区间。\n */\n public setNodeCacheRange (backward: number, forward: number) {\n const b = Math.max(0, Math.floor(backward))\n const f = Math.max(0, Math.floor(forward))\n if (this.nodeCacheBackward === b && this.nodeCacheForward === f) {\n return\n }\n this.nodeCacheBackward = b\n this.nodeCacheForward = f\n for (const section of this.sections) {\n if (section.isInRange) {\n section.setStateIn('renderRange', section.getNodeRenderRange())\n }\n }\n }\n\n /**\n * 获取分组渲染区间\n */\n public getSectionRenderRange() {\n const result: [number, number] = [Infinity, -Infinity]\n\n for (let i = 0; i < this.sections.length; i++) {\n const section = this.sections[i]\n if (section.isInRange) {\n result[0] = Math.min(result[0], i)\n result[1] = Math.max(result[1], i)\n }\n }\n\n if (result[0] === Infinity) {\n result[0] = 0\n }\n\n if (result[1] === -Infinity) {\n result[1] = this.sections.length - 1\n }\n\n const [backwardCache, forwardCache] = this.calcCacheSection(result)\n // 双向预缓存,避免反向滚动时出现空白(原逻辑仅在滚动方向缓存,反向时未预渲染)\n const backwardDistance = backwardCache\n const forwardDistance = forwardCache\n\n const overscanBackward = result[0] - backwardDistance\n const overscanForward = result[1] + forwardDistance\n\n result[0] = overscanBackward < 0 ? 0 : overscanBackward\n\n result[1] = overscanForward > this.sections.length ? this.sections.length - 1 : overscanForward\n\n const prevRange = this.getState().renderRange\n return isSameRenderRange(result, prevRange) ? prevRange : result\n }\n\n /**\n * 计算预渲染的分组个数\n */\n private calcCacheSection(renderRange: [number, number]) {\n const clientHeight = this.getState().containerSize.height\n const sectionCount = this.sectionMap.size\n let [start, end] = renderRange\n let cacheBackward = 1\n let cacheForward = 1\n\n if (start > 0) {\n let acc = this.sections[--start]?.getState().height ?? 0\n while (--start > 0) {\n const prevSection = this.sections[start]\n acc += prevSection.getState().height\n cacheBackward += 1\n if (acc >= clientHeight >>> 1) {\n break\n }\n }\n }\n\n if (end < sectionCount - 1) {\n let acc = this.sections[++end]?.getState().height ?? 0\n while (++end < sectionCount - 1) {\n const nextSection = this.sections[end]\n acc += nextSection.getState().height\n cacheForward += 1\n if (acc >= clientHeight >>> 1) {\n break\n }\n }\n }\n\n return [cacheBackward, cacheForward]\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"root.js","sources":["../../../src/components/water-flow/root.ts"],"sourcesContent":["/* eslint-disable no-labels */\nimport { cancelAnimationFrame, requestAnimationFrame } from '@tarojs/runtime'\nimport { nextTick } from '@tarojs/taro'\n\nimport { getRectSizeSync, weappScope } from '../../utils'\nimport { Node } from './node'\nimport { Section } from './section'\nimport { StatefulEventBus } from './stateful-event-bus'\nimport { getSysInfo, isH5, isSameRenderRange, isWeapp } from './utils'\n\nimport type { BaseProps, ScrollDirection, Size, WaterFlowProps } from './interface'\n\nexport type RootProps = Pick<WaterFlowProps, 'cacheCount' | 'lowerThresholdCount' | 'upperThresholdCount'> &\nRequired<Pick<BaseProps, 'id'>> & {\n /** scrollElement 模式下为 true,不测量自有容器;此时需布局全部 section 以展开完整高度 */\n skipContainerMeasure?: boolean\n}\n\nconst { windowHeight, windowWidth } = getSysInfo()\n\ntype RootState = {\n /** 是否在滚动中 */\n isScrolling: boolean\n /** 滚动偏移量 */\n scrollOffset: number\n /**\n * 滚动方向\n *\n * - forward 向下滚动\n *\n * - backward 向上滚动\n */\n scrollDirection: ScrollDirection\n /** 滚动高度 */\n scrollHeight: number\n /** 容器的尺寸信息 */\n containerSize: Size\n /** 渲染的分组区间范围 */\n renderRange: [number, number]\n}\n\nexport const RootEvents = {\n ReachUpperThreshold: Symbol.for('ReachUpperThreshold'),\n ReachLowerThreshold: Symbol.for('ReachLowerThreshold'),\n Resize: Symbol.for('Resize'),\n AllSectionsLayouted: Symbol.for('AllSectionsLayouted'),\n InitialRenderCompleted: Symbol.for('InitialRenderCompleted'),\n}\n\ntype Events = keyof typeof RootEvents\n\n/**\n * 数据模型继承自有状态的事件总线,便于在节点之间通信,以及通过 useSyncExternalStore 关联 React 视图\n */\nexport class Root extends StatefulEventBus<RootState, Events> {\n /**\n * 瀑布流根节点唯一标识\n */\n id: string\n /**\n * 分组映射表,便于查找分组\n */\n sectionMap: Map<string, Section> = new Map()\n /**\n * 节点映射表,便于查找节点\n */\n nodeMap: Map<string, Node> = new Map()\n /**\n * 分组列表,基于计算出的渲染的分组区间范围 sections.slice(start, end + 1) 进行渲染\n */\n sections: Section[] = []\n /**\n * 设置预加载的 Item 条数(与 props.cacheCount 一致,收敛目标)。\n */\n cacheCount = 1\n\n /**\n * Node 层向上(列索引减小方向)预缓存条数,可与 cacheCount 不同(快速滑动单边放大)。\n */\n nodeCacheBackward = 1\n\n /**\n * Node 层向下(列索引增大方向)预缓存条数。\n */\n nodeCacheForward = 1\n\n upperThresholdCount = 0\n\n lowerThresholdCount = 0\n\n /**\n * 触发滚动阈值对应的 scrollTop 值\n */\n upperThresholdScrollTop = -Infinity\n\n /**\n * 触发滚动阈值对应的 scrollTop 值\n */\n lowerThresholdScrollTop = Infinity\n\n /** scrollElement 模式下为 true,需布局全部 section 以展开完整高度供父容器滚动 */\n skipContainerMeasure = false\n\n /** 当前是否处于触顶区域;初始为 true(起始在顶部),只有从 false→true 时才触发事件 */\n private _inUpperZone = true\n /** 当前是否处于触底区域;初始为 false */\n private _inLowerZone = false\n /** scrollHeight 更新防抖(raf),减轻 pushNodes 后测量前后的高度跳变 */\n private _scrollHeightRafId: number | null = null\n\n constructor(props: RootProps) {\n const { id, cacheCount, lowerThresholdCount, upperThresholdCount, skipContainerMeasure } = props\n super({\n isScrolling: false,\n scrollOffset: 0,\n scrollDirection: 'forward',\n scrollHeight: windowHeight,\n renderRange: [0, 0],\n containerSize: {\n width: windowWidth,\n height: windowHeight,\n },\n })\n Object.assign(this, {\n id,\n cacheCount,\n lowerThresholdCount,\n upperThresholdCount,\n skipContainerMeasure: !!skipContainerMeasure,\n })\n this.nodeCacheBackward = cacheCount\n this.nodeCacheForward = cacheCount\n this.setupSubscriptions()\n this.renderInitialLayout()\n }\n\n /**\n * 挂载后由 WaterFlow 调用:用当前根容器 DOM(与 #id 同节点或 ScrollView 外壳)测量 containerSize。\n */\n public async measureContainerSize (measureEl: HTMLElement | null) {\n if (this.skipContainerMeasure) return\n const { windowWidth, windowHeight } = getSysInfo()\n let width = windowWidth\n let height = windowHeight\n if (isH5 && measureEl && typeof (measureEl as HTMLElement).getBoundingClientRect === 'function') {\n const r = (measureEl as HTMLElement).getBoundingClientRect()\n width = r.width\n height = r.height\n } else if (isWeapp && measureEl) {\n const scope = weappScope({ current: measureEl as any })\n const res = await getRectSizeSync(`#${this.id}`, 100, 5, scope)\n width = res.width ?? width\n height = res.height ?? height\n } else {\n const res = await getRectSizeSync(`#${this.id}`, 100, 5)\n width = res.width ?? width\n height = res.height ?? height\n }\n if (\n typeof width === 'number' &&\n typeof height === 'number' &&\n Number.isFinite(width) &&\n Number.isFinite(height) &&\n width > 0 &&\n height > 0\n ) {\n this.setStateIn('containerSize', { width, height })\n }\n }\n\n /**\n * 设置订阅事件\n */\n private setupSubscriptions() {\n /** 滚动:先更新触底阈值,再判触顶/触底并更新分组与总高度,避免同一帧内沿用无效阈值。 */\n this.sub('scrollOffset', () => {\n const sectionSize = this.sections.length\n const lastSection = this.sections[sectionSize - 1]\n if (lastSection?.columnMap.every((column) => column[column.length - 1]?.getState().layouted)) {\n this.setLowerThresholdScrollTop()\n }\n this.setStateIn('renderRange', this.getSectionRenderRange())\n this.handleReachThreshold()\n this.updateScrollHeight()\n })\n\n this.sub(RootEvents.AllSectionsLayouted, () => {\n this.updateScrollHeight()\n this.setUpperThresholdScrollTop()\n this.setLowerThresholdScrollTop()\n })\n\n this.sub(RootEvents.Resize, () => {\n this.updateScrollHeight()\n this.setUpperThresholdScrollTop()\n this.setLowerThresholdScrollTop()\n })\n }\n\n /**\n * 渐进式渲染\n *\n * 因为初始没法知道每个分组的高度信息,不知道渲染边界,所以需要渐进式渲染\n *\n * 当目前的渲染批次的首个分组的scrollTop大于容器的高度,说明容器可视区域已经填满,没必要再往下渲染了\n *\n * @param [i=0] 从第几个分组开始渲染\n *\n */\n renderInitialLayout(i = 0) {\n nextTick(() => {\n const sectionSize = this.sections.length\n\n if (i >= sectionSize || i < 0) {\n this.pub(RootEvents.InitialRenderCompleted, null)\n return\n }\n const section = this.sections[i]\n section.layoutedSignal.promise.then(() => {\n this.setStateIn('renderRange', [0, i + 1 > sectionSize ? sectionSize - 1 : i + 1])\n // skipContainerMeasure(nestedScroll 模式):需布局全部 section,使 scrollHeight 展开供父容器滚动\n // default 模式:容器可视区域已填满则提前终止,减少首屏渲染\n if (\n !this.skipContainerMeasure &&\n section.getState().scrollTop > this.getState().containerSize.height\n ) {\n this.pub(RootEvents.InitialRenderCompleted, section)\n return\n }\n\n this.renderInitialLayout(i + 1)\n })\n })\n }\n\n /**\n * 计算滚动阈值对应的 scrollTop 并设置 upperThresholdScrollTop\n * 当距顶部还有 upperThresholdCount 个 FlowItem 时的 scrollTop 值\n */\n private setUpperThresholdScrollTop() {\n // 如果没有设置阈值或阈值为0,则返回0\n if (!this.upperThresholdCount) {\n this.upperThresholdScrollTop = 0\n return 0\n }\n const sectionSize = this.sections.length\n const tracker = Array.from(\n { length: sectionSize },\n () => new Map<number, { accCount: number, accHeight: number }>() // Map<列, { 当前列累计个数,当前列累计高度 }>\n )\n\n // 从第一个分组开始扫描\n loopSeciton: for (let i = 0; i < sectionSize; i++) {\n const section = this.sections[i]\n const sectionTracker = tracker[i]\n const columnMap = section.columnMap\n // 扫描当前分组的每一列\n for (let col = 0; col < columnMap.length; col++) {\n const column = columnMap[col]\n const columnSize = column.length\n if (!sectionTracker.has(col)) {\n if (i === 0) {\n sectionTracker.set(col, { accCount: 0, accHeight: 0 })\n } else {\n const previousSectionTracker = tracker[i - 1]\n sectionTracker.set(col, {\n accCount: Math.max(...[...previousSectionTracker.values()].map((nodeTracker) => nodeTracker.accCount)),\n accHeight: section.getState().scrollTop,\n })\n }\n }\n const colTracker = sectionTracker.get(col)!\n // 扫描当前列的每一行\n loopItem: for (let j = 0; j < columnSize; j++) {\n colTracker.accCount += 1\n colTracker.accHeight += column[j].getState().height + (j === 0 ? 0 : section.rowGap)\n if (colTracker.accCount >= this.upperThresholdCount) {\n break loopItem\n }\n }\n }\n for (const [, colTracker] of sectionTracker) {\n if (colTracker.accCount >= this.upperThresholdCount) {\n this.upperThresholdScrollTop = colTracker.accHeight\n break loopSeciton\n }\n }\n }\n return this.upperThresholdScrollTop\n }\n\n /**\n * 计算滚动阈值对应的 scrollTop 并设置 lowerThresholdScrollTop\n * 当距底部还有 lowerThresholdCount 个 FlowItem 时的 scrollTop 值\n */\n private setLowerThresholdScrollTop() {\n // 与 setUpperThresholdScrollTop 一致:0 或 undefined 时用「内容底 - 容器高」作为触底阈值\n if (!this.lowerThresholdCount) {\n // 必须用 sectionRange 实时计算,避免依赖可能未更新的 scrollHeight 状态\n const range = this.sectionRange\n const totalHeight = range.length > 0 ? range[range.length - 1][1] : 0\n // 触底判定:scrollOffset + containerSize.height >= lowerThresholdScrollTop\n // 须存内容底边 totalHeight(H)。若误存 H-h,则顶部时 h 与 H-h 比较,当 2h>=H 会恒判为在触底区,误触 onScrollToLower。\n this.lowerThresholdScrollTop = totalHeight\n return 0\n }\n const sectionSize = this.sections.length\n const tracker = Array.from(\n { length: sectionSize },\n () => new Map<number, { accCount: number, scrollTop: number }>()\n )\n // 从最后一个分组开始计算\n loopSeciton: for (let i = sectionSize - 1; i >= 0; i--) {\n const section = this.sections[i]\n const sectionTracker = tracker[i]\n const columnMap = section.columnMap\n // 扫描当前分组的每一列\n for (let col = 0; col < columnMap.length; col++) {\n const column = columnMap[col]\n const columnSize = column.length\n if (!sectionTracker.has(col)) {\n if (i === sectionSize - 1) {\n sectionTracker.set(col, { accCount: 0, scrollTop: 0 })\n } else {\n const belowSectionTracker = tracker[i + 1]\n sectionTracker.set(col, {\n accCount: Math.max(...[...belowSectionTracker.values()].map((nodeTracker) => nodeTracker.accCount)),\n scrollTop: 0,\n })\n }\n }\n const colTracker = sectionTracker.get(col)!\n // 从当前列的最后一行开始往前扫描\n loopItem: for (let j = columnSize - 1; j >= 0; j--) {\n colTracker.accCount += 1\n colTracker.scrollTop = column[j].getState().scrollTop\n if (colTracker.accCount >= this.lowerThresholdCount) {\n break loopItem\n }\n }\n }\n\n for (const [, colTracker] of sectionTracker) {\n if (colTracker.accCount >= this.lowerThresholdCount) {\n this.lowerThresholdScrollTop = colTracker.scrollTop\n break loopSeciton\n }\n }\n }\n\n return this.lowerThresholdScrollTop\n }\n\n /**\n * 处理滚动到阈值的情况\n * 检测当前滚动位置是否达到了上下阈值,并触发相应的事件\n * scrollElement 模式:scrollOffset 为内容内偏移(scrollTop - startOffset),upper/lowerThresholdScrollTop 基于本组件内容计算,触顶/触底以本 WaterFlow 内容为基准\n */\n private handleReachThreshold() {\n const { scrollOffset, containerSize } = this.getState()\n const inUpper = this.upperThresholdScrollTop !== -Infinity && scrollOffset <= this.upperThresholdScrollTop\n const inLower = this.lowerThresholdScrollTop !== Infinity && scrollOffset + containerSize.height >= this.lowerThresholdScrollTop\n if (inUpper && !this._inUpperZone) this.pub(RootEvents.ReachUpperThreshold)\n if (inLower && !this._inLowerZone) this.pub(RootEvents.ReachLowerThreshold)\n this._inUpperZone = inUpper\n this._inLowerZone = inLower\n }\n\n /**\n * 列表追加并完成 finalize 后调用:重置触底边沿状态(_inLowerZone),\n * 使用户仍在底部时下一次滚动能再次触发 onScrollToLower,而不必先上滑再下滑。\n * 不在此处同步调用 handleReachThreshold,避免仍在底部时立刻连发触底(与误触区分)。\n */\n public resetLowerReachEdgeAfterContentChange () {\n this._inLowerZone = false\n }\n\n /**\n * 容器的滚动上边界\n */\n get scrollBoundaryStart() {\n return this.getState().scrollOffset\n }\n\n /**\n * 容器的滚动下边界\n */\n get scrollBoundaryEnd() {\n return this.scrollBoundaryStart + this.getStateIn('containerSize').height\n }\n\n /**\n * 计算每个section的底部位置\n *\n * sectionBottomRange = [ [section1.top, section1.bottom], [section2.top, section2.bottom], ..., [sectionN.top, sectionN.bottom] ]\n *\n * @returns [number,number][]\n */\n get sectionRange() {\n const length = this.sections.length\n if (length === 0) return []\n const range = Array.from({ length }, () => [0, this.sections[0].maxColumnHeight])\n for (let i = 1; i < length; i++) {\n const previous = range[i - 1]\n const prevSection = this.sections[i - 1]\n const gap = prevSection.rowGap ?? 0\n range[i] = [previous[1] + gap, previous[1] + gap + this.sections[i].maxColumnHeight]\n }\n\n return range\n }\n\n /**\n * 更新总滚动高度(各 Section 累计)。\n * @param immediate true 时跳过 raf 防抖(如 finalizePushNodesStateIfNeeded),避免高度滞后引起跳动\n */\n public updateScrollHeight(immediate = false) {\n const flush = () => {\n const next = this.sectionRange[this.sectionRange.length - 1]?.[1] ?? 0\n this.setStateIn('scrollHeight', next)\n }\n if (immediate) {\n if (this._scrollHeightRafId != null) {\n cancelAnimationFrame(this._scrollHeightRafId)\n this._scrollHeightRafId = null\n }\n flush()\n return\n }\n if (this._scrollHeightRafId != null) {\n cancelAnimationFrame(this._scrollHeightRafId)\n }\n this._scrollHeightRafId = requestAnimationFrame(() => {\n this._scrollHeightRafId = null\n flush()\n })\n }\n\n /**\n * 注册分组\n */\n public registerSection(section: Section) {\n const { id, order } = section\n this.sectionMap.set(id, section)\n this.sections[order] = section\n }\n\n /**\n * 注册节点\n */\n public registerNode(node: Node) {\n this.nodeMap.set(node.id, node)\n }\n\n /**\n * 查找分组\n */\n public findSection(id: string) {\n return this.sectionMap.get(id)\n }\n\n /**\n * 查找节点\n */\n public findNode(id: string) {\n return this.nodeMap.get(id)\n }\n\n /**\n * 设置 Node 层上下方向预缓存条数,并刷新可见分组内的列渲染区间。\n */\n public setNodeCacheRange (backward: number, forward: number) {\n const b = Math.max(0, Math.floor(backward))\n const f = Math.max(0, Math.floor(forward))\n if (this.nodeCacheBackward === b && this.nodeCacheForward === f) {\n return\n }\n this.nodeCacheBackward = b\n this.nodeCacheForward = f\n for (const section of this.sections) {\n if (section.isInRange) {\n section.setStateIn('renderRange', section.getNodeRenderRange())\n }\n }\n }\n\n /**\n * 获取分组渲染区间\n */\n public getSectionRenderRange() {\n const result: [number, number] = [Infinity, -Infinity]\n\n for (let i = 0; i < this.sections.length; i++) {\n const section = this.sections[i]\n if (section.isInRange) {\n result[0] = Math.min(result[0], i)\n result[1] = Math.max(result[1], i)\n }\n }\n\n if (result[0] === Infinity) {\n result[0] = 0\n }\n\n if (result[1] === -Infinity) {\n result[1] = this.sections.length - 1\n }\n\n const [backwardCache, forwardCache] = this.calcCacheSection(result)\n // 双向预缓存,避免反向滚动时出现空白(原逻辑仅在滚动方向缓存,反向时未预渲染)\n const backwardDistance = backwardCache\n const forwardDistance = forwardCache\n\n const overscanBackward = result[0] - backwardDistance\n const overscanForward = result[1] + forwardDistance\n\n result[0] = overscanBackward < 0 ? 0 : overscanBackward\n\n result[1] = overscanForward > this.sections.length ? this.sections.length - 1 : overscanForward\n\n const prevRange = this.getState().renderRange\n return isSameRenderRange(result, prevRange) ? prevRange : result\n }\n\n /**\n * 计算预渲染的分组个数\n */\n private calcCacheSection(renderRange: [number, number]) {\n const clientHeight = this.getState().containerSize.height\n const sectionCount = this.sectionMap.size\n let [start, end] = renderRange\n let cacheBackward = 1\n let cacheForward = 1\n\n if (start > 0) {\n let acc = this.sections[--start]?.getState().height ?? 0\n while (--start > 0) {\n const prevSection = this.sections[start]\n acc += prevSection.getState().height\n cacheBackward += 1\n if (acc >= clientHeight >>> 1) {\n break\n }\n }\n }\n\n if (end < sectionCount - 1) {\n let acc = this.sections[++end]?.getState().height ?? 0\n while (++end < sectionCount - 1) {\n const nextSection = this.sections[end]\n acc += nextSection.getState().height\n cacheForward += 1\n if (acc >= clientHeight >>> 1) {\n break\n }\n }\n }\n\n return [cacheBackward, cacheForward]\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -59,6 +59,8 @@ export declare class Section extends StatefulEventBus<SectionState> {
|
|
|
59
59
|
};
|
|
60
60
|
/** pushNodesStructuralOnly 后待 finalize;由 WaterFlow 的 useLayoutEffect 收尾,避免在父 render 中更新子 state */
|
|
61
61
|
private _pendingPushFinalize;
|
|
62
|
+
/** 同帧内多次 Resize 合并为一次 rAF 刷新 */
|
|
63
|
+
private _resizeCoalesceRafId;
|
|
62
64
|
constructor(root: Root, props: SectionProps);
|
|
63
65
|
/**
|
|
64
66
|
* 订阅事件
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import '
|
|
1
|
+
import { cancelAnimationFrame, requestAnimationFrame } from '@tarojs/runtime';
|
|
2
2
|
import { Node } from './node.js';
|
|
3
3
|
import { RootEvents } from './root.js';
|
|
4
4
|
import { StatefulEventBus } from './stateful-event-bus.js';
|
|
5
5
|
import { createImperativePromise, isSameRenderRange, getMatrixPosition } from './utils.js';
|
|
6
|
-
import { debounce } from '../../utils/lodash.js';
|
|
7
6
|
|
|
8
7
|
const SectionEvents = {
|
|
9
8
|
AllNodesLayouted: Symbol.for('AllNodesLayouted'),
|
|
@@ -27,6 +26,8 @@ class Section extends StatefulEventBus {
|
|
|
27
26
|
this.layoutedSignal = createImperativePromise();
|
|
28
27
|
/** pushNodesStructuralOnly 后待 finalize;由 WaterFlow 的 useLayoutEffect 收尾,避免在父 render 中更新子 state */
|
|
29
28
|
this._pendingPushFinalize = false;
|
|
29
|
+
/** 同帧内多次 Resize 合并为一次 rAF 刷新 */
|
|
30
|
+
this._resizeCoalesceRafId = null;
|
|
30
31
|
Object.assign(this, {
|
|
31
32
|
id,
|
|
32
33
|
col,
|
|
@@ -71,14 +72,20 @@ class Section extends StatefulEventBus {
|
|
|
71
72
|
* 3. 重新计算当前分组之后的所有分组的scrollTop以及分组内的节点位置
|
|
72
73
|
* 4. 更新分组内节点的渲染范围
|
|
73
74
|
*/
|
|
74
|
-
this.sub(SectionEvents.Resize,
|
|
75
|
-
this.
|
|
76
|
-
|
|
77
|
-
if (this.isInRange) {
|
|
78
|
-
this.setStateIn('renderRange', this.getNodeRenderRange());
|
|
75
|
+
this.sub(SectionEvents.Resize, () => {
|
|
76
|
+
if (this._resizeCoalesceRafId != null) {
|
|
77
|
+
cancelAnimationFrame(this._resizeCoalesceRafId);
|
|
79
78
|
}
|
|
80
|
-
this.
|
|
81
|
-
|
|
79
|
+
this._resizeCoalesceRafId = requestAnimationFrame(() => {
|
|
80
|
+
this._resizeCoalesceRafId = null;
|
|
81
|
+
this.setStateIn('height', this.maxColumnHeight);
|
|
82
|
+
this.updateBehindSectionsPosition();
|
|
83
|
+
if (this.isInRange) {
|
|
84
|
+
this.setStateIn('renderRange', this.getNodeRenderRange());
|
|
85
|
+
}
|
|
86
|
+
this.root.pub(RootEvents.Resize);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
82
89
|
}
|
|
83
90
|
/**
|
|
84
91
|
* 获取当前分组的最大高度,分组的最大高度由分组最高列决定
|