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} />
25
demandé sur shalonteoh 2017-04-13 19:53:23

8 réponses

Utilisez la propriété extraData sur votre composant FlatList.

Comme l'indique la documentation:

En passant extraData={this.state} à FlatList nous assurez - FlatList lui-même ré-rendu lors de la state.selected changements. Sans définir ce prop, FlatLis t ne saurait pas qu'il doit rendre à nouveau des éléments car il s'agit également d'un PureComponent et la comparaison des prop ne montrera aucun changement.

69
répondu ED209 2018-05-05 09:48:23

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.

8
répondu SudoPlz 2017-10-18 19:06:39

Essayez:

  1. Définit les données supplémentaires sur une valeur booléenne.

    ExtraData = {ceci.état.actualiser}

  2. Bascule la valeur de l'état booléen lorsque vous souhaitez re-rendre / actualiser la liste

    this.setState({ 
        refresh: !this.state.refresh
    })
    
7
répondu Hradesh Kumar 2018-07-04 07:26:15

Si vous allez avoir un bouton, vous pouvez mettre à jour les données avec un setState dans le onPress. SetState restituera ensuite votre FlatList.

3
répondu WilliamC 2017-04-13 17:30:57

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,
}]
0
répondu Jamland 2018-03-02 14:36:45

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 });
    }
  }
}
0
répondu Dazzle 2018-06-13 12:04:49

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>  
0
répondu goodhyun 2018-08-28 07:54:12

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

0
répondu Mahdi Bashirpour 2018-09-09 13:29:14