はじめに
この記事では、 CSS in JS を開発している人にしか関係ない、React18の新機能 useInsertionEffect
について解説します。
useInsertionEffect
とは?
useInsertionEffect
は、DOMが変更される前に実行される useEffect
みたいなものです。
注意点
useInsertionEffect
は、CSS in JSライブラリー開発者のためのHooksです。
CSS in JSのスタイルを反映させる場所で使うことを想定されているため、他の場所ではuseEffect
やuseLayoutEffect
を使いましょう!
使い方
以下の例は、DOMの変更の前にスタイルを挿入するために呼び出ししている例です。
// CSS-in-JS library
import { useInsertionEffect } from 'react';
function useCSS(rule) {
useInsertionEffect(() => {
// <style>...</style>を挿入する
});
return rule;
}
useLayoutEffet
より先に実行してくれるのがいい。
レンダリングの処理は以下のようになっており、useInsertionEffect
は、useLayoutEffet
が実行される前に実行されます。
useLayoutEffet
は、画面の描画する前に実行するため、useEffect
のちらつきを解決してくれくれる便利なHooksです。
useLayoutEffect
の処理と同じタイミングで、CSS in JSのスタイル挿入をしてしまうと、変更前のスタイルで、useLayoutEffect
の処理が行われ、useLayoutEffect
で意図した通りに処理が行われません。
そのため、更新されたスタイルで、useLayoutEffect
を実行させるためにも、useInsertionEffect
を使ってスタイルを挿入してあげるのが良いのです。
sample
sampleでは、ボタンを押すと、ボタンの背景色が変わり、その背景色を取得しています。
その後、取得した値をボタンの文字に反映させています。
理想
こちらのsampleは理想的な状態です。
sampleの中のAdjacentStyle()
では、背景色を変更し、変更したスタイルを、<style>
に挿入しています。
また、getBgColor()
では、背景色を取得して、テクスト変更させています。
そして、isRed
の値が変わったタイミングでuseInsertionEffect
とuseLayoutEffect
を実行しているというサンプルです。
useLayoutEffect
で処理した場合
CSS in JSのスタイルの挿入とuseLayoutEffect
の処理が同じタイミングになるとこうなります。
getBgColor()
が実行されるときは、まだ、スタイルが挿入されていない状態なので、
ボタンのテキストには、挿入前のbackground-color
の値が入ります。
その後、スタイルが挿入されることになるので、ボタンのbackground-color
は変わります。
そのため、#0000ff
のbackground-colorなのにrgb(255,0,0)
が表示され、
#ff0000
のbackground-colorなのにrgb(0,0,255)
が表示されるみたいな状態になります。
まとめ
この記事では、 CSS in JS を開発している人にしか関係ない、React18の新機能 useInsertionEffect
について解説しました。
useInsertionEffect
は、使い方は、ほぼuseEffet
やuseLayoutEffect
と同じですが、
CSS in JSを開発している人向けの機能のため、useLayoutEffect
より実行タイミングが早いという特徴があります。
業務ではほぼ使うことはないと思いますが、気が変わってCSS in JS開発することになったらこの記事を見返そうと思います。
最後まで読んでくださってありがとうございます!
普段はデザインやフロントエンドを中心にQiitaに記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。