Existe-t-il une approche systématique pour déboguer ce qui provoque le re-rendu d'un composant dans React? J'ai mis un simple console.log () pour voir combien de fois il est rendu, mais j'ai du mal à comprendre ce qui cause le rendu du composant plusieurs fois, c'est-à-dire (4 fois) dans mon cas. Existe-t-il un outil qui affiche une chronologie et / ou tous les rendus et l'ordre de l'arborescence des composants?
156
shouldComponentUpdate
pour désactiver la mise à jour automatique des composants, puis démarrer votre trace à partir de là. Plus d'informations peuvent être trouvées ici: facebook.github.io/react/docs/optimizing-performance.htmlRéponses:
Si vous voulez un court extrait sans aucune dépendance externe, je trouve cela utile
Voici un petit crochet que j'utilise pour suivre les mises à jour des composants de fonction
la source
setState
méthode (dans un composant de classe) avecsetState(...args) { super.setState(...args) }
, puis définir un point d'arrêt dans votre débogueur que vous pourrez alors pour remonter à la fonction définissant l'état.useTraceUpdate
après l'avoir défini tel que vous l'avez écrit?function MyComponent(props) { useTraceUpdate(props); }
et il sera journalisé chaque fois que les accessoires changentthis.state
n'est donc pas défini.Voici quelques exemples de rendu d'un composant React.
this.setState()
dans le composant. Cela déclenchera les méthodes du cycle de vie des composants suivantsshouldComponentUpdate
>componentWillUpdate
>render
>componentDidUpdate
props
. Ce déclencheur de volontécomponentWillReceiveProps
>shouldComponentUpdate
>componentWillUpdate
>render
>componentDidUpdate
(connect
méthode dereact-redux
déclenchement quand il y a des changements applicables dans le magasin Redux)this.forceUpdate
qui est similaire àthis.setState
Vous pouvez minimiser le rendu de votre composant en implémentant une vérification dans votre
shouldComponentUpdate
et en retournantfalse
si ce n'est pas nécessaire.Une autre façon consiste à utiliser
React.PureComponent
des composants ou sans état. Les composants purs et sans état ne sont restitués que lorsque des modifications sont apportées à leurs accessoires.la source
shouldComponentUpdate
ou étendreReact.PureComponent
pour appliquer uniquement le re-rendu en cas de modification.const MyComponent = (props) => <h1>Hello {props.name}</h1>;
(c'est un composant sans état). Il sera de nouveau rendu à chaque fois que le composant parent sera de nouveau rendu.La réponse de @ jpdelatorre est excellente pour mettre en évidence les raisons générales pour lesquelles un composant React pourrait être rendu à nouveau.
Je voulais juste me plonger un peu plus dans un cas: quand les accessoires changent . Le dépannage de ce qui provoque le rendu d'un composant React est un problème courant, et d'après mon expérience, la plupart du temps, le suivi de ce problème implique de déterminer quels accessoires changent .
Les composants React sont rendus à nouveau chaque fois qu'ils reçoivent de nouveaux accessoires. Ils peuvent recevoir de nouveaux accessoires comme:
<MyComponent prop1={currentPosition} prop2={myVariable} />
ou si
MyComponent
est connecté à un magasin redux:Chaque fois que la valeur de
prop1
,prop2
,prop3
ou lesprop4
changementsMyComponent
seront réengendrer. Avec 4 accessoires, il n'est pas trop difficile de savoir quels accessoires changent en plaçant unconsole.log(this.props)
à ce début durender
bloc. Cependant, avec des composants plus compliqués et de plus en plus d'accessoires, cette méthode est intenable.Voici une approche utile (en utilisant lodash pour plus de commodité) pour déterminer quels changements d'accessoires entraînent le nouveau rendu d'un composant:
L'ajout de cet extrait de code à votre composant peut aider à révéler le coupable à l'origine de ré-rendus douteux, et cela permet souvent de faire la lumière sur les données inutiles acheminées vers les composants.
la source
UNSAFE_componentWillReceiveProps(nextProps)
et obsolète. "Ce cycle de vie a été précédemment nommécomponentWillReceiveProps
. Ce nom continuera à fonctionner jusqu'à la version 17." À partir de la documentation React .Etrange personne n'a donné cette réponse mais je la trouve très utile, d'autant plus que les changements d'accessoires sont presque toujours profondément imbriqués.
Crochets fanboys:
"Vieux" fanboys d'école:
PS Je préfère toujours utiliser HOC (composant d'ordre supérieur) car parfois vous avez déstructuré vos accessoires en haut et la solution de Jacob ne convient pas bien
Clause de non-responsabilité: aucune affiliation avec le propriétaire du package. Il suffit de cliquer des dizaines de fois pour essayer de repérer la différence entre les objets profondément imbriqués.
la source
Il y a maintenant un crochet pour cela disponible sur npm:
https://www.npmjs.com/package/use-trace-update
(Divulgation, je l'ai publié) Mise à jour: Développé sur la base du code de Jacob Rask
la source
L'utilisation de crochets et de composants fonctionnels, et pas seulement d'un changement d'accessoire, peut provoquer un réacheminement. Ce que j'ai commencé à utiliser, c'est un journal plutôt manuel. J'ai beaucoup aidé. Vous pourriez aussi le trouver utile.
Je colle cette partie dans le fichier du composant:
Au début de la méthode je garde une référence WeakMap:
Puis après chaque appel "suspect" (accessoires, hooks) j'écris:
la source
Les réponses ci-dessus sont très utiles, juste au cas où quelqu'un chercherait une méthode spécifique pour détecter la cause du rerender, alors j'ai trouvé cette bibliothèque redux-logger très utile.
Ce que vous pouvez faire est d'ajouter la bibliothèque et d'activer la différence entre les états (il est là dans la documentation) comme:
Et ajoutez le middleware dans le magasin.
Mettez ensuite un
console.log()
dans la fonction de rendu du composant que vous souhaitez tester.Ensuite, vous pouvez exécuter votre application et vérifier les journaux de la console, partout où il y a un journal juste avant, il vous montrera la différence entre l'état
(nextProps and this.props)
et vous pourrez décider si le rendu est vraiment nécessaire là-basIl sera similaire à l'image ci-dessus avec la touche diff.
la source