私は、これまでプライベートでしか React を使っていませんでした。 最近、業務で React を使う機会が増えたので、学んだことを残そうと思います。
なんで React って生まれたんだろうって気になりました。 簡単ですが、ちょこっとだけ調べて、次の記事にまとめました。
React は、次の問題を解決したかったんだと思います。
そこで、React は、この問題を解決するために、仮想 DOM という仕組みを作ったんだと思います。
React は、直接 DOM を操作するのではなく、仮想 DOM に対して操作します。仮想 DOM は、名前の通り仮想的な DOM です。 仮想 DOM を DOM へ反映するために、差分検出処理(reconciliation)というアルゴリズムがあったり、Fiber と呼ばれる、レンダリングの最適化(優先順位)を目的としたアルゴリズムもあるようです。これらのおかげで、レンダリング負荷が軽減されるんだと思います。(しらんけど)
まだまだ理解が浅いので、これからもっと学んでいきたいと思います。
レンダリングのタイミングは、いつなんでしょうか。
基本的に、React は、親コンポーネントをレンダリングすると、子コンポーネントもレンダリングされます。
再レンダリングをキューイングする関数、setState や forUpdate などを呼ぶと、コンポーネントはレンダリングされることになります。
コードベースが大きくなるにつれて、レンダリングのパフォーマンスが悪化していきます。 そこで、パフォーマンスの最適化が求められます。
最初からパフォーマンス最適化をする必要はありませんが、要件によっては必要になることもあります。 最適化の手段として、React にある、次の 3 つの関数が使えます。
パフォーマンス最適化 – Reactも参考になります。
React では、コンポーネントや状態が変更されたかどうかの判定に、Object.is() を使っているようです。 Object.is のサンプルコードは、次のとおりです。
Object.is("foo", "foo"); // true
Object.is("foo", "bar"); // false
Object.is([], []); // false
var foo = { a: 1 };
var bar = { a: 1 };
Object.is(foo, foo); // true
Object.is(foo, bar); // falsestring や integer のようなプリミティブな値は良いのですが、非プリミティブな値(Object)の場合の考慮が必要です。 例えば、memoの場合は、第二引数に比較関数を渡すことができます。 例えば、次のような感じです。
function MyComponent(props) {}
function areEqual(prevProps, nextProps) {
return JSON.stringify(prevProps.foo) === JSON.stringify(nextProps.foo);
}
export default React.memo(MyComponent, areEqual);公式ページにも書いていますが、パフォーマンス最適化のみに使いましょう。
Object.is() を使われている影響で、非プリミティブな値の状態更新に、工夫が必要です。
const [items, setItems] = useState(["a", "b"]);
// NG
items.push("c");
setItems(items); // 変更されない(Object.is()→true)
// OK
const newItems = [...items, "c"];
setItems(newItems); // 変更される(Object.is()→false)NG の方は、同じオブジェクトを使いまわしているのに対し、OK の方は、新しくオブジェクトを生成しています。
トップダウンでパフォーマンス調査をするのが、ベターと思います。
React でコンポーネントを実装していると、次の 3 つのパターンがあるようです。
テスタビリティや再利用性の観点より、ロジックを hooks として切り出すのが良さそうです。
命名は、use から始まることが多いです。
-
0
読み込み中...
タグ「フロントエンド」の記事
AI にコードを書かせた後、余計なコードを見つけて消す作業があります。 不毛なことなので、それらの作業を減らすためのお作法を紹介します。 未使用コードを消す 以下でも書きましたが、未使用コードの検査に knip を使うことが多いです。 ht
最近、iframeを使っています。 クライアントサイドで埋め込む想定で、iframeを使おうとしています。 色々と苦労したことがあったので、書いて残しておこうと思います。 レスポンスヘッダー 前提として、ウェブアプリケーションをプロダクショ
紙を積んだイラストをSVGで書こうとしていました。 (当たり前ですが)図形を表現するためには数学の知識が必要で、学生の頃の記憶を思い出したので疲れました。 所感について、諸々書こうと思います。 成果物 実際に完成したのは、以下の画像ができま
2026年02月17日