4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

変化するelementのサイズを取得するためのResizeObserver

Posted at

はじめに

サイズが決まっていない<div>要素を検知するための方法を調べていくうちにResizeObserverというAPIを知ったので簡単にまとめます。

便利だと思ったケース

例えば<Component />の高さ(height)が可変だった場合に、その値変数で持っておきたい(さらに値の変化をリアルタイムで監視したい)場合に以下のように書けます。

const Container = () => {
    const ref = useRef(null)
    const [height, setHeight] = useState()
    React.useEffect(() => {
        const elem = ref.current
        const observer = new ResizeObserver(() => {
             setHeight(elem.offsetHeight)
        })
    
        if (elem) {
             observer.observe(elem)
        }
    
        return () => {
            if (elem) {
                observer.unobserve(elem)
            }
        }
    }, []);
    return (
        <div>
            <Component ref={ref} />
        </div>
    )
}

ざっくり説明

  1. useRefComponentを参照
  2. ResizeObserver.observeComponentのサイズ変化を検知
  3. useStateheightを保持させて、変更があった場合は再レンダリングする(useRefは値の変化があっても再レンダリングされない)

さいごに

最初にuseStateの引数配列の中にref.current.offsetHeightを入れて実装していたのですが、うまくいかなかったので調べていくうちにこの方法に辿り着きました。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?