Мы собираемся создать собственный ScrollView с помощью FlatList в React Native

ScrollView — это компонент React Native, который позволяет прокручивать содержимое в одном направлении, вертикально или горизонтально. Он может содержать один или несколько дочерних элементов и часто используется для прокрутки небольшого количества контента.

FlatList, с другой стороны, является более оптимизированной версией ScrollView для больших списков данных. Он отображает только те элементы, которые в данный момент видны на экране, что делает его более эффективным для прокрутки больших наборов данных. Он также поддерживает расширенные функции, такие как обновление по запросу, поддержка верхнего и нижнего колонтитула и прокрутка до индекса.

Таким образом, ScrollView хорош для прокрутки небольшого количества контента, а FlatList лучше подходит для больших списков данных, с улучшенной производительностью и дополнительными функциями.

Создайте собственный вид прокрутки

  • Код на TypeScript
import React from "react";
import { 
    FlatList, 
    RefreshControlProps, 
    ScrollView, 
    StyleProp, 
    ViewStyle 
} from "react-native";

interface ScrollViewProps {
    ref?: any;
    children: React.ReactNode;
    horizontal?: boolean;
    useScrollView?: boolean;
    nestedScrollEnabled?: boolean;
    showsVerticalScrollIndicator?: boolean;
    showsHorizontalScrollIndicator?: boolean;
    initialNumToRender?: number;
    refreshControl?: React.ReactElement<RefreshControlProps>;
    keyboardDismissMode?: "none" | "interactive" | "on-drag";
    keyboardShouldPersistTaps?: "always" | "never" | "handled";
    contentContainerStyle?: StyleProp<ViewStyle>;
}

const AppScrollView = (props: ScrollViewProps) => {
    return (
        <>
            {
                //
                props?.useScrollView ? (
                    <ScrollView
                        ref={props?.ref}
                        contentContainerStyle={props?.contentContainerStyle}
                        nestedScrollEnabled={props?.nestedScrollEnabled || true}
                        horizontal={props?.horizontal ? props.horizontal : false}
                        keyboardDismissMode={props?.keyboardDismissMode || "on-drag"}
                        keyboardShouldPersistTaps={props?.keyboardShouldPersistTaps || "always"}
                        refreshControl={props?.refreshControl ? props.refreshControl : undefined}
                        showsVerticalScrollIndicator={props?.showsVerticalScrollIndicator || false}
                        showsHorizontalScrollIndicator={props?.showsHorizontalScrollIndicator || false}>
                        {props.children}
                    </ScrollView>
                ) : (
                    <FlatList
                        key={"key0"}
                        data={[]}
                        renderItem={null}
                        ListEmptyComponent={null}
                        initialNumToRender={props?.initialNumToRender}
                        contentContainerStyle={props?.contentContainerStyle}
                        nestedScrollEnabled={props?.nestedScrollEnabled || true}
                        keyboardDismissMode={props?.keyboardDismissMode || "on-drag"}
                        keyboardShouldPersistTaps={props?.keyboardShouldPersistTaps || "always"}
                        horizontal={props?.horizontal ? props.horizontal : false}
                        refreshControl={props?.refreshControl ? props.refreshControl : undefined}
                        showsVerticalScrollIndicator={props?.showsVerticalScrollIndicator || false}
                        showsHorizontalScrollIndicator={props?.showsHorizontalScrollIndicator || false}
                        keyExtractor={(item) => item}
                        ListHeaderComponent={() => <React.Fragment>{props.children}</React.Fragment>}
                    />
                )
            }
        </>
    );
};

export default AppScrollView;
  • Код на JavaScript
import React from "react";
import { FlatList, ScrollView } from "react-native";

const AppScrollView = (props) => {
    return (
        <>
            {
                //
                props?.useScrollView ? (
                    <ScrollView
                        ref={props?.ref}
                        contentContainerStyle={props?.contentContainerStyle}
                        nestedScrollEnabled={props?.nestedScrollEnabled || true}
                        horizontal={props?.horizontal ? props.horizontal : false}
                        keyboardDismissMode={props?.keyboardDismissMode || "on-drag"}
                        keyboardShouldPersistTaps={props?.keyboardShouldPersistTaps || "always"}
                        refreshControl={props?.refreshControl ? props.refreshControl : undefined}
                        showsVerticalScrollIndicator={props?.showsVerticalScrollIndicator || false}
                        showsHorizontalScrollIndicator={props?.showsHorizontalScrollIndicator || false}>
                        {props.children}
                    </ScrollView>
                ) : (
                    <FlatList
                        key={"key0"}
                        data={[]}
                        renderItem={null}
                        ListEmptyComponent={null}
                        initialNumToRender={props?.initialNumToRender}
                        contentContainerStyle={props?.contentContainerStyle}
                        nestedScrollEnabled={props?.nestedScrollEnabled || true}
                        keyboardDismissMode={props?.keyboardDismissMode || "on-drag"}
                        keyboardShouldPersistTaps={props?.keyboardShouldPersistTaps || "always"}
                        horizontal={props?.horizontal ? props.horizontal : false}
                        refreshControl={props?.refreshControl ? props.refreshControl : undefined}
                        showsVerticalScrollIndicator={props?.showsVerticalScrollIndicator || false}
                        showsHorizontalScrollIndicator={props?.showsHorizontalScrollIndicator || false}
                        keyExtractor={(item) => item}
                        ListHeaderComponent={() => <React.Fragment>{props.children}</React.Fragment>}
                    />
                )
            }
        </>
    );
};

export default AppScrollView;

Вышеупомянутый компонент имеет функциональные возможности как ScrollView, так и FlatList ScrollView. ScrollView — это компонент пользовательского интерфейса в React Native, который позволяет прокручивать его содержимое, а FlatList — это специализированный ScrollView, который используется для рендеринга списка элементов. Итак, компонент может выполнять задачи обоих этих компонентов, позволяя прокручивать контент, будь то простой список или что-то более сложное.

Подробнее о ScrollView и FlatList:

Прокрутка:

  • Может использоваться для прокрутки содержимого в одном направлении (вертикально или горизонтально).
  • Может содержать несколько дочерних элементов, но только один прямой дочерний элемент.
  • Контент всегда рисуется как одно изображение, что может привести к проблемам с производительностью для больших объемов контента.
  • Не поддерживает эффективную обработку больших списков, так как отображает все дочерние элементы одновременно.

Плоский список:

  • Может использоваться для эффективной прокрутки больших объемов данных.
  • Отрисовывает только те элементы, которые в данный момент видны на экране, повышая производительность.
  • Поддерживает такие функции, как обновление по запросу, верхний и нижний колонтитулы и прокрутка до индекса.
  • Под капотом используется VirtualizedList, который использует ленивую загрузку и отображает только те элементы, которые видны в данный момент, что делает его более эффективным с точки зрения использования памяти.
  • Может использоваться с реквизитом initialNumToRender, чтобы указать количество элементов для рендеринга до того, как они потребуются.

В заключение, ScrollView хорош для прокрутки небольших объемов контента, а FlatList лучше подходит для прокрутки больших объемов данных. Если вы создаете приложение со списком элементов, вам следует использовать FlatList, так как он предлагает лучшую производительность и дополнительные функции по сравнению с ScrollView.