¿Existe un enfoque sistemático para depurar lo que está causando que un componente se vuelva a procesar en React? Puse un simple console.log () para ver cuántas veces se procesa, pero tengo problemas para descubrir qué está causando que el componente se procese varias veces, es decir (4 veces) en mi caso. ¿Existe una herramienta que muestre una línea de tiempo y / o todos los componentes del árbol y el orden?
156
shouldComponentUpdate
para deshabilitar la actualización automática de componentes y luego comenzar su rastreo desde allí. Puede encontrar más información aquí: facebook.github.io/react/docs/optimizing-performance.htmlRespuestas:
Si desea un fragmento corto sin dependencias externas, me parece útil
Aquí hay un pequeño gancho que uso para rastrear actualizaciones a componentes de funciones
fuente
setState
método (en un componente de clase) consetState(...args) { super.setState(...args) }
y luego establecer un punto de interrupción en su depurador que luego podrá para rastrear hasta la función que establece el estado.useTraceUpdate
después de haberlo definido como lo escribiste?function MyComponent(props) { useTraceUpdate(props); }
y se registrará cada vez que cambie la utileríathis.state
lo que no está definido.Aquí hay algunos casos en que un componente React se volverá a representar.
this.setState()
dentro del componente. Esto dará lugar a los siguientes métodos de ciclo de vida de componentesshouldComponentUpdate
>componentWillUpdate
>render
>componentDidUpdate
props
. Este disparador voluntadcomponentWillReceiveProps
>shouldComponentUpdate
>componentWillUpdate
>render
>componentDidUpdate
(connect
método dereact-redux
gatillo esto cuando hay cambios aplicables en la tienda Redux)this.forceUpdate
que es similar athis.setState
Puede minimizar la
shouldComponentUpdate
devolución de su componente implementando un cheque dentro de su y devolviendofalse
si no es necesario.Otra forma es usar
React.PureComponent
componentes sin estado. Los componentes puros y sin estado solo se vuelven a renderizar cuando hay cambios en sus accesorios.fuente
shouldComponentUpdate
, o extenderReact.PureComponent
, para exigir solo volver a representar en el cambio.const MyComponent = (props) => <h1>Hello {props.name}</h1>;
(es un componente sin estado). Se volverá a representar cada vez que se vuelva a representar el componente principal.La respuesta de @ jpdelatorre es excelente para destacar las razones generales por las que un componente React podría volver a renderizarse.
Solo quería profundizar un poco más en una instancia: cuando cambian los accesorios . La resolución de problemas que está causando que un componente React se vuelva a procesar es un problema común, y en mi experiencia, muchas veces rastrear este problema implica determinar qué accesorios están cambiando .
Los componentes de reacción se renderizan cada vez que reciben nuevos accesorios. Pueden recibir nuevos accesorios como:
<MyComponent prop1={currentPosition} prop2={myVariable} />
o si
MyComponent
está conectado a una tienda redux:Cada vez que el valor de
prop1
,prop2
,prop3
, oprop4
cambiosMyComponent
será volver a hacer. Con 4 accesorios, no es demasiado difícil rastrear qué accesorios están cambiando colocando unconsole.log(this.props)
al comienzo delrender
bloque. Sin embargo, con componentes más complicados y más y más accesorios, este método es insostenible.Aquí hay un enfoque útil (usando lodash por conveniencia) para determinar qué cambios de utilería están causando que un componente se vuelva a renderizar:
Agregar este fragmento a su componente puede ayudar a revelar al culpable que causa reprocesamientos cuestionables, y muchas veces esto ayuda a arrojar luz sobre los datos innecesarios que se canalizan a los componentes.
fuente
UNSAFE_componentWillReceiveProps(nextProps)
y está en desuso. "Este ciclo de vida se denominó anteriormentecomponentWillReceiveProps
. Ese nombre continuará funcionando hasta la versión 17." De la documentación de React .Es extraño que nadie haya dado esa respuesta, pero me parece muy útil, especialmente porque los cambios de accesorios casi siempre están profundamente anidados.
Ganchos fanboys:
Fanboys de la "vieja escuela":
PD: Todavía prefiero usar HOC (componente de orden superior) porque a veces has desestructurado tus accesorios en la parte superior y la solución de Jacob no encaja bien
Descargo de responsabilidad: ninguna afiliación con el propietario del paquete. Simplemente hacer clic decenas de veces para tratar de detectar la diferencia en objetos profundamente anidados es un dolor en el.
fuente
Ahora hay un gancho para esto disponible en npm:
https://www.npmjs.com/package/use-trace-update
(Divulgación, lo publiqué) Actualización: Desarrollado en base al código de Jacob Rask
fuente
El uso de ganchos y componentes funcionales, no solo el cambio de apoyo, puede causar una nueva recuperación. Lo que comencé a usar es un registro bastante manual. Me ayudé mucho Puede que también te resulte útil.
Pego esta parte en el archivo del componente:
Al comienzo del método mantengo una referencia de WeakMap:
Luego, después de cada llamada "sospechosa" (accesorios, ganchos), escribo:
fuente
Las respuestas anteriores son muy útiles, en caso de que si alguien está buscando un método específico para detectar la causa de la devolución, encontré esta biblioteca redux-logger muy útil.
Lo que puede hacer es agregar la biblioteca y habilitar la diferencia entre estados (está en los documentos) como:
Y agregue el middleware en la tienda.
Luego coloque un
console.log()
en la función de renderizado del componente que desea probar.Luego, puede ejecutar su aplicación y buscar registros de la consola. Donde sea que haya un registro justo antes, le mostrará la diferencia entre el estado
(nextProps and this.props)
y podrá decidir si realmente se necesita renderizar allíSerá similar a la imagen de arriba junto con la tecla diff.
fuente