Olá a todos,
Enquanto trabalhava em algumas melhorias de desempenho, descobri que rowHasChanged
não foi chamado em nenhuma de nossas listas. Essas listas são listas de rolagem infinita, o que significa que, quando você chegar ao final, ele buscará mais itens para exibir e depois os despejará na lista.
Parece que todas as entradas da lista são atualizadas sempre que alteramos o conteúdo do DataSource. Temos um shouldComponentUpdate
em vigor para todas as linhas, mas pelo que entendi rowHasChanged
, essas linhas não precisariam ser renderizadas novamente.
Criei um exemplo simples que mostra como estamos anexando itens à lista: https://gist.github.com/janmonschke/c9c84b6050683da0c64f
O que basicamente fazemos é:
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}
/>
);
}
Mas rowHasChanged
nunca é registrado.
Será que estou usando de alguma forma errada? Existem maneiras melhores de anexar a um ListView?
Mesmo comportamento em 0.18.0
e 0.19.0
Ei janmonschke, obrigado por relatar este problema!
React Native, como você provavelmente já ouviu falar, está se tornando muito popular e a verdade é que estamos ficando um pouco sobrecarregados com a atividade em torno dele. Há apenas muitos problemas para nós gerenciarmos adequadamente.
react-native
ou para mais interações em tempo real, pergunte no Discord no #react-native canal.Ok, encontrei a solução em: http://stackoverflow.com/a/33871118.
Aparentemente, é importante clonar da instância correta do DataSource;)
Portanto, o código da essência deveria ter sido:
setData = [...setData, ...genRandomSet()];
this.setState({
dataSource: this.state.dataSource.cloneWithRows(setData)
});
Isso parece um erro que está se infiltrando facilmente em sua base de código. Gostaria de saber se o uso correto de DataSource
deveria ser mais enfatizado na documentação.
Obrigado @janmonschke! Eu concordo, eu tinha um monte de visualizações constantemente re-renderizando e eu não conseguia descobrir por que isso estava acontecendo e por que a função rowHasChanged
nunca estava sendo chamada. 👊
Comentários muito úteis
Ok, encontrei a solução em: http://stackoverflow.com/a/33871118.
Aparentemente, é importante clonar da instância correta do DataSource;)
Portanto, o código da essência deveria ter sido:
Isso parece um erro que está se infiltrando facilmente em sua base de código. Gostaria de saber se o uso correto de
DataSource
deveria ser mais enfatizado na documentação.