Explicação 🧐
O código define um hook personalizado chamado useIframeHeight, que ajusta dinamicamente a altura de um iframe com base no conteúdo carregado dentro dele. Esse ajuste é feito assim que o conteúdo do iframe estiver completamente carregado.
Detalhamento do Código 🔍
- Importação do
useEffect🔄
import { useEffect } from 'react'useEffecté importado do React. Esse hook é usado para executar efeitos colaterais, como manipulações de DOM, após a renderização do componente. No caso, ele será utilizado para adicionar e remover event listeners noiframe.
- Definição do Hook
useIframeHeight🪝
export const useIframeHeight = () => {
return (iframe: HTMLIFrameElement | null) => {- O hook
useIframeHeighté uma função que retorna outra função. O argumento dessa função é umiframe(do tipoHTMLIFrameElementounull), que será manipulado para ajustar sua altura.
- Função de Ajuste da Altura do
iframe🔧
if (!iframe) return
const adjustHeight = () => {
if (iframe && iframe.contentWindow) {
try {
const document = iframe.contentWindow.document
const height = document.body.scrollHeight
iframe.style.height = `${height}px`
} catch (err) {
console.warn('Não foi possível acessar o conteúdo do iframe.')
}
}
}adjustHeight: Função que ajusta a altura doiframepara o valor doscrollHeightdo conteúdo interno doiframe.- Verificação do
iframe: Se oiframefornull, a função retorna sem fazer nada. iframe.contentWindow: Verifica se oiframepossui umcontentWindow, o que indica que é possível acessar o conteúdo dentro dele.document.body.scrollHeight: Obtém a altura total do conteúdo doiframe, considerando o conteúdo carregado.iframe.style.height: Ajusta a altura doiframecom o valor obtido descrollHeight.
- Verificação do
Se ocorrer algum erro (por exemplo, se o conteúdo do iframe não for acessível), o código captura a exceção e exibe um aviso no console.
- Adicionando o Event Listener para o
load🎧
iframe.addEventListener('load', adjustHeight)- O
iframe.addEventListenerescuta o eventoloadnoiframe, que é disparado quando o conteúdo dentro doiframeé completamente carregado. - Quando o evento
loadé disparado, a funçãoadjustHeighté chamada, ajustando a altura doiframe.
- Removendo o Event Listener ao Desmontar ⬇️
return () => iframe.removeEventListener('load', adjustHeight)
}
}- A função retornada pelo hook
useIframeHeighté uma função de limpeza, que remove o event listenerloaddoiframequando o componente que usa esse hook for desmontado. Isso evita problemas de memória e vazamentos de eventos.
Código Completo 👨💻
import { useEffect } from 'react'
export const useIframeHeight = () => {
return (iframe: HTMLIFrameElement | null) => {
if (!iframe) return
const adjustHeight = () => {
if (iframe && iframe.contentWindow) {
try {
const document = iframe.contentWindow.document
const height = document.body.scrollHeight
iframe.style.height = `${height}px`
} catch (err) {
console.warn('Não foi possível acessar o conteúdo do iframe.')
}
}
}
iframe.addEventListener('load', adjustHeight)
return () => iframe.removeEventListener('load', adjustHeight)
}
}