Skip to content

Commit 29b3931

Browse files
committed
Make list render faster
1 parent 2471fc6 commit 29b3931

File tree

4 files changed

+25
-19
lines changed

4 files changed

+25
-19
lines changed

src/screens/List/List.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@ import { useSafeAreaInsets } from "react-native-safe-area-context";
66

77
import { groupData } from "./group-data";
88

9-
import { renderItem, renderSectionHeader } from "./renderItem";
9+
import { keyExtractor, renderItem, renderSectionHeader } from "./renderItem";
1010

11-
import { Box } from "~/components/Box";
12-
import { Bold, Text } from "~/components/Text";
11+
import { Bold } from "~/components/Text";
1312
import { GlobalStyles, Palette } from "~/styles";
1413

1514
export function List() {
@@ -25,6 +24,7 @@ export function List() {
2524
<SectionList
2625
sections={data}
2726
renderItem={renderItem}
27+
keyExtractor={keyExtractor}
2828
renderSectionHeader={renderSectionHeader}
2929
style={GlobalStyles.container}
3030
contentContainerStyle={styles.list}

src/screens/List/ListHeader.tsx

+15-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from "react";
1+
import React, { memo } from "react";
22

33
import { StyleSheet } from "react-native";
44

@@ -13,17 +13,20 @@ export type ListHeaderProps = {
1313
data: SectionData;
1414
};
1515

16-
export function ListHeader({ data }: ListHeaderProps) {
17-
return (
18-
<BlurView
19-
tint="dark"
20-
intensity={50}
21-
style={styles.container}
22-
>
23-
<Bold style={styles.text}>{data?.title}</Bold>
24-
</BlurView>
25-
);
26-
}
16+
export const ListHeader = memo(
17+
function ListHeader({ data }: ListHeaderProps) {
18+
return (
19+
<BlurView
20+
tint="dark"
21+
intensity={50}
22+
style={styles.container}
23+
>
24+
<Bold style={styles.text}>{data?.title}</Bold>
25+
</BlurView>
26+
);
27+
},
28+
(prev, next) => prev.data.title !== next.data.title
29+
);
2730

2831
const styles = StyleSheet.create({
2932
container: {

src/screens/List/ListItem.tsx

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from "react";
1+
import React, { memo } from "react";
22

33
import { StyleSheet, View } from "react-native";
44

@@ -18,7 +18,7 @@ export type ListItemProps = {
1818
index: number;
1919
};
2020

21-
export function ListItem({
21+
export const ListItem = memo(function ListItem({
2222
data: { date, time, grade, color },
2323
index,
2424
}: ListItemProps) {
@@ -34,15 +34,14 @@ export function ListItem({
3434
<Text style={styles.textTime}>{format(date, "hh:mm aaa")}</Text>
3535
</View>
3636
);
37-
}
37+
});
3838

3939
const styles = StyleSheet.create({
4040
item: {
4141
alignItems: "center",
4242
flexDirection: "row",
4343
gap: 10,
4444
justifyContent: "space-between",
45-
marginTop: 10,
4645
padding: 20,
4746
},
4847
left: {

src/screens/List/renderItem.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import { type Entry, type SectionData } from "./List.interface";
66
import { ListHeader } from "./ListHeader";
77
import { ListItem } from "./ListItem";
88

9+
export function keyExtractor(item: Entry, index: number) {
10+
return `${item.date.toString()}-${index}`;
11+
}
12+
913
export function renderItem({ item, index }: ListRenderItemInfo<Entry>) {
1014
return (
1115
<ListItem

0 commit comments

Comments
 (0)