Como posso obter a altura de um elemento depois que o React renderiza esse 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
Ele está calculando a altura do contêiner antes da renderização (36px). Quero obter a altura após a renderização. O resultado certo deve ser 18 px neste caso. jsfiddle
javascript
reactjs
faia20
fonte
fonte
setState
para atribuir o valor da altura a uma variável de estado.Respostas:
Veja este violino (na verdade atualizou o seu)
Você precisa ligar para
componentDidMount
qual é executado após o método de renderização. Lá, você obtém a altura real do elemento.fonte
A seguir está um exemplo ES6 atualizado usando uma ref .
Lembre-se de que temos que usar um componente da classe React, pois precisamos acessar o método Lifecycle
componentDidMount()
porque só podemos determinar a altura de um elemento depois que ele é renderizado no DOM.Você pode encontrar o exemplo de execução aqui: https://codepen.io/bassgang/pen/povzjKw
fonte
<div ref={ divElement => this.divElement = divElement}>{children}</div>
lança "[eslint] A função de seta não deve retornar atribuição. (No-return-assign)" ethis.setState({ height });
lança "[eslint] Não use setState em componentDidMount (react / no- did-mount-set-state) ". Alguém tem uma solução compatível com o guia de estilo?ref={ divElement => {this.divElement = divElement}}
componentDidUpdate
também.Para aqueles que estão interessados em usar
react hooks
, isso pode ajudá-lo a começar.fonte
useLayoutEffect
vez deuseEffect
? Os documentos parecem indicar que devemos. Veja a seção "dica" aqui: reactjs.org/docs/hooks-effect.html#detailed-explanation (2) Para esses casos em que precisamos apenas de uma referência a um elemento filho, devemos usar emuseRef
vez decreateRef
? Os documentos parecem indicar queuseRef
é mais apropriado para esse caso de uso. Veja: reactjs.org/docs/hooks-reference.html#userefuseLayoutEffect
depois de ler os outros comentários aqui. Parece funcionar bem. :)useEffect(() => setDimensions({width: popup.current.clientWidth, height: popup.current.clientHeight}))
e meu IDE (WebStorm) me sugeriu o seguinte: ESLint: React Hook useEffect contém uma chamada para 'setDimensions'. Sem uma lista de dependências, isso pode levar a uma cadeia infinita de atualizações. Para corrigir isso, passe [] como um segundo argumento para o gancho useEffect. (react-hooks / exaustive-deps) , então passe[]
como segundo argumento para seuuseEffect
Você também gostaria de usar refs no elemento em vez de usar
document.getElementById
, é apenas uma coisa um pouco mais robusta.fonte
angularJs
ereact
ao migrar de um para o outro? Há casos em que uma manipulação direta de DOM é realmente necessáriaMinha resposta de 2020 (ou 2019)
deixe usar sua imaginação para ver o que está faltando aqui (WidgetHead),
reactstrap
é algo que você pode encontrar no npm: substituainnerRef
porref
por um elemento dom legado (digamos a<div>
).useEffect ou useLayoutEffect
O último é considerado síncrono para mudanças
useLayoutEffect
(ouuseEffect
) segundo argumentoO segundo argumento é uma matriz e é verificado antes de executar a função no primeiro argumento.
eu usei
porque eu.atual é nulo antes da renderização, e isso é uma boa coisa para não verificar, o segundo parâmetro no final
myself.current.clientHeight
é o que eu quero verificar se há alterações.o que estou resolvendo aqui (ou tentando resolver)
Estou resolvendo aqui o problema do widget em uma grade que muda sua altura por vontade própria, e o sistema de grade deve ser elástico o suficiente para reagir ( https://github.com/STRML/react-grid-layout ).
fonte
useLayoutEffect
uma div real para amarrar o árbitro.Usando com ganchos:
Essa resposta seria útil se sua dimensão de conteúdo fosse alterada após o carregamento.
onreadystatechange : ocorre quando o estado de carregamento dos dados pertencentes a um elemento ou documento HTML é alterado. O evento onreadystatechange é disparado em um documento HTML quando o estado de carregamento do conteúdo da página muda.
Eu estava tentando trabalhar com a incorporação de um player de vídeo do YouTube cujas dimensões podem mudar após o carregamento.
fonte
Achei o pacote npm https://www.npmjs.com/package/element-resize-detector útil
Um ouvinte de redimensionamento otimizado entre navegadores para elementos.
Pode usá-lo com o componente React ou componente funcional (especialmente útil para ganchos react)
fonte
Aqui está outro caso você precise de um evento de redimensionamento de janela:
caneta de código
fonte
Uma solução alternativa, caso você queira recuperar o tamanho de um elemento React de forma síncrona, sem ter que renderizar visivelmente o elemento, você pode usar ReactDOMServer e DOMParser .
Eu uso essa função para obter a altura de um a minha lista de itens de representante quando usando reagir janela ( reagem-virtualizado ), em vez de ter de codificar o necessário
itemSize
suporte para uma FixedSizeList .utilities.js:
fonte