ListViewとは異なり、this.state.datasourceを更新できます。 FlatListを更新または再レンダリングする方法や例はありますか?
私の目標は、ユーザーがボタンを押したときにテキスト値を更新することです...
renderEntries({ item, index }) {
return(
<TouchableHighlight onPress={()=> this.setState({value: this.state.data[index].value+1})>
<Text>{this.state.data[index].value}</Text>
</TouchableHighlight>
)
}
<FlatList
ref={(ref) => { this.list = ref; }}
keyExtractor={(item) => item.entry.entryId}
data={this.state.data}
renderItem={this.renderEntries.bind(this)}
horizontal={false} />
FlatListコンポーネントのextraData
プロパティを使用します。
ドキュメントが述べているように:
extraData={this.state}
をFlatList
に渡すことで、state.selected
が変更されたときにFlatList
自体が再レンダリングされるようにします。この小道具を設定しないと、FlatLis
tもアイテムを再レンダリングする必要があることを認識しません。これはPureComponent
でもあり、小道具の比較では変更が表示されないためです。
すばやく簡単な解決策
追加データをブール値に設定します。
extraData = {this.state.refresh}
リストを再レンダリング/リフレッシュしたいときにブール状態の値を切り替えます
this.setState({
refresh: !this.state.refresh
})
ああそれは簡単です、ちょうどextraData
を使用してください
裏側で追加データが機能する方法は、FlatListまたはVirtualisedListです。 - )通常のonComponentWillReceiveProps
メソッドで オブジェクトが変更されたかどうか をチェックするだけです。
だからあなたがしなければならないのはあなたがextraData
に変わる何かを与えることを確認することだけです。
これが私のやり方です。
immutable.js を使っているので、見たいものがすべて含まれているMap(immutable object)を渡すだけです。
<FlatList
data={this.state.calendarMonths}
extraData={Map({
foo: this.props.foo,
bar: this.props.bar
})}
renderItem={({ item })=>((
<CustomComponentRow
item={item}
foo={this.props.foo}
bar={this.props.bar}
/>
))}
/>
このように、this.props.foo
またはthis.props.bar
が変更されると、不変オブジェクトは前のオブジェクトとは異なるため、CustomComponentRow
が更新されます。
Buttonを作成する予定の場合は、onPress内のsetStateを使用してデータを更新できます。 SetStateはFlatListを再描画します。
私は、FlatListにデータプロップの外側でデータの変更を知らせたいのであれば、それをextraDataに設定する必要があることを発見しました。
<FlatList data={...} extraData={this.state} .../>
参照してください: https://facebook.github.io/react-native/docs/flatlist#extradata
extraData={this.state}
を追加することで、この問題を解決しました。詳細については、以下のコードを確認してください。
render() {
return (
<View style={styles.container}>
<FlatList
data={this.state.arr}
extraData={this.state}
renderItem={({ item }) => <Text style={styles.item}>{item}</Text>}
/>
</View>
);
}
たくさんの本当の答えを探して探した結果、ようやく答えが出ました。
<FlatList
data={this.state.data}
renderItem={this.renderItem}
ListHeaderComponent={this.renderHeader}
ListFooterComponent={this.renderFooter}
ItemSeparatorComponent={this.renderSeparator}
refreshing={this.state.refreshing}
onRefresh={this.handleRefresh}
onEndReached={this.handleLoadMore}
onEndReachedThreshold={1}
extraData={this.state.data}
removeClippedSubviews={true}
**keyExtractor={ (item, index) => index }**
/>
.....
私の主な問題は(KeyExtractor)私はこのようにそれを使用していませんでした。動作していません:keyExtractor = {(item)=> item.ID}私はこれに変更した後それは魅力のように働いた私はこれが誰かに役立つことを願っています。
あなたのやりとりによって変更される変数をextraData
に置いてください。
あなたは創造的になることができます。
たとえば、チェックボックスが付いた変更リストを扱っているとします。
<FlatList
data={this.state.data.items}
extraData={this.state.data.items.length * (this.state.data.done.length + 1) }
renderItem={({item}) => <View>
ただ使用してください:
onRefresh={true}
flatList
コンポーネントの中。
私にとっては、トリックはextraDataで、もう1度itemコンポーネントを掘り下げることでした。
state = {
uniqueValue: 0
}
<FlatList
keyExtractor={(item, index) => item + index}
data={this.props.photos}
renderItem={this.renderItem}
ItemSeparatorComponent={this.renderSeparator}
/>
renderItem = (item) => {
if(item.item.selected) {
return ( <Button onPress={this.itemPressed.bind(this, item)}>Selected</Button> );
}
return ( <Button onPress={this.itemPressed.bind(this, item)}>Not selected</Button>);
}
itemPressed (item) {
this.props.photos.map((img, i) => {
if(i === item.index) {
if(img['selected') {
delete img.selected;
} else {
img['selected'] = true;
}
this.setState({ uniqueValue: this.state.uniqueValue +1 });
}
}
}
FlatList
をSectionList
に置き換えましたが、状態が変わると正しく更新されます。
<SectionList
keyExtractor={(item) => item.entry.entryId}
sections={section}
renderItem={this.renderEntries.bind(this)}
renderSectionHeader={() => null}
/>
留意すべき唯一のことはsection
がdiff構造を持つことです。
const section = [{
id: 0,
data: this.state.data,
}]
FlatListにknowデータの変更propとstateの両方にしたい場合は、propとstateの両方を参照するオブジェクトを作成して、flatlistを更新します。
const hasPropOrStateChange = { propKeyToWatch: this.props, ...this.state};
<FlatList data={...} extraData={this.hasPropOrStateChange} .../>
ドキュメント: https://facebook.github.io/react-native/docs/flatlist#extradata