Contrairement à ListView, nous pouvons mettre à jour this.state.datasource. Existe-t-il une méthode ou un exemple pour mettre à jour FlatList ou le restituer?
Mon objectif est de mettre à jour la valeur du texte lorsque l'utilisateur appuie sur le bouton ...
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} />
Utilisez la propriété extraData
sur votre composant FlatList.
Comme le dit la documentation:
En passant
extraData={this.state}
àFlatList
, nous nous assurons queFlatList
lui-même sera rendu à nouveau lorsque lestate.selected
sera modifié. Sans définir cet accessoire,FlatLis
t ne saura pas qu'il doit restituer les éléments car il s'agit également d'unPureComponent
et la comparaison de l'accessoire ne présentera aucun changement.
Essayer:
définir des données supplémentaires sur une valeur booléenne.
extraData = {this.state.refresh}
Basculer la valeur de l'état booléen lorsque vous souhaitez rendre/actualiser la liste
this.setState({
refresh: !this.state.refresh
})
Oh c'est facile, il suffit d'utiliser extraData
Vous voyez comment les données supplémentaires fonctionnent en coulisse: FlatList ou VirtualisedList vérifie simplement si cet objet a changé via une méthode onComponentWillReceiveProps
normale.
Donc, tout ce que vous avez à faire est de vous assurer que vous donnez quelque chose qui change la extraData
.
Voici ce que je fais:
J'utilise immutable.js donc je ne fais que passer une carte (objet immuable) contenant tout ce que je veux regarder.
<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}
/>
))}
/>
De cette façon, lorsque this.props.foo
ou this.props.bar
changera, notre CustomComponentRow
sera mis à jour, car l'objet immuable sera différent de l'objet précédent.
Si vous allez avoir un bouton, vous pouvez mettre à jour les données avec un setState dans le onPress. SetState rendra à nouveau votre FlatList.
OK.Je viens de découvrir que si nous voulons que FlatList connaisse le changement de données en dehors de l’accessoire de données, nous devons le définir sur extraData, je le fais comme ceci maintenant:
<FlatList data={...} extraData={this.state} .../>
se référer à: https://facebook.github.io/react-native/docs/flatlist#extradata
Il suffit d'utiliser:
onRefresh={true}
dans votre composant flatList
.
J'ai résolu ce problème en ajoutant extraData={this.state}
Merci de vérifier le code ci-dessous pour plus de détails
render() {
return (
<View style={styles.container}>
<FlatList
data={this.state.arr}
extraData={this.state}
renderItem={({ item }) => <Text style={styles.item}>{item}</Text>}
/>
</View>
);
}
Dans cet exemple, pour forcer un nouveau rendu, changez simplement la variable machine
const [selected, setSelected] = useState(machine)
useEffect(() => {
setSelected(machine)
}, [machine])
Placez les variables qui seront modifiées par votre interaction à extraData
Vous pouvez être créatif.
Par exemple, si vous utilisez une liste de changement avec des cases à cocher.
<FlatList
data={this.state.data.items}
extraData={this.state.data.items.length * (this.state.data.done.length + 1) }
renderItem={({item}) => <View>
après beaucoup de recherches et de recherche d'une réponse réelle, j'ai enfin la réponse qui, à mon avis, est la meilleure:
<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 }**
/>
.....
mon problème principal était (KeyExtractor) Je ne l'utilisais pas comme ceci . ne fonctionnait pas: keyExtractor = {(item) => item.ID} après l'avoir modifiée, cela fonctionnait comme un charme J'espère que ça aidera quelqu'un.
Pour moi, le truc était extraData et une descente dans le composant d'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 });
}
}
}
J'ai remplacé FlatList
par SectionList
et il est mis à jour correctement lors du changement d'état.
<SectionList
keyExtractor={(item) => item.entry.entryId}
sections={section}
renderItem={this.renderEntries.bind(this)}
renderSectionHeader={() => null}
/>
La seule chose à garder à l’esprit est que section
possède une structure diff:
const section = [{
id: 0,
data: this.state.data,
}]
Dans react-native-flatlist, il s’agit d’une propriété appelée extraData. ajoutez la ligne ci-dessous à votre liste.
<FlatList
data={data }
style={FlatListstyles}
extraData={this.state}
renderItem={this._renderItem}
/>
Si nous voulons que la FlatList connaisse le changement de données les deux propriétés prop et state, nous pouvons construire un objet référençant à la fois les propriétés prop et state et actualiser la liste standard.
const hasPropOrStateChange = { propKeyToWatch: this.props, ...this.state};
<FlatList data={...} extraData={this.hasPropOrStateChange} .../>
Docs: https://facebook.github.io/react-native/docs/flatlist#extradata