Skip to content

Otimizando a configuração da Flatlist

Termos

  • VirtualizedList: O componente por trás do FlatList (implementação do conceito de Lista Virtual do React Native).
  • Consumo de memória: quanta informação sobre sua lista está armazenada na memória, o que pode causar falha no aplicativo.
  • Capacidade de resposta: capacidade do aplicativo de responder às interações. A baixa capacidade de resposta, por exemplo, ocorre quando você toca em um componente e ele espera um pouco para responder, em vez de responder imediatamente conforme o esperado.
  • Áreas em branco: quando VirtualizedList não consegue renderizar seus itens com rapidez suficiente, você pode inserir uma parte de sua lista com componentes não renderizados que aparecem como espaço em branco.
  • Viewport: a área visível do conteúdo que é renderizada em pixels.
  • Window: A área na qual os itens devem ser montados, que geralmente é muito maior que a janela de visualização.

Props

Aqui está uma lista de acessórios que podem ajudar a melhorar o desempenho do FlatList:

removeClippedSubviews

TIPOPADRÃO
BooleanFalse

Se for true, as visualizações que estão fora da viewport serão desanexadas da hierarquia de visualizações nativas.

Prós: Isso reduz o tempo gasto no thread principal e, portanto, reduz o risco de perda de quadros, excluindo visualizações fora da janela de visualização da renderização nativa e das travessias de desenho.

Contras: Esteja ciente de que esta implementação pode ter bugs, como conteúdo ausente (observado principalmente no iOS), especialmente se você estiver fazendo coisas complexas com transformações e/ou posicionamento absoluto. Observe também que isso não economiza memória significativa porque as visualizações não são desalocadas, apenas desanexadas.

maxToRenderPerBatch

TIPOPADRÃO
Number10

É um suporte VirtualizedList que pode ser passado por FlatList. Isso controla a quantidade de itens renderizados por lote, que é o próximo pedaço de itens renderizados em cada pergaminho.

Prós: Definir um número maior significa menos áreas em branco visuais durante a rolagem (aumenta a taxa de preenchimento).

Contras: mais itens por lote significam períodos mais longos de execução de JavaScript, potencialmente bloqueando o processamento de outros eventos, como clicks, prejudicando a capacidade de resposta.

updateCellsBatchingPeriod

TIPOPADRÃO
Number50

Enquanto maxToRenderPerBatch informa a quantidade de itens renderizados por lote, a configuração updateCellsBatchingPeriod informa ao VirtualizedList o atraso em milissegundos entre as renderizações em lote (com que frequência seu componente renderizará os itens em janela).

Prós: combinar esta propriedade com maxToRenderPerBatch dá a você o poder de, por exemplo, renderizar mais itens em um lote menos frequente ou menos itens em um lote mais frequente.

Contras: Lotes menos frequentes podem causar áreas em branco. Lotes mais frequentes podem causar problemas de capacidade de resposta.

initialNumToRender

TIPOPADRÃO
Number10

A quantidade inicial de itens a serem renderizados.

Prós: Defina o número preciso de itens que cobririam a tela de cada dispositivo. Isso pode ser um grande aumento de desempenho para a renderização inicial.

Contras: Definir um initialNumToRender baixo pode causar áreas em branco, especialmente se for muito pequeno para cobrir a janela de visualização na renderização inicial.

windowSize

TIPOPADRÃO
Number21

O número passado aqui é uma unidade de medida onde 1 é equivalente à altura da sua janela de visualização. O valor padrão é 21 (10 viewports acima, 10 abaixo e uma intermediária).

Prós: windowSize maior resultará em menos chance de ver espaços em branco durante a rolagem. Por outro lado, windowSize menor resultará em menos itens montados simultaneamente, economizando memória.

Contras: Para um tamanho de janela maior, você terá mais consumo de memória. Para um tamanho de janela menor, você terá uma chance maior de ver áreas em branco.

Lista de itens

Abaixo estão algumas dicas sobre os componentes dos itens da lista. Eles são o núcleo da sua lista, por isso precisam ser rápidos.

Use componentes básicos

Quanto mais complexos forem seus componentes, mais lento eles serão renderizados. Tente evitar muita lógica e aninhamento nos itens da sua lista. Se você reutiliza muito esse componente de item de lista em seu aplicativo, crie um componente apenas para suas listas grandes e faça-as com o mínimo de lógica e aninhamento possível.

Use componentes leves

Quanto mais pesados forem seus componentes, mais lento eles serão renderizados. Evite imagens pesadas (use uma versão recortada ou miniatura para os itens da lista, o menor possível). Converse com sua equipe de design, use o mínimo possível de efeitos, interações e informações em sua lista. Mostre-os nos detalhes do seu item.

Usar shouldComponentUpdate

Implemente a verificação de atualização em seus componentes. O PureComponent do React implementa um shouldComponentUpdate com comparação superficial. Isso é caro aqui porque precisa verificar todos os seus props. Se você deseja um bom desempenho em nível de bits, crie as regras mais rígidas para os componentes dos itens da lista, verificando apenas os props que podem mudar. Se sua lista for básica o suficiente, você pode até usar

js
shouldComponentUpdate() {
  return false
}

Use imagens otimizadas em cache

Você pode usar os pacotes da comunidade (como react-native-fast-image de @DylanVann) para obter imagens com melhor desempenho. Cada imagem na sua lista é uma nova instância de Image(). Quanto mais rápido ele atingir o gancho carregado, mais rápido seu thread JavaScript ficará livre novamente.

Use getItemLayout

Se todos os componentes do item da sua lista tiverem a mesma altura (ou largura, para uma lista horizontal), fornecer a propriedade getItemLayout elimina a necessidade de sua FlatList gerenciar cálculos de layout assíncronos. Esta é uma técnica de otimização muito desejável.

Se seus componentes têm tamanho dinâmico e você realmente precisa de desempenho, pergunte à sua equipe de design se eles podem pensar em um redesenho para ter um melhor desempenho.

Use keyExtractor ou key

Você pode definir o keyExtractor para o seu componente FlatList. Este suporte é usado para armazenamento em cache e como chave React para rastrear a reordenação de itens.

Você também pode usar um prop key em seu componente de item.

Evite função anônima em renderItem

Para componentes funcionais, mova a função renderItem para fora do JSX retornado. Além disso, certifique-se de que ele esteja encapsulado em um gancho useCallback para evitar que seja recriado a cada renderização.

Para componentes de classe, mova a função renderItem para fora da função de renderização, para que ela não se recrie cada vez que a função de renderização for chamada.

jsx
const renderItem = useCallback(({item}) => (
   <View key={item.key}>
      <Text>{item.title}</Text>
   </View>
 ), []);

return (
  // ...

  <FlatList data={items} renderItem={renderItem} />;
  // ...
);