Salut à tous,
En travaillant sur certaines améliorations de performances, j'ai découvert que rowHasChanged
n'était appelé dans aucune de nos listes. Ces listes sont des listes à défilement infini, ce qui signifie que lorsque vous atteignez la fin, il récupère plus d'éléments à afficher, puis les place dans la liste.
Il semble que toutes les entrées de la liste soient mises à jour chaque fois que nous modifions le contenu de la source de données. Nous avons un shouldComponentUpdate
en place pour toutes les lignes, mais d'après ce que j'ai compris rowHasChanged
, ces lignes n'auraient pas besoin d'être rendues à nouveau.
J'ai créé un exemple simple qui montre comment nous ajoutons des éléments à la liste : https://gist.github.com/janmonschke/c9c84b6050683da0c64f
Ce que nous faisons essentiellement, c'est :
constructor() {
// (...)
this.ds = new ListView.DataSource({rowHasChanged: (r1, r2) => {
console.log('rowHasChanged');
return r1 !== r2;
}});
// (...)
}
onEndReached = () => {
// append data to the end
setData = [...setData, ...genRandomSet()];
this.setState({
dataSource: this.ds.cloneWithRows(setData)
});
console.log('onEndReached');
};
render() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this.renderRow}
onEndReached={this.onEndReached}
/>
);
}
Mais rowHasChanged
n'est jamais enregistré.
Est-ce que je l'utilise d'une manière ou d'une autre d'une manière incorrecte ? Existe-t-il de meilleures façons d'ajouter à un ListView ?
Même comportement dans 0.18.0
et 0.19.0
Hé janmonschke, merci d'avoir signalé ce problème !
React Native, comme vous l'avez probablement entendu, devient très populaire et la vérité est que nous sommes un peu dépassés par l'activité qui l'entoure. Il y a tout simplement trop de problèmes pour que nous puissions les gérer correctement.
react-native
ou pour plus d'interactions en temps réel, demandez sur Discord dans le #react-canal natif.D'accord, j'ai trouvé la solution dans : http://stackoverflow.com/a/33871118.
Apparemment, il est important de cloner à partir de la bonne instance DataSource ;)
Donc, le code de l'essentiel aurait dû être :
setData = [...setData, ...genRandomSet()];
this.setState({
dataSource: this.state.dataSource.cloneWithRows(setData)
});
Cela ressemble à une erreur qui se faufile facilement dans votre base de code. Je me demande si l'utilisation correcte de DataSource
devrait être davantage soulignée dans la documentation.
Merci @janmonschke ! Je suis d'accord, j'avais un tas de vues constamment restituées et je ne pouvais pas comprendre pourquoi cela se produisait et pourquoi la fonction rowHasChanged
n'était jamais appelée. 👊
Commentaire le plus utile
D'accord, j'ai trouvé la solution dans : http://stackoverflow.com/a/33871118.
Apparemment, il est important de cloner à partir de la bonne instance DataSource ;)
Donc, le code de l'essentiel aurait dû être :
Cela ressemble à une erreur qui se faufile facilement dans votre base de code. Je me demande si l'utilisation correcte de
DataSource
devrait être davantage soulignée dans la documentation.