Skip to content

Commit 83a4342

Browse files
authored
Use object as map (#43)
* refactor: Use cachemap * clean up
1 parent e7730e3 commit 83a4342

File tree

5 files changed

+30
-14
lines changed

5 files changed

+30
-14
lines changed

examples/basic.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class TestItem extends React.Component<Item, {}> {
3434
}
3535

3636
const data: Item[] = [];
37-
for (let i = 0; i < 200; i += 1) {
37+
for (let i = 0; i < 100000; i += 1) {
3838
data.push({
3939
id: String(i),
4040
});
@@ -47,18 +47,10 @@ const TYPES = [
4747

4848
const Demo = () => {
4949
const [destroy, setDestroy] = React.useState(false);
50-
const [visible, setVisible] = React.useState(false);
50+
const [visible, setVisible] = React.useState(true);
5151
const [type, setType] = React.useState('dom');
5252
const listRef = React.useRef<ListRef>(null);
5353

54-
React.useEffect(() => {
55-
if (visible) {
56-
listRef.current.scrollTo({
57-
index: 100,
58-
});
59-
}
60-
}, [visible]);
61-
6254
return (
6355
<React.StrictMode>
6456
<div>

src/List.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ export function RawList<T>(props: ListProps<T>, ref: React.Ref<ListRef>) {
119119
let startOffset: number;
120120
let endIndex: number;
121121

122-
for (let i = 0; i < mergedData.length; i += 1) {
122+
const dataLen = mergedData.length;
123+
for (let i = 0; i < dataLen; i += 1) {
123124
const item = mergedData[i];
124125
const key = getKey(item);
125126

src/hooks/useHeights.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@ import * as React from 'react';
22
import { useRef } from 'react';
33
import findDOMNode from 'rc-util/lib/Dom/findDOMNode';
44
import { GetKey } from '../interface';
5+
import CacheMap from '../utils/CacheMap';
56

67
type RefFunc = (instance: HTMLElement) => void;
78

89
export default function useHeights<T>(
910
getKey: GetKey<T>,
1011
onItemAdd?: (item: T) => void,
1112
onItemRemove?: (item: T) => void,
12-
): [(item: T) => (instance: HTMLElement) => void, () => void, Map<React.Key, number>, number] {
13+
): [(item: T) => (instance: HTMLElement) => void, () => void, CacheMap, number] {
1314
const [updatedMark, setUpdatedMark] = React.useState(0);
1415
const instanceRef = useRef(new Map<React.Key, HTMLElement>());
15-
const heightsRef = useRef(new Map<React.Key, number>());
16+
const heightsRef = useRef(new CacheMap());
1617

1718
const instanceFuncRef = useRef<Map<React.Key, RefFunc>>(new Map());
1819
function getInstanceRefFunc(item: T) {

src/hooks/useScrollTo.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ import * as React from 'react';
33
import raf from 'rc-util/lib/raf';
44
import { ScrollTo } from '../List';
55
import { GetKey } from '../interface';
6+
import CacheMap from '../utils/CacheMap';
67

78
export default function useScrollTo<T>(
89
containerRef: React.RefObject<HTMLDivElement>,
910
data: T[],
10-
heights: Map<React.Key, number>,
11+
heights: CacheMap,
1112
itemHeight: number,
1213
getKey: GetKey<T>,
1314
collectHeight: () => void,

src/utils/CacheMap.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import React from 'react';
2+
3+
// Firefox has low performance of map.
4+
class CacheMap {
5+
maps: Record<string, number>;
6+
7+
constructor() {
8+
this.maps = {};
9+
this.maps.prototype = null;
10+
}
11+
12+
set(key: React.ReactText, value: number) {
13+
this.maps[key] = value;
14+
}
15+
16+
get(key: React.ReactText) {
17+
return this.maps[key];
18+
}
19+
}
20+
21+
export default CacheMap;

0 commit comments

Comments
 (0)