JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

React NativeのFlatListコンポーネントとは?基本から使い方まで徹底解説

React Nativeアプリ開発において、リスト形式のデータを表示する場面は非常に多くあります。そんなときに活躍するのがFlatListコンポーネントです。FlatListは、リスト項目を読み込んで表示するためのコンテナであり、ヘッダー・フッターのサポート、複数カラム対応、縦横両方向のスクロール、遅延読み込み(Lazy Loading)など、多彩な機能を備えています。

FlatListの主な特徴

FlatListには、以下のような重要な特徴があります。

  • スクロールに合わせた読み込み(Scroll Loading)に対応
  • scrollToIndexサポートにより、指定位置へのスクロール調整が可能
  • ヘッダーとフッターの表示に対応
  • 複数カラム(Multi Column)レイアウトに対応
  • iOS・Android両方で動作するクロスプラットフォーム設計
  • 表示領域の変化を検知できる設定可能なViewabilityコールバック

FlatListの基本構造

FlatListの基本的な構造は以下の通りです。

<FlatList
  data={DataContainer}
  renderItem={yourRenderItem}
  keyExtractor={item => item.id}
/>

FlatListの仕組み

FlatListは、VirtualizedListコンポーネントをもとに実装されています。VirtualizedListは、モバイル画面の現在のビューポートに収まる限られた数のアイテムだけを表示し、残りのデータはユーザーがスクロールするのに応じて描画します。これにより、大量のデータを扱う場合でも高いパフォーマンスを維持できます。

最低限、datarenderItemという2つのpropsを使えばFlatListを作成できます。

FlatListのインポート方法

FlatListを使用するには、react-nativeから次のようにインポートします。

import { FlatList } from "react-native";

FlatListの主要なProps一覧

Props説明
data表示するデータを格納した配列です。
renderItemrenderItem({ item, index, separators }) の形式で呼び出されます。
  • item:dataフィールドから取得した、リストに表示される各アイテム
  • index:各アイテムに割り当てられるインデックス番号
  • separators:propsの描画を補助する関数オブジェクト
利用できる関数は以下の通りです。
separators.highlight(),
separators.unhighlight(),
separators.updateProps().
ListEmptyComponentリストが空のときに呼び出されるコンポーネントクラス、レンダー関数、またはレンダー要素です。リストが空の場合に何かを表示したい場合に便利です。
ListFooterComponentすべてのアイテムの下部に描画されるコンポーネントクラス、レンダー関数、またはレンダー要素です。
ListFooterComponentStyleフッターコンポーネントに必要なスタイリングをここで指定できます。
ListHeaderComponentすべてのアイテムの上部に描画されるコンポーネントクラス、レンダー関数、またはレンダー要素です。
ListHeaderComponentStyleヘッダーコンポーネントに必要なスタイリングをここで指定できます。
horizontaltrueに設定すると、アイテムが横方向に並べて描画されます。
keyExtractor指定されたインデックスに対してユニークなキーを抽出します。キーはキャッシュやアイテムの並び替え追跡に使用されます。形式は (item: object, index: number) => string; です。

例1:FlatListのアイテムを縦方向に表示する

まずは、最も一般的な縦方向のリスト表示の例を見ていきましょう。FlatListとあわせて、Text、View、StyleSheetなどのコンポーネントもインポートします。

import { FlatList, Text, View, StyleSheet } from "react-native";

次に、FlatListに表示するデータを用意します。ここでは、this.state.dataにフレームワーク名のリストを格納しています。

this.state = {
  data: [
    { name: "Javascript Frameworks", isTitle: true },
    { name: "Angular", isTitle: false },
    { name: "ReactJS", isTitle: false },
    { name: "VueJS", isTitle: false },
    { name: "ReactNative", isTitle: false },
    { name: "PHP Frameworks", isTitle: true },
    { name: "Laravel", isTitle: false },
    { name: "CodeIgniter", isTitle: false },
    { name: "CakePHP", isTitle: false },
    { name: "Symfony", isTitle: false }
  ],
  stickyHeaderIndices: []
};

renderItem関数の実装

renderItemは、渡されたアイテムを受け取り、Textコンポーネントとして表示する役割を担います。

renderItem = ({ item }) => {
  return (
    <View style={styles.item}>
      <Text style={{ fontWeight: (item.isTitle) ? "bold" : "", color: (item.isTitle) ? "red" : "gray" }}>{item.name}</Text>
    </View>
  );
};

この例では、TextコンポーネントをViewコンポーネントでラップしています。item.isTitleがtrueかfalseかを判定し、trueの場合は太字+赤色、falseの場合はグレー色で表示するようにしています。これにより、カテゴリ見出しと通常項目を視覚的に区別できます。

FlatListの実装

続いて、dataとrenderItemのpropsを持つFlatListを実装します。

<View style={styles.container}>
  <FlatList data={this.state.data} renderItem={this.renderItem} keyExtractor={item => item.name} />
</View>

this.state.datadata propsに渡し、this.renderItem関数をrenderItem propsに代入しています。

keyExtractorには、データ配列内でユニークになるプロパティを指定します。これを省略した場合、配列のインデックスがデフォルトのキー値として使用されます。今回はnameがユニークであるため、以下のように指定しています。

keyExtractor={item => item.name}

完全なサンプルコード

import React from "react";
import { FlatList, Text, View, StyleSheet, StatusBar } from "react-native";

export default class App extends React.Component {
  constructor() {
    super();
    this.state = {
      data: [
        { name: "Javascript Frameworks", isTitle: true },
        { name: "Angular", isTitle: false },
        { name: "ReactJS", isTitle: false },
        { name: "VueJS", isTitle: false },
        { name: "ReactNative", isTitle: false },
        { name: "PHP Frameworks", isTitle: true },
        { name: "Laravel", isTitle: false },
        { name: "CodeIgniter", isTitle: false },
        { name: "CakePHP", isTitle: false },
        { name: "Symfony", isTitle: false }
      ],
      stickyHeaderIndices: []
    };
  }

  renderItem = ({ item }) => {
    return (
      <View style={styles.item}>
        <Text style={{ fontWeight: (item.isTitle) ? "bold" : "", color: (item.isTitle) ? "red" : "gray" }}>{item.name}</Text>
      </View>
    );
  };

  render() {
    return (
      <View style={styles.container}>
        <FlatList data={this.state.data} renderItem={this.renderItem} keyExtractor={item => item.name} stickyHeaderIndices={this.state.stickyHeaderIndices} />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: StatusBar.currentHeight || 0,
  },
  item: {
    margin: 10,
    padding: 20,
    marginVertical: 8,
    marginHorizontal: 16,
  }
});

実行結果

上記のコードを実行すると、JavaScriptフレームワークとPHPフレームワークのカテゴリ見出しが赤色の太字で表示され、その下に各フレームワーク名がグレー色で縦方向にリスト表示されます。

例2:FlatListのアイテムを横方向に表示する

FlatListのアイテムを横方向に表示したい場合は、horizontal={true}というpropsを追加するだけです。それ以外のコード構造は縦表示の場合とほぼ同じです。

import React from "react";
import { FlatList, Text, View, StyleSheet, StatusBar } from "react-native";

export default class App extends React.Component {
  constructor() {
    super();
    this.state = {
      data: [
        { name: "Javascript Frameworks", isTitle: true },
        { name: "Angular", isTitle: false },
        { name: "ReactJS", isTitle: false },
        { name: "VueJS", isTitle: false },
        { name: "ReactNative", isTitle: false },
        { name: "PHP Frameworks", isTitle: true },
        { name: "Laravel", isTitle: false },
        { name: "CodeIgniter", isTitle: false },
        { name: "CakePHP", isTitle: false },
        { name: "Symfony", isTitle: false }
      ],
      stickyHeaderIndices: []
    };
  }

  renderItem = ({ item }) => {
    return (
      <View style={styles.item}>
        <Text style={{ fontWeight: (item.isTitle) ? "bold" : "", color: (item.isTitle) ? "red" : "gray" }}>{item.name}</Text>
      </View>
    );
  };

  render() {
    return (
      <View style={styles.container}>
        <FlatList horizontal={true} data={this.state.data} renderItem={this.renderItem} keyExtractor={item => item.name} stickyHeaderIndices={this.state.stickyHeaderIndices} />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: 100,
  },
  item: {
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center',
    padding: 30,
    margin: 2,
    borderColor: '#2a4944',
    borderWidth: 1,
    height: 100,
    backgroundColor: '#d2f7f1'
  }
});

実行結果

このコードでは、各アイテムに背景色やボーダーを設定しているため、横方向にスワイプできるカード風のリストが表示されます。horizontal propsを1行追加するだけで、縦方向のリストが簡単に横スクロール型のカルーセル表示に変わることがわかります。

まとめ

FlatListは、React Nativeでリストを効率的に表示するための標準的なコンポーネントです。VirtualizedListベースの遅延読み込みによって大量のデータでもパフォーマンスを維持でき、dataとrenderItemの2つの必須propsだけで手軽に実装できるのが魅力です。さらに、horizontal propsによる横方向表示、ヘッダー・フッターのカスタマイズなども柔軟に行えます。ぜひ実際のアプリ開発で活用してみてください。

  1. Googleアプリとは?基本機能から知っておきたい便利な使い方まで徹底解説

    スマートフォンのホーム画面に並ぶ大きな「G」のアイコン——それがGoogleアプリです。普段の検索はChromeで済ませていて、地図にはGoogleマップを使っているという人の中には、「このアプリは何のためにあるのか?」と疑問に思ったことがある方も多いのではないでしょうか。 この記事では、Googleアプリの正体と基本的な使い方、さらに知っておくと便利な活用テクニックをわかりやすく解説します。 Googleアプリとは? Googleアプリの正体は、ズバリ「Google検索」専用のアプリです。 とはいえ、ブラウザの検索バーとまったく同じというわけではありません。Googleアプリは、周りの世界

  2. React Nativeで動画を背景に使う方法をわかりやすく解説

    この記事では、React Nativeで背景動画(backgroundVideo)を作成する方法を解説します。React Nativeを始めたばかりの方は、まず「React Nativeでモバイルアプリ開発を始めるために知っておくべきこと」といった入門記事を読んでおくと理解がスムーズになります。背景動画はアプリのUIに洗練された印象を与える演出手段です。広告の表示やユーザーへのメッセージ伝達など、さまざまな用途に活用できます。今回はPeletonアプリのホーム画面のようなデザインを目標に、実装方法を見ていきましょう。前提条件実装を始める前に、以下の環境が整っている必要があります。react-n