Comment re-rendre flatlist?
Contrairement à ListView, nous pouvons mettre à jour ceci.état.source de données. Existe-t-il une méthode ou un exemple pour mettre à jour FlatList ou le rendre à nouveau?
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} />
8 réponses
Utilisez la propriété extraData sur votre composant FlatList.
Comme l'indique la documentation:
En passant
extraData={this.state}àFlatListnous assurez -FlatListlui-même ré-rendu lors de lastate.selectedchangements. Sans définir ce prop,FlatList ne saurait pas qu'il doit rendre à nouveau des éléments car il s'agit également d'unPureComponentet la comparaison des prop ne montrera aucun changement.
Oh que c'est facile, il suffit d'utiliser extraData
Vous voyez comment les données supplémentaires fonctionnent dans les coulisses est le FlatList  ou le VirtualisedList {[11] } vérifie simplement  Si cet objet a changé via une méthode normale onComponentWillReceiveProps.
Donc, tout ce que vous avez à faire est de vous assurer de donner quelque chose qui change au extraData.
Voici ce que je fais:
J'utilise immuable.js donc tout ce que je fais est de passer une carte (objet immuable) qui contient ce que je veux Regarde.
<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 changent, notre CustomComponentRow sera mis à jour, car l'objet immuable sera différent du précédent.
Essayez:
- 
Définit les données supplémentaires sur une valeur booléenne. ExtraData = {ceci.état.actualiser} 
- 
Bascule la valeur de l'état booléen lorsque vous souhaitez re-rendre / actualiser la liste this.setState({ refresh: !this.state.refresh })
Si vous allez avoir un bouton, vous pouvez mettre à jour les données avec un setState dans le onPress. SetState restituera ensuite votre FlatList.
J'ai remplacé FlatList par SectionList et il est mis à jour correctement sur le 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 ont une structure de diff: 
const section = [{
  id: 0,
  data: this.state.data,
}]
Pour moi, l'astuce était extraData et percer dans le composant item une fois de plus
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 });
    }
  }
}
Mettez les variables qui seront modifiées par votre interaction à extraData 
Vous pouvez être créatif.
Par exemple, si vous avez affaire à une liste changeante 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>  
OK.Je viens de découvrir que si nous voulons que la FlatList connaisse le changement de données en dehors du prop de données, nous devons le définir sur extraData, donc je le fais comme ceci maintenant:
<FlatList data={...} extraData={this.state} .../>
Se référer à: https://facebook.github.io/react-native/docs/flatlist#extradata