1
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.

【React】レンダリングの仕組み・ライフサイクル関数(Render Phase → Commit Phase)

Last updated at Posted at 2022-04-05

まえがき

Reactのレンダリングは2つのフェーズがあることを最近知ったので、そのまとめ記事。
下記の記事が分かりやすかった。

image.png

レンダリングの流れ

・state, propsが変更される。
 ↓
 ↓(変更されたので画面を作り直す)
 ↓
・propsに変更があった画面のrender()を実行=変更の仮想DOMを生成する。
 ↓
・変更の仮想DOMと変更の仮想DOMを比較し、実DOMに反映すべき箇所を特定
 ↓
・実DOMに反映する

↑のレンダリングは2段階に分かれる

・state, propsが変更される。
 ↓
 ↓(変更されたので画面を作り直す)
 ↓
・propsに変更があった画面のrender()を実行=変更の仮想DOMを生成する。【render phase
 ↓
・変更の仮想DOMと変更の仮想DOMを比較し、実DOMに反映すべき箇所を特定
 ↓
・実DOMに反映する【commit phase

render phase

・変更のDOMを生成するために各画面のrender()を実行するフェーズ。
・下記のライフサイクル関数が実行される。
・レンダリングするために複数回実行されうるもの。
 → 故に↓のライフサイクル関数内には、複数回実行されても大丈夫な処理副作用でない処理)を定義する。

componentWillMount
componentWillReceiveProps
componentWillUpdate
getDerivedStateFromProps
shouldComponentUpdate

commit phase

・実DOMを変更するフェーズ。
・下記のライフ関数が実行される。
・実DOMへの変更は1回で行うので、下記のライフサイクル関数は1回だけ実行される
 → 副作用の処理DOMの書き換え、変数代入、API通信などUI構築以外の処理)はここに書け👍
副作用=状態を変更する処理

componentDidMount
componentDidUpdate
componentWillUnmount
componentDidCatch

関数コンポーネントで使うuseEffect関数はどのライフサイクル関数に紐づく?

・commit phaseの以下3つに紐づく。

componentDidMount(useEffect)
componentDidUpdate(useEffect)
componentWillUnmount(useEffect)
componentDidCatch

まとめ

・レンダリング(Rendering Phase)中に、副作用とされる処理(状態を変えるもの)は呼び出してはいけない。
 → レンダリングは何回呼びだされても同じものを返す処理であるべきだから。
  副作用の代表例であるAPIなんかは、渡すパラメータによっては結果が変わるようなもの。

・結局Effectとは?
 → レンダリング時に呼び出される副作用の処理を定義できるもの。

Effects let you specify side effects that are caused by rendering itself, rather than by a particular event. 引用元

その他

React.memo

1
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
1
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?