Hola, esto es más como una pregunta, me gustaría abrir una discusión sobre la manipulación del DOM en componentDidUpdate
.
Estoy creando un complemento de React. Tiene que hacer algunos cálculos DOM, porque CSS no es lo suficientemente poderoso como para cubrir todo lo que este complemento necesita hacer. El problema es que necesito ajustar algunas propiedades CSS dependiendo del valor de retorno de getBoundingClientRect () de algún otro elemento DOM representado por el mismo componente .
Entonces técnicamente tenemos 3 opciones:
1) Calcule getBoundingClientRect
en componentDidUpdate
y llame a setState
con valores calculados. Tengo miedo del bucle infinito que podría suceder en ciertos casos, así que no iría por este.
2) Hazlo como en 1) y juega un poco con shouldComponentUpdate
, pero esto parece muy complejo y no legible. Surgen muchas preguntas que dependen del caso de uso específico.
3) Actualice DOM desde componentDidUpdate. Esta es la solución que decidí elegir, funciona, es simple, estable y funciona según lo previsto. Sin embargo, siento que estoy al límite, así que quería comprobar que esta es una buena forma de hacer las cosas. ¿Está bien manipular DOM en componentDidUpdate
? Se llama cada vez que se hace render
, y estoy de acuerdo con tirar mis cambios, porque para el próximo render
modificaré DOM nuevamente.
Aquí hay una parte del código.
componentDidMount() {
this.recalculateIndent();
}
componentDidUpdate() {
this.recalculateIndent();
}
recalculateIndent() {
// calculate indent based on getBoundingClientRect of some DOM reference
this.textareaRef.style.textIndent = `${indent}px`;
}
render() {
return (
...
<textarea ref={ref => this.textareaRef = ref}/>
...
);
}
Cada solución (método del ciclo de vida del componente) es adecuada para una situación concreta, pero la manipulación del DOM es incorrecta. Utilice el estado y vuelva a renderizar el componente. Ejemplo de mi último caso de uso "encabezado fijo para la tabla + desplazamiento virtual para el cuerpo de la tabla", espero que esto le ayude a comprender el flujo correcto.
@jvorcak usando componentDidUpdate
es el lugar correcto para manipular el DOM manualmente después de un render. Según los documentos:
Utilice esto como una oportunidad para operar en el DOM cuando el componente se haya actualizado.
Además, intentamos utilizar el rastreador de problemas únicamente para solicitudes de funciones e informes de errores. Las preguntas de uso deben dirigirse a otra parte, como discus.reactjs.org o StackOverflow. ¡Gracias!
¿Qué sucede si desea actualizar un componente después de cambiar algo en otro?
Comentario más útil
@jvorcak usando
componentDidUpdate
es el lugar correcto para manipular el DOM manualmente después de un render. Según los documentos:Además, intentamos utilizar el rastreador de problemas únicamente para solicitudes de funciones e informes de errores. Las preguntas de uso deben dirigirse a otra parte, como discus.reactjs.org o StackOverflow. ¡Gracias!