인프런 커뮤니티 질문&답변
onEndReached 함수가 바로 호출 되지 않는 이슈
작성
·
18
·
수정됨
0
onEndReached()가 바로 호출 되지 않습니다.
생각 해보면.. 이 함수는 스크롤이 됐을 때만 호출 해야 맞지 않나요..? following쪽도 useEffect 쪽을 삭제 하고 나서는 데이터를 바로 불러 오지 못하는데.. "useEffect 제거 후 onEndreached()가 바로 실행된다." 이 부분 이해가 잘 안돼서 설명 부탁드리기 전에 한번 찾아봤습니다.
대략 왜 바로 실행 된다고 하셨는지는 이해가 되긴 했는데, 저같은 경우는 좀 예외인 것 같아서 질문 남깁니다!
지금 제 flash-list 버전은 아래와 같습니다!
"@shopify/flash-list": "2.0.2",알아보니 v2에서는 estimatedItemSize를 제공하지 않고.. 해당 설정이 없어서 저같은 경우 onEndReached()가 바로 실행 되지 않았던 것 같습니다. 의존 된 데이터도 빈배열로 정의 돼있으니 더 아무 것도 실행 하지 않았던 것 같습니다.
이런 경우 초기엔 useEffect로 직접 불러오나요?
혹시 위에 버전 이슈 말고 제가 놓친 부분이 있다면 말씀 부탁드리겠습니다..!
(home)/index.tsx
import {
Text,
View,
TouchableOpacity,
StyleSheet,
useColorScheme,
ScrollView,
} from "react-native";
import { usePathname } from "expo-router";
import { useState, useCallback } from "react";
import Post, { Post as PostType } from "../../../components/Post";
import { FlashList } from "@shopify/flash-list";
export default function Index() {
const colorScheme = useColorScheme();
const path = usePathname();
const [posts, setPosts] = useState<PostType[]>([]);
const onEndReached = useCallback(() => {
console.log("posts1", posts.length);
const lastId = posts.at(-1)?.id;
if (!lastId) return;
fetch(`/posts?cursor=${lastId}`)
.then((res) => res.json())
.then((data) => {
if (data.posts.length > 0) {
setPosts((prev) => [...prev, ...data.posts]);
}
})
.catch(console.error);
}, [posts, path]);
return (
<View
style={[
styles.container,
colorScheme === "dark" ? styles.containerDark : styles.containerLight,
]}
>
<FlashList
data={posts}
renderItem={({ item }) => <Post item={item} />}
onEndReached={onEndReached}
onEndReachedThreshold={2}
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
containerLight: {
backgroundColor: "white",
},
containerDark: {
backgroundColor: "#101010",
},
textLight: {
color: "black",
},
textDark: {
color: "white",
},
});
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 도도한 불도새님.
React Native에서 FlatList나 FlashList의 onEndReached 함수가 예상대로 호출되지 않는 상황은 리스트의 렌더링 방식과 초기 설정과 관련이 있을 수 있습니다. 특히, onEndReached는 스크롤 이벤트에 의해 호출되는 것으로, 초기 로드 시에는 스크롤이 없으면 바로 불러오지 않을 수 있습니다.
FlashList v2에서의 변화 및 고려 사항
- FlashList v2에서는 estimatedItemSize 설정이 존재하지 않는다고 하셨는데, 이로 인해 아이템의 크기를 추정하지 못해 onEndReached 이벤트가 적절하게 호출되지 않을 수 있습니다.
- onEndReached 이벤트는 스크롤이 하단으로 도달했을 때 호출되는 이벤트이기 때문에, 리스트의 크기나 초기 로드 데이터 크기에 따라 적절히 반응하지 않을 수 있습니다.
초기 데이터를 불러오는 방식
- 초기 데이터를 로드하기 위해서는 일반적으로 useEffect를 사용하여 컴포넌트 마운트 시에 데이터를 불러오는 방식이 흔합니다.
- 만약 처음에 데이터를 불러오지 못하는 경우, useEffect에 데이터를 fetch하는 로직을 포함하여 초기 렌더링 시 데이터를 가져올 수 있습니다.
유사한 문제에 대한 기존 답변을 참고하실 수 있도록 몇 가지 자료를 추천드립니다:
1. 리액트 네이티브에서 인피니트 스크롤링 최적화 - React Native에서 인피니트 스크롤링을 구현하는 방법에 대한 설명이 있습니다.
2. FlatList에서의 기본 설정 이해하기 - FlatList 및 기타 리스트 컴포넌트의 기본 동작 방법에 대한 설명이 되어 있습니다.
위의 링크를 통해 문제 해결에 대한 힌트를 얻을 수 있기를 바랍니다. 아직 해결이 되지 않았다면 추가적인 조건이나 콘솔 로그로 상태 변화를 확인해 보시길 권장합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




