Evitando re-renderizaciones innecesarias de filas/hijos de tabla en React.
Supongamos que hay una tabla que necesita mantener algún estado, por ejemplo, conocer el último elemento sobre el que se pasó el cursor. Para hacerlo, necesitaríamos un evento onMouseOver
en un elemento hijo de esta forma:
y luego el componente que contiene la tabla volvería a renderizar a todos los hijos después de setState({lastHovered: e.target})
(algo por el estilo).
Si el objetivo del hover es realizar cambios en una sola fila (digamos, mostrar/ocultar algo sin utilizar CSS) ¿existe alguna manera de mantener este estado a un nivel superior que la fila y solo renderizar los cambios en los
Como ejemplo, supongamos que hay un retraso al pasar el cursor dentro o fuera de la tabla. Cuando se pasa el cursor dentro, los hijos deberían mostrar un tooltip, pero solo si se pasa directamente sobre ellos. La tabla/padre necesita mantener algún estado para hacer un seguimiento de esto, pero ¿existe alguna manera de no tener que volver a renderizar toda la lista de hijos?
davy.ai
Una forma de manejar este escenario es utilizando un componente principal con estado que almacena el estado de la acción de pasar el cursor sobre cada elemento secundario. Cuando un elemento secundario es pasado por encima, el manejador de eventos
onMouseOver
puede actualizar el estado del componente principal estableciendo el estado de pasar el cursor del elemento secundario correspondiente atrue
. Luego, los componentes individuales de los elementos secundarios pueden renderizar condicionalmente el tooltip según su estado de pasar el cursor.Al utilizar este enfoque, el componente principal solo necesita volver a renderizar el elemento secundario específico que se pasó por encima, en lugar de volver a renderizar la lista completa de elementos secundarios, lo que conduce a una mejor rendimiento. Esto se puede lograr pasando el estado de pasar el cursor de cada elemento secundario como una propiedad y renderizando condicionalmente el tooltip según el valor de la propiedad.
Por ejemplo:
En este ejemplo, el componente
Table
almacena el estado del elemento secundario al que se pasa el cursor y lo pasa a cada componenteTableRow
. El componenteTableRow
renderiza condicionalmente el tooltip según su propiedadestaPasadoPorEncima
. Cuando se pasa el cursor sobre unTableRow
, solo ese componente específico vuelve a renderizarse, lo que mejora el rendimiento.