Comment puis-je obtenir la hauteur d'un élément après que React a rendu cet élément?
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')
);
RÉSULTAT
Size: 36px but it should be 18px after the render
Il calcule la hauteur du conteneur avant le rendu (36px). Je veux obtenir la hauteur après le rendu. Le bon résultat devrait être 18px dans ce cas. jsfiddle
javascript
reactjs
faia20
la source
la source
setState
pour affecter la valeur de hauteur à une variable d'état.Réponses:
Voir ce violon (en fait mis à jour le vôtre)
Vous devez vous connecter à
componentDidMount
laquelle est exécutée après la méthode de rendu. Là, vous obtenez la hauteur réelle de l'élément.la source
Voici un exemple ES6 à jour utilisant une réf .
N'oubliez pas que nous devons utiliser un composant de classe React car nous devons accéder à la méthode Lifecycle
componentDidMount()
car nous ne pouvons déterminer la hauteur d'un élément qu'après son rendu dans le DOM.Vous pouvez trouver l'exemple en cours ici: https://codepen.io/bassgang/pen/povzjKw
la source
<div ref={ divElement => this.divElement = divElement}>{children}</div>
jette "[eslint] La fonction Arrow ne doit pas retourner d'affectation. (No-return-assign)" etthis.setState({ height });
lance "[eslint] Ne pas utiliser setState dans componentDidMount (react / no- did-mount-set-state) ". Quelqu'un a-t-il une solution compatible avec Styleguide?ref={ divElement => {this.divElement = divElement}}
componentDidUpdate
.Pour ceux qui sont intéressés à utiliser
react hooks
, cela pourrait vous aider à démarrer.la source
useLayoutEffect
place deuseEffect
? Les documents semblent indiquer que nous devrions. Voir la section "astuce" ici: reactjs.org/docs/hooks-effect.html#detailed-explanation (2) Pour ces cas où nous avons juste besoin d'une référence à un élément enfant, devrions-nous utiliser à lauseRef
place decreateRef
? La documentation semble indiquer que leuseRef
est plus approprié pour ce cas d'utilisation. Voir: reactjs.org/docs/hooks-reference.html#userefuseLayoutEffect
après avoir lu les autres commentaires ici. Semble bien fonctionner. :)useEffect(() => setDimensions({width: popup.current.clientWidth, height: popup.current.clientHeight}))
, et mon IDE (WebStorm) m'a suggéré ceci: ESLint: React Hook useEffect contient un appel à 'setDimensions'. Sans une liste de dépendances, cela peut conduire à une chaîne infinie de mises à jour. Pour résoudre ce problème, passez [] comme deuxième argument au hook useEffect. (react-hooks / exhaust-deps) , alors passez[]
comme deuxième argument à votreuseEffect
Vous voudrez également utiliser des références sur l'élément au lieu d'utiliser
document.getElementById
, c'est juste une chose légèrement plus robuste.la source
angularJs
etreact
en migrant de l'un à l'autre? Il y a des cas où une manipulation directe du DOM est vraiment nécessaireMa réponse de 2020 (ou 2019)
laissez utiliser votre imagination pour ce qui manque ici (WidgetHead),
reactstrap
est quelque chose que vous pouvez trouver sur npm: remplacezinnerRef
parref
un élément dom hérité (disons a<div>
).useEffect ou useLayoutEffect
Le dernier est dit synchrone pour les changements
useLayoutEffect
(ouuseEffect
) deuxième argumentLe deuxième argument est un tableau et il est vérifié avant d'exécuter la fonction dans le premier argument.
j'ai utilisé
car moi-même.current est nul avant le rendu, et c'est une bonne chose de ne pas vérifier, le deuxième paramètre à la fin
myself.current.clientHeight
est ce que je veux vérifier pour les changements.ce que je résous ici (ou essaie de résoudre)
Je résous ici le problème du widget sur une grille qui change sa hauteur de sa propre volonté, et le système de grille doit être suffisamment élastique pour réagir ( https://github.com/STRML/react-grid-layout ).
la source
useLayoutEffect
un div réel auquel lier l'arbitre.Utilisation avec des crochets:
Cette réponse serait utile si votre dimension de contenu change après le chargement.
onreadystatechange : se produit lorsque l'état de chargement des données appartenant à un élément ou à un document HTML change. L'événement onreadystatechange est déclenché sur un document HTML lorsque l'état de chargement du contenu de la page a changé.
J'essayais de travailler avec un lecteur vidéo YouTube intégré dont les dimensions peuvent changer après le chargement.
la source
Au lieu d'utiliser
document.getElementById(...)
, une meilleure solution (à jour) consiste à utiliser le hook React useRef qui stocke une référence au composant / élément, combiné avec un hook useEffect , qui se déclenche aux rendus de composant.la source
J'ai trouvé le package npm utile https://www.npmjs.com/package/element-resize-detector
Un écouteur optimisé pour redimensionner les éléments dans plusieurs navigateurs.
Peut l'utiliser avec un composant React ou un composant fonctionnel (particulièrement utile pour les hooks de réaction)
la source
En voici un autre si vous avez besoin d'un événement de redimensionnement de la fenêtre:
code stylo
la source
Une solution alternative, au cas où vous voudriez récupérer la taille d'un élément React de manière synchrone sans avoir à rendre visiblement l'élément, vous pouvez utiliser ReactDOMServer et DOMParser .
J'utilise cette fonction pour obtenir la hauteur d'un rendu d'élément de ma liste lors de l'utilisation de react-window ( react-virtualized ) au lieu d'avoir à coder en dur l'
itemSize
accessoire requis pour un FixedSizeList .utilities.js:
la source