refactor: memoize renderItem, document viewability ref pattern, remove redundant assertion

This commit is contained in:
Developer
2026-03-11 14:42:47 +08:00
parent 8885f83b8a
commit 287a608e97

View File

@@ -1,4 +1,4 @@
import React, { useEffect, useState, useRef, useMemo } from "react"; import React, { useEffect, useState, useRef, useMemo, useCallback } from "react";
import { import {
View, View,
StyleSheet, StyleSheet,
@@ -39,6 +39,7 @@ export default function HomeScreen() {
const [visibleBigKey, setVisibleBigKey] = useState<string | null>(null); const [visibleBigKey, setVisibleBigKey] = useState<string | null>(null);
const rows = useMemo(() => toListRows(videos), [videos]); const rows = useMemo(() => toListRows(videos), [videos]);
// useRef-wrapped to satisfy FlatList's requirement that onViewableItemsChanged never changes identity after mount
const onViewableItemsChangedRef = useRef( const onViewableItemsChangedRef = useRef(
({ viewableItems }: { viewableItems: ViewToken[] }) => { ({ viewableItems }: { viewableItems: ViewToken[] }) => {
const bigRow = viewableItems.find( const bigRow = viewableItems.find(
@@ -61,7 +62,7 @@ export default function HomeScreen() {
load(); load();
}, []); }, []);
const renderItem = ({ item: row }: { item: ListRow }) => { const renderItem = useCallback(({ item: row }: { item: ListRow }) => {
if (row.type === 'big') { if (row.type === 'big') {
return ( return (
<BigVideoCard <BigVideoCard
@@ -72,6 +73,7 @@ export default function HomeScreen() {
); );
} }
// Normal pair row // Normal pair row
const right = row.right;
return ( return (
<View style={styles.row}> <View style={styles.row}>
<View style={styles.leftCol}> <View style={styles.leftCol}>
@@ -80,17 +82,17 @@ export default function HomeScreen() {
onPress={() => router.push(`/video/${row.left.bvid}` as any)} onPress={() => router.push(`/video/${row.left.bvid}` as any)}
/> />
</View> </View>
{row.right && ( {right && (
<View style={styles.rightCol}> <View style={styles.rightCol}>
<VideoCard <VideoCard
item={row.right} item={right}
onPress={() => router.push(`/video/${row.right!.bvid}` as any)} onPress={() => router.push(`/video/${right.bvid}` as any)}
/> />
</View> </View>
)} )}
</View> </View>
); );
}; }, [visibleBigKey]);
return ( return (
<SafeAreaView style={styles.safe} edges={["left", "right"]}> <SafeAreaView style={styles.safe} edges={["left", "right"]}>