(注:このアプリではExpoを使用しています)
プリンターのリストを表示するFlatList
をレンダリングしようとしています。これがコードです:
<FlatList
data={printers}
keyExtractor={printer => printer.id}
renderItem={({ item }) => {
return (
<Printer
printerTitle={item.name}
selected={item.selected}
last={item === last(printers)}
/>
);
}}
/>
<Printer />
コンポーネントのコードは次のとおりです。
const Printer = props => {
const { last, printerTitle, selected } = props;
return (
<View style={[styles.container, last ? styles.lastContainer : null]}>
<View style={styles.innerContainer}>
<View style={styles.leftContainter}>
{selected ? (
<Image source={selected ? Images.checkedCircle : null} />
) : null}
</View>
<View style={styles.printerDetails}>
<Text style={styles.printerTitle}>{printerTitle}</Text>
</View>
</View>
</View>
);
};
...
export default Printer;
<Printer />
コンポーネントをレンダリングできないようです。私はFlatList
プロップに同様のカスタムコンポーネント(アプリの別の部分のrenderItem
で機能する)を含めてみましたが、どちらも機能しません。
ただし、<Printer />
コンポーネントを<Text>{item.name}</Text>
コンポーネントに置き換えると、プリンター名が期待どおりに表示されます。
誰かが以前にこの問題に遭遇したことがありますか、または誰かが解決策を持っていますか?
目前に2つの問題があると思います。1つはFlatListが画面(つまり、親ビュー)に表示されないこと、もう1つは、Printerコンポーネントのサイズが正しくないことです。
最初の問題については、{ flex: 1 }
のスタイルをFlatListに配置します。このようにして、親ビューを塗りつぶします。
2番目の問題については、プリンターコンポーネントに{ borderColor: 'red', borderWidth: 1 }
を追加してみてください。これにより、レンダリングされている場所をより簡単に確認できます。幅がないように見える場合は、PrinterコンポーネントのルートビューでalignSelf
をオーバーライドしていないことを確認してください。高さがないように見える場合は、一時的にheight: 100
を追加して、Printerコンポーネントの内容がどのように見えるかを確認します。
Printerコンポーネント内で、{ width: 40, height: 30 }
のようにImageコンポーネントで画像の幅と高さを指定するか、論理ピクセル単位で画像の寸法を指定してください。
リストの各アイテムのカスタムコンポーネントをレンダリングしている私の場合、_{}
_ではなくrenderItem
プロップの戻り部分を誤って_()
_で囲んでいたため、レンダリングされませんでした。
変化:
_<FlatList
data={array}
renderItem={({item, index}) => { <CustomItemComponent /> }}
/>
_
これに:
_<FlatList
data={array}
renderItem={({item, index}) => ( <CustomItemComponent /> )}
/>
_
私の問題を解決しました。
このようにkeyExtractor
を使用することはできません。この関数を以下のようにします。それはあなたの問題を解決するかもしれません。
_keyExtractor = (item, index) => index;
プリンターコンポーネントコードを使用して質問を更新すると、より良いサポートを提供できます。
同じ問題があります。 FlatListに幅を追加して解決する
render() {
const dimensions = Dimensions.get('window');
const screenWidth = dimensions.width;
return(
<FlatList
style={{
flex: 1,
width: screenWidth,
}}
... some code here
/>
)
}
私の場合、誤ってペアタグにしました:<FlatList></FlatList>
、これは何らかの理由でリスト項目のレンダリングを中断します。