Skip to content

Commit 6b1ebb8

Browse files
committed
perf: skipping re-rendering
1 parent 5769845 commit 6b1ebb8

File tree

4 files changed

+42
-31
lines changed

4 files changed

+42
-31
lines changed

src/Filler.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import * as React from 'react';
2-
import ResizeObserver from 'rc-resize-observer';
31
import classNames from 'classnames';
2+
import ResizeObserver from 'rc-resize-observer';
3+
import * as React from 'react';
44

55
export type InnerProps = Pick<React.HTMLAttributes<HTMLDivElement>, 'role' | 'id'>;
66

@@ -69,14 +69,19 @@ const Filler = React.forwardRef(
6969
};
7070
}
7171

72+
const handleResize = React.useCallback(
73+
({ offsetHeight }) => {
74+
if (offsetHeight && onInnerResize) {
75+
onInnerResize();
76+
}
77+
},
78+
[onInnerResize],
79+
);
80+
7281
return (
7382
<div style={outerStyle}>
7483
<ResizeObserver
75-
onResize={({ offsetHeight }) => {
76-
if (offsetHeight && onInnerResize) {
77-
onInnerResize();
78-
}
79-
}}
84+
onResize={handleResize}
8085
>
8186
<div
8287
style={innerStyle}

src/List.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,11 @@ export function RawList<T>(props: ListProps<T>, ref: React.Ref<ListRef>) {
165165
setScrollMoving(false);
166166
};
167167

168-
const sharedConfig: SharedConfig<T> = {
169-
getKey,
170-
};
168+
const sharedConfig: SharedConfig<T> = React.useMemo(() => {
169+
return {
170+
getKey,
171+
};
172+
}, [getKey]);
171173

172174
// ================================ Scroll ================================
173175
function syncScrollTop(newTop: number | ((prev: number) => number)) {

src/hooks/useChildren.tsx

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,23 @@ export default function useChildren<T>(
1212
renderFunc: RenderFunc<T>,
1313
{ getKey }: SharedConfig<T>,
1414
) {
15-
return list.slice(startIndex, endIndex + 1).map((item, index) => {
16-
const eleIndex = startIndex + index;
17-
const node = renderFunc(item, eleIndex, {
18-
style: {
19-
width: scrollWidth,
20-
},
21-
offsetX,
22-
}) as React.ReactElement;
15+
// 可能存在 list 不变但是里面的数据存在变化的情况,会与之前写法存在不同的行为
16+
return React.useMemo(() => {
17+
return list.slice(startIndex, endIndex + 1).map((item, index) => {
18+
const eleIndex = startIndex + index;
19+
const node = renderFunc(item, eleIndex, {
20+
style: {
21+
width: scrollWidth,
22+
},
23+
offsetX,
24+
}) as React.ReactElement;
2325

24-
const key = getKey(item);
25-
return (
26-
<Item key={key} setRef={(ele) => setNodeRef(item, ele)}>
27-
{node}
28-
</Item>
29-
);
30-
});
26+
const key = getKey(item);
27+
return (
28+
<Item key={key} setRef={(ele) => setNodeRef(item, ele)}>
29+
{node}
30+
</Item>
31+
);
32+
});
33+
}, [list, startIndex, endIndex, setNodeRef, renderFunc, getKey, offsetX, scrollWidth]);
3134
}

src/hooks/useHeights.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ export default function useHeights<T>(
2424

2525
const promiseIdRef = useRef<number>(0);
2626

27-
function cancelRaf() {
27+
const cancelRaf = React.useCallback(function cancelRaf() {
2828
promiseIdRef.current += 1;
29-
}
29+
}, []);
3030

31-
function collectHeight(sync = false) {
31+
const collectHeight = React.useCallback(function (sync = false) {
3232
cancelRaf();
3333

3434
const doCollect = () => {
@@ -67,9 +67,9 @@ export default function useHeights<T>(
6767
}
6868
});
6969
}
70-
}
70+
}, [cancelRaf]);
7171

72-
function setInstanceRef(item: T, instance: HTMLElement) {
72+
const setInstanceRef = React.useCallback(function setInstanceRef(item: T, instance: HTMLElement) {
7373
const key = getKey(item);
7474
const origin = instanceRef.current.get(key);
7575

@@ -88,11 +88,12 @@ export default function useHeights<T>(
8888
onItemRemove?.(item);
8989
}
9090
}
91-
}
91+
}, [collectHeight, getKey, onItemAdd, onItemRemove]);
9292

9393
useEffect(() => {
9494
return cancelRaf;
9595
}, []);
9696

97+
// 这里稍显迷惑性,当 heightsRef.current.set 被调用时,updatedMark 会变化,进而导致 heightsRef.current 也出现变化
9798
return [setInstanceRef, collectHeight, heightsRef.current, updatedMark];
9899
}

0 commit comments

Comments
 (0)