javascript - ReactJS - Få høyden på et element


Hvordan kan jeg få høyden på et element etter at React har rendret det elementet?

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')
);

RESULTAT

Size: 36px but it should be 18px after the render

Den beregner beholderens høyde før gjengivelsen (36px). Jeg vil få høyden etter gjengivelsen. Det riktige resultatet skal være 18px i dette tilfellet. jsfiddle

Svar #1

For de som er interessert i å bruke react hooks, kan dette hjelpe deg med å komme i gang.

import React, { useState, useEffect, useRef } from 'react'

export default () => {
  const [height, setHeight] = useState(0)
  const ref = useRef(null)

  useEffect(() => {
    setHeight(ref.current.clientHeight)
  })

  return (
    <div ref={ref}>
      {height}
    </div>
  )
}

Svar #2

Følgende er et oppdatert ES6-eksempel som bruker en ref.

Husk at vi må bruke en React-klassekomponent siden vi trenger å få tilgang til livssyklusmetoden componentDidMount() fordi vi kun kan bestemme høyden på et element etter at det er rendret i DOM-en.

import React, {Component} from 'react'
import {render} from 'react-dom'

class DivSize extends Component {

  constructor(props) {
    super(props)

    this.state = {
      height: 0
    }
  }

  componentDidMount() {
    const height = this.divElement.clientHeight;
    this.setState({ height });
  }

  render() {
    return (
      <div 
        className="test"
        ref={ (divElement) => { this.divElement = divElement } }
      >
        Size: <b>{this.state.height}px</b> but it should be 18px after the render
      </div>
    )
  }
}

render(<DivSize />, document.querySelector('#container'))

Du kan finne det kjørende eksemplet her: https://codepen.io/bassgang/pen/povzjKw

Svar #3

Se på denne fiolinen (faktisk oppdatert din)

Du må koble til componentDidMount som kjøres etter render-metoden. Der får du den faktiske høyden på elementet.

var DivSize = React.createClass({
    getInitialState() {
    return { state: 0 };
  },

  componentDidMount() {
    const height = document.getElementById('container').clientHeight;
    this.setState({ height });
  },

  render: function() {
    return (
        <div className="test">
        Size: <b>{this.state.height}px</b> but it should be 18px after the render
      </div>
    );
  }
});

ReactDOM.render(
  <DivSize />,
  document.getElementById('container')
);
<script src="https://facebook.github.io/react/js/jsfiddle-integration-babel.js"></script>

<div id="container">
<p>
jnknwqkjnkj<br>
jhiwhiw (this is 36px height)
</p>
    <!-- This element's contents will be replaced with your component. -->
</div>

Svar #4

I stedet for å bruke document.getElementById(...), er en bedre (oppdatert) løsning å bruke React useRef-hooken som lagrer en referanse til komponenten/elementet, kombinert med en useEffect-hook, som utløses ved komponentrendringer.

import React, {useState, useEffect, useRef} from 'react';

export default App = () => {
  const [height, setHeight] = useState(0);
  const elementRef = useRef(null);

  useEffect(() => {
    setHeight(elementRef.current.clientHeight);
  }, []); //empty dependency array so it only runs once at render

  return (
    <div ref={elementRef}>
      {height}
    </div>
  )
}

Svar #5

det kan vise null. setTimeout hjelper med å få riktig verdi og oppdatere tilstanden.

import React, { useState, useEffect, useRef } from 'react'
    
    export default () => {
      const [height, setHeight] = useState(0)
      const ref= useRef(null)
    
      useEffect(() => {
       if(ref.current.clientHeight){
         setTimeout(() => {
           setHeight(ref.current.clientHeight) 
         }, 1000)
       }
      })
    
      return (
        <div ref={ref}>
          {height}
        </div>
      )
    }

Svar #6

Du vil også bruke refs på elementet i stedet for å bruke document.getElementById, det er bare en litt mer robust ting.

Relaterte artikler