React-Native 다른 VirtualizedList 지원 컨테이너


38

반응 네이티브 0.61로 업그레이드 한 후 다음과 같은 경고가 많이 발생합니다.

VirtualizedLists should never be nested inside plain ScrollViews with the same orientation - use another VirtualizedList-backed container instead.

VirtualizedList-backed container내가 사용해야 하는 다른 것은 무엇이며, 왜 그렇게 사용하지 않는 것이 좋습니다?


3
실제로 코드를 보여줘야합니다
Variag

답변:


27

누군가가 여전히 @Ponleu 및 @David Schilling이 FlatList보다 높은 내용에 대해 설명 한 문제에 대한 제안을 찾고 있다면 이것이 내가 취하는 접근법입니다.

<SafeAreaView style={{flex: 1}}>
    <FlatList
      data={data}
      ListHeaderComponent={ContentThatGoesAboveTheFlatList}
      ListFooterComponent={ContentThatGoesBelowTheFlatList} />
</SafeAreaView>

https://facebook.github.io/react-native/docs/flatlist#listheadercomponent 여기에서 자세한 내용을 읽을 수 있습니다.

잘만되면 그것은 누군가를 돕는다. :)


1
왜 이것이 경고가 생성되는 방식보다 나은지 알고 있습니까?
David Schilling

2
@DavidSchilling은 스크롤 컨테이너 2 개로 결과를 시도한 방식 ScrollViewFlatList일치하지 않으므로 스크롤 동작이 일관되지 않습니다. 이 답변에 제시된 방법은 하나의 스크롤 컨테이너 만 생기고 헤더 / 바닥 글에는 아무리 복잡하더라도 모든 뷰를 넣을 수 있습니다.
Variag

함수 구성 요소를 사용하고 있으며 ContentThatGoesAboveTheFlatList 다시 렌더링 문제가 발생했습니다. 이에 대한 모든 솔루션
Ponleu

1
@Ponleu useMemo재 렌더링을 피하기 위해 React에서 제공 하는 후크 를 사용하여 ContentThatGoesAboveTheFlatList 컴포넌트를 메모 할 수 있습니다 . 자세한 내용은 다음과 같습니다. reactjs.org/docs/hooks-reference.html#usememo 도움이되는지 알려 주세요. :)
Afraz Hussain

8

이것이 누군가에게 도움이되는 경우를 대비하여 내 경우의 오류를 수정 한 방법입니다.

나는 FlatList안에 중첩되어 있었다 ScrollView:

render() {
    return (
        <ScrollView>
            <h1>{'My Title'}</h1>
            <FlatList
                data={this.state.myData}
                renderItem={({ item }) => {
                    return <p>{item.name}</p>;
                }}
            />
            {this.state.loading && <h2>{'Loading...'}</h2>}
        </ScrollView>
    );
}

그리고 ScrollView를 사용하여 FlatList필요한 모든 것을 렌더링하여 경고를 제거했습니다.

render() {
    const getHeader = () => {
        return <h1>{'My Title'}</h1>;
    };

    const getFooter = () => {
        if (this.state.loading) {
            return null;
        }
        return <h2>{'Loading...'}</h2>;
    };

    return (
        <FlatList
            data={this.state.myData}
            renderItem={({ item }) => {
                return <p>{item.name}</p>;
            }}
            ListHeaderComponent={getHeader}
            ListFooterComponent={getFooter}
        />
    );
}

4

문서의 예제를 보면 컨테이너를 다음과 같이 변경했습니다.

<ScrollView>
    <FlatList ... />
</ScrollView>

에:

<SafeAreaView style={{flex: 1}}>
    <FlatList ... />
</SafeAreaView>

모든 경고가 사라졌습니다.


6
FlatList내부에서 컨텐츠를 렌더링 ScrollView하고 해당 컨텐츠를 스크롤 가능하게하려면 어떻게합니까?
Ponleu

스크롤 가능한 두 개의보기를 서로 옆에 두는 것은 좋은 사용자 경험이 아닙니다. '<View> <ScrollView> <Content /> </ ScrollView> <FlatList ... /> </ View>'(테스트되지 않음)
Variag

FlatList가 지정된 높이의 컨테이너를 감싸지 않는 한 다른 스크롤을 만들지 않을 것이라고 확신합니다.
Ponleu

1
@Ponleu과 같은 문제가 있습니다. ScrollView내부에 내용 이 있고 내부에 내용 FlatListScrollView있습니다. 그리고 전체 화면이 함께 스크롤되기를 원합니다.
David Schilling

2
안드로이드 에서이 문제를 해결하는 방법 ??
MD. IBRAHIM KHALIL TANIM


0

때문에 경고가 표시 ScrollView하고 FlatList있는 경우, 같은 논리를 공유하고 FlatList실행 내부가 ScrollView,가 중복 것

그건 그렇고 SafeAreaView나에게 효과가 없다, 해결하는 유일한 방법은

<ScrollView>
    {data.map((item, index) => {
        ...your code
    }}
</ScrollView>

오류가 사라집니다


0

나는 포함하여이 해결하는 몇 가지 방법 시도 ListHeaderComponent또는 ListFooterComponent,하지만 모두가 나를 위해 적합하지 않았다.

달성하고자하는 레이아웃은 이와 같으며 한 번 스크롤하고 싶었습니다.

<ScrollView>
  <View>I'm the first view</View>
  <View>I'm the second view</View>
  <MyFlatList />
</ScrollView>

우선은 덕분에하고 싶은 말 나에게 아이디어의 무리를 준 문제 및 의견.

나는 생각했다 ListHeaderComponentFlatlist 위의 장소,하지만 내 이후 Flatlist의 방향이 열였다, 내가 장소에 원하는 헤더는 왼쪽에 갔다 Flatlist:(

그런 다음 VirtualizedList-backed일 을 시도 해야했습니다. 난 그냥 모든 구성 요소를 포장하려 VirtualizedList하는 경우, renderItems인덱스를 제공하고 I가 조건부 구성 요소가 통과 할 수 renderItems.

이 작업을 할 수 Flatlist있었지만 아직 시도하지 않았습니다.
마지막으로 이렇게 보입니다.

<View>
  <Virtualizedlist
    data={[]}
    initialNumToRender={1}
    renderItem={(props)=>{
      props.index===0 ? (1st view here) : props.index===1 ? (2nd view here) : (my flatlist)
    }}
    keyExtractor={item => item.key}
    getItemCount={2}
    getItem={ (data, index) => {
      return {
        id: Math.random().toString(12).substring(0),
      }
    }}
  />
</View>

(inside which lazyly renders↓)
  <View>I'm the first view</View>
  <View>I'm the second view</View>
  <MyFlatList />  

물론 전체 화면을 스크롤 할 수 있습니다.


-6

같은 방향으로 <FlatList />내부 <ScrollView>를 사용할 때이 문제가 발생합니다 .

이 문제를 해결하려면 FlatList에 "horizontal"을 추가하십시오.

<ScrollView>
    <FlatList **horizontal** ... />
</ScrollView>

NB : FlatList가 가로로 렌더링됩니다


당신은 질문을 오해
Giorgi Gvimradze
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.