React Nativeの公式ドキュメントを和訳してみる 11 -リストビューの利用

注意
  • 当記事はReact Native 0.51の公式ドキュメントの独自和訳です。間違いなどあればご指摘ください。
  • バージョン0.51のドキュメントに準拠します。
  • 参照リンク先は基本的に元サイトです。リンク先サイトを和訳したらそのページに差し替えます。
  • 本家サイトではシミュレータがあり、コードを編集しながら実行でき便利です。
  • Facebook社に無断なので怒られたら消します。

元サイト
facebook.github.io

React Nativeにはデータリストを渡すためのコンポーネントがあります。大抵はFlatListかSectionListを使う事になります。

FlatListコンポーネントは、似たような構造で変化しているデータをスクロールリストとして描画します。FlatListは時間とともに個数が変わるような長いデータリストに適しています。より包括的なScrollViewと異なり、FlatListは現在画面に表示されている要素のみを描画します。全ての要素を一度に描画するわけではありません。

FlatListコンポーネントには2つのpropが必要です。dataとrenderItemです。dataはリストの情報ソースです。renderItemはソースから一つのアイテムを取得し、描画用に整形されたコンポーネントを返します。

この例ではハードコーディングされたデータを用いた単純なFlatListを作ります。data propの中のそれぞれのアイテムはTextコンポーネントとして描画されます。FlatListBasicsコンポーネントは、それに従ってFlatListと全てのTextコンポーネントを描画します。

import React, { Component } from 'react';
import { AppRegistry, FlatList, StyleSheet, Text, View } from 'react-native';

export default class FlatListBasics extends Component {
  render() {
    return (
      <View style={styles.container}>
        <FlatList
          data={[
            {key: 'Devin'},
            {key: 'Jackson'},
            {key: 'James'},
            {key: 'Joel'},
            {key: 'John'},
            {key: 'Jillian'},
            {key: 'Jimmy'},
            {key: 'Julie'},
          ]}
          renderItem={({item}) => <Text style={styles.item}>{item.key}</Text>}
        />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
   flex: 1,
   paddingTop: 22
  },
  item: {
    padding: 10,
    fontSize: 18,
    height: 44,
  },
})

// Create React Native Appを使っている時はこの行を飛ばす
AppRegistry.registerComponent('AwesomeProject', () => FlatListBasics);


もし、iOS上のUITableViewのように、セクションヘッダーなどでセクションが分割されるようなデータセットを描画したい時は、SectionListを使うのが良いでしょう。

import React, { Component } from 'react';
import { AppRegistry, SectionList, StyleSheet, Text, View } from 'react-native';

export default class SectionListBasics extends Component {
  render() {
    return (
      <View style={styles.container}>
        <SectionList
          sections={[
            {title: 'D', data: ['Devin']},
            {title: 'J', data: ['Jackson', 'James', 'Jillian', 'Jimmy', 'Joel', 'John', 'Julie']},
          ]}
          renderItem={({item}) => <Text style={styles.item}>{item}</Text>}
          renderSectionHeader={({section}) => <Text style={styles.sectionHeader}>{section.title}</Text>}
          keyExtractor={(item, index) => index}
        />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
   flex: 1,
   paddingTop: 22
  },
  sectionHeader: {
    paddingTop: 2,
    paddingLeft: 10,
    paddingRight: 10,
    paddingBottom: 2,
    fontSize: 14,
    fontWeight: 'bold',
    backgroundColor: 'rgba(247,247,247,1.0)',
  },
  item: {
    padding: 10,
    fontSize: 18,
    height: 44,
  },
})

// Create React Native Appを使っている時はこの行を飛ばす
AppRegistry.registerComponent('AwesomeProject', () => SectionListBasics);

リストビューの一番よく使うケースの一つに、サーバーから取得したデータを描画するというのあるでしょう。それを実行するには、React Nativeでのネットワーキングを学ぶ必要があります。