¿Cómo puedo obtener la altura de un elemento después de que React renderice ese elemento?
HTML
<div id="container">
<!-- This element's contents will be replaced with your component. -->
<p>
jnknwqkjnkj<br>
jhiwhiw (this is 36px height)
</p>
</div>
ReactJS
var DivSize = React.createClass({
render: function() {
let elHeight = document.getElementById('container').clientHeight
return <div className="test">Size: <b>{elHeight}px</b> but it should be 18px after the render</div>;
}
});
ReactDOM.render(
<DivSize />,
document.getElementById('container')
);
RESULTADO
Size: 36px but it should be 18px after the render
Está calculando la altura del contenedor antes del render (36px). Quiero obtener la altura después del render. El resultado correcto debería ser 18px en este caso. jsfiddle
javascript
reactjs
faia20
fuente
fuente
setState
para asignar el valor de altura a una variable de estado.Respuestas:
Ver este violín (en realidad actualizó el suyo)
Debe conectarse al
componentDidMount
que se ejecuta después del método de renderizado. Allí, obtienes la altura real del elemento.fuente
A continuación se muestra un ejemplo de ES6 actualizado utilizando una ref .
Recuerde que tenemos que usar un componente de la clase React ya que necesitamos acceder al método Lifecycle
componentDidMount()
porque solo podemos determinar la altura de un elemento después de que se representa en el DOM.Puede encontrar el ejemplo de ejecución aquí: https://codepen.io/bassgang/pen/povzjKw
fuente
<div ref={ divElement => this.divElement = divElement}>{children}</div>
lanza "[eslint] La función de flecha no debería devolver la asignación. (No-return-assign)" ythis.setState({ height });
lanza "[eslint] No use setState en componentDidMount (react / no- did-mount-set-state) ". ¿Alguien tiene una solución compatible con la guía de estilo?ref={ divElement => {this.divElement = divElement}}
componentDidUpdate
.Para aquellos que estén interesados en usar
react hooks
, esto podría ayudarlos a comenzar.fuente
useLayoutEffect
lugar deuseEffect
? Los documentos parecen indicar que deberíamos. Vea la sección "sugerencia" aquí: reactjs.org/docs/hooks-effect.html#detailed-explanation (2) Para estos casos en los que solo necesitamos una referencia a un elemento hijo, ¿deberíamos usar enuseRef
lugar decreateRef
? Los documentos parecen indicar queuseRef
es más apropiado para este caso de uso. Ver: reactjs.org/docs/hooks-reference.html#userefuseLayoutEffect
después de leer los otros comentarios aquí. Parece funcionar bien. :)useEffect(() => setDimensions({width: popup.current.clientWidth, height: popup.current.clientHeight}))
, y mi IDE (WebStorm) me sugirió esto: ESLint: React Hook useEffect contiene una llamada a 'setDimensions'. Sin una lista de dependencias, esto puede conducir a una cadena infinita de actualizaciones. Para solucionar este problema, pase [] como segundo argumento al gancho useEffect. (react-hooks / exhaustive-deps) , así que pase[]
como segundo argumento a suuseEffect
También querrá usar referencias en el elemento en lugar de usar
document.getElementById
, es algo un poco más robusto.fuente
angularJs
yreact
mientras migra de uno a otro? Hay casos en los que realmente se necesita una manipulación DOM directaLa respuesta de mi 2020 (o 2019)
Use su imaginación para lo que falta aquí (WidgetHead),
reactstrap
es algo que puede encontrar en npm: reemplaceinnerRef
conref
para un elemento dom heredado (por ejemplo, a<div>
).useEffect o useLayoutEffect
Se dice que el último es sincrónico para los cambios.
useLayoutEffect
(ouseEffect
) segundo argumentoEl segundo argumento es una matriz y se verifica antes de ejecutar la función en el primer argumento.
solía
porque yo mismo.currente es nulo antes de renderizar, y es bueno no verificarlo, el segundo parámetro al final
myself.current.clientHeight
es lo que quiero verificar para ver si hay cambios.lo que estoy resolviendo aquí (o tratando de resolver)
Estoy resolviendo aquí el problema del widget en una cuadrícula que cambia su altura por su propia voluntad, y el sistema de cuadrícula debe ser lo suficientemente elástico para reaccionar ( https://github.com/STRML/react-grid-layout ).
fuente
useLayoutEffect
un div real para vincular la referencia.Utilizando con ganchos:
Esta respuesta sería útil si su dimensión de contenido cambia después de la carga.
onreadystatechange : ocurre cuando cambia el estado de carga de los datos que pertenecen a un elemento o documento HTML. El evento onreadystatechange se activa en un documento HTML cuando el estado de carga del contenido de la página ha cambiado.
Estaba tratando de trabajar con una inserción de reproductor de video de YouTube cuyas dimensiones pueden cambiar después de la carga.
fuente
Encontré un paquete npm útil https://www.npmjs.com/package/element-resize-detector
Un oyente de cambio de tamaño de navegador optimizado para elementos.
Puede usarlo con el componente React o el componente funcional (especialmente útil para react hooks)
fuente
Aquí hay otro si necesita un evento de cambio de tamaño de ventana:
bolígrafo de código
fuente
Una solución alternativa, en caso de que desee recuperar el tamaño de un elemento React de forma síncrona sin tener que representar visiblemente el elemento, puede usar ReactDOMServer y DOMParser .
Utilizo esta función para obtener la altura de un renderizador de elementos de mi lista cuando utilizo react-window ( react-virtualized ) en lugar de tener que codificar el
itemSize
accesorio requerido para FixedSizeList .utilities.js:
fuente