mirror of
https://gh-proxy.org/https://github.com/tiajinsha/JKVideo
synced 2026-07-07 23:18:38 +08:00
refactor: memoize renderItem, document viewability ref pattern, remove redundant assertion
This commit is contained in:
@@ -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"]}>
|
||||||
|
|||||||
Reference in New Issue
Block a user