5 réponses

★ Meilleure réponse

T'as vraiment profilé l'appli, ou tu devines à l'aveuglette ? Parce que si la virtualisation ne t'aide pas, c'est probablement parce que tu rerenderises la liste entière à chaque changement d'état - même si y a que 20 éléments visibles, React peut recalculer les données pour les 5000. Essaye d'enrober tes composants de lignes dans `React.memo` et assure-toi que tu ne crées pas de nouvelles fonctions de rappel à chaque rendu (utilise `useCallback`).

D'abord, oublie la virtualisation classique si elle n'aide pas - ça veut dire que le problème vient probablement pas du rendu, mais du fait que tu charges trop de données à la fois ou que tu les recalcules à chaque scroll. Vérifie que tu utilises bien `memo`, `useMemo` et `useCallback` - il arrive souvent que les composants se recalculent pour rien. C'est aussi utile de profiler l'appli avec React DevTools Profiler pour voir où exactement ça bloque : ça peut être le rendu de la liste lui-même, ou peut-être que tu fais des requêtes au serveur à chaque scroll ou que tu recalcules une logique complexe.

Si tu utilises déjà la virtualisation, essaie d'augmenter la taille de la fenêtre de rendu (overscan) ou passe à la pagination au lieu du scroll infini - des fois c'est juste plus simple et plus rapide.

Regarde du côté de la mémoïsation des sélecteurs et des fonctions de rappel - souvent les ralentissements ne viennent pas du rendu lui-même, mais du fait qu'à chaque défilement les filtres se recalculent, le tri se réapplique ou de nouvelles fonctions se créent pour les gestionnaires ! Essaie d'envelopper les sélecteurs dans `useSelector` avec une comparaison correcte ou utilise `useMemo` pour les calculs - ça peut donner un gain de performance bien plus important que juste la virtualisation.

Vérifie combien d'attributs data et de classes tu ajoutes à chaque élément de la liste. Souvent les ralentissements ne viennent pas du nombre de nœuds DOM, mais du fait que le navigateur recalcule constamment les styles et la mise en page à cause des changements de classes lors du défilement. Si tu ajoutes dynamiquement des classes pour l'élément actif ou au survol, ça peut devenir un goulot d'étranglement. Essaie de déplacer ça en CSS en utilisant `nth-child` ou une couche séparée via `position: fixed`, pour que le navigateur ne touche pas à la liste principale.

Deuxième point - assure-toi que tu ne crées pas de nouveaux objets dans les props à chaque rendu. Par exemple, si tu passes `style={{ color: item.color }}` au lieu d'une valeur précalculée, React verra des objets différents et refera le rendu du composant. Même avec la mémoïsation, ça peut ralentir les choses. Mieux vaut préparer les styles à l'avance ou utiliser des variables CSS.

Et encore : si la liste contient des milliers d'éléments, même la virtualisation peut être lente si tu crées trop de nœuds DOM dans la fenêtre visible à la fois. Essaie de réduire le nombre de lignes rendues à la fois - affiche seulement la partie visible plus un petit buffer au-dessus et en dessous. Dans la plupart des bibliothèques de virtualisation, ça se configure via un paramètre comme `overscanRowCount`.

En fait, la virtualisation fonctionne généralement très bien, donc si elle aide vraiment avec le rendu, les ralentissements viennent d'ailleurs. Un problème courant qu'on oublie : tu peux avoir un souci avec le défilement infini et le chargement des données. Si à chaque défilement tu fais une requête pour récupérer une nouvelle portion de produits depuis le serveur et que tu ne mets pas en cache les résultats, le navigateur rame à cause des délais réseau et du parsing JSON, pas à cause des nœuds DOM.

Deuxièmement, vérifie si tu as bien configuré les dimensions de la virtualisation. Souvent, les gens définissent une hauteur d'élément trop petite dans la config, et la bibliothèque comme react-window se met à recalculer les éléments visibles pratiquement à chaque pixel du défilement. Essaie d'augmenter le buffer et spécifie explicitement la hauteur de la ligne, plutôt que de compter sur le calcul automatique.

Votre réponse

Se connecterpour répondre.