2023/2/28開催Shinjuku.ts#2LT資料
React hooksを気合で理解する宮本唯フォルシア株式会社エンジニア
View Slide
自己紹介● 宮本 唯● ソフトウェアエンジニア@フォルシア株式会社○ 旅行会社検索アプリの運用保守・開発● 活動領域○ webアプリケーション開発 (TypeScript, React, Redux)○ バックエンド開発(PostgreSQL)○ 技術広報○ 飲み会のにぎやかし要員2
免責このLTはゆるふわ系です。3理由 : 宮本はTypeScriptやReactを雰囲気でしか理解しておらずガチのLTはできないので。LTの真の目的 : こんなんでもいいのかとみんなに思ってもらってLTのハードルを下げる。(とくに掲載しているソースコードはサクッと書いたものなので間違えている可能性大です…)
もくじ1. React完全に理解した2. Reactなにもわからない3. React Hooksを気合で理解する~クラスコンポーネントと関数コンポーネント~4. React Hooksを気合で理解する~useState と useEffect5. まとめと教訓4
第1章 React完全に理解した5
Reactとは?6• webアプリケーションのフロントエンドを開発するためのJavaScriptライブラリ• フォルシアでは TypeScript + React で検索アプリを開発している(全部ではない)※shinjuku.ts「フォルシアのフレームワークとTypeScript」より
Reactとは?7• webアプリケーションのフロントエンドを開発するためのJavaScriptライブラリ• フォルシアでは TypeScript + React で検索アプリを開発している(全部ではない)※shinjuku.ts「フォルシアのフレームワークとTypeScript」よりここでReactも導入
Reactを使う理由(1)8• Reactでは長大なHTMLを コンポネント に分割することで、簡潔さや高い保守性を実現できる… 本質的には JSX(Javascript XML), TSX(Typescript XML) の利用HTMLを書きやすくするマクロみたいなものか…ひよっ子エンジニア ・ 宮本イメージ
Reactを使う理由(1)9• Reactでは長大なHTMLを コンポネント に分割することで、簡潔さや高い保守性を実現できる… 本質的には JSX(Javascript XML), TSX(Typescript XML) の利用HTMLを書きやすくするマクロみたいなものか…ひよっ子エンジニア ・ 宮本イメージ完全に理解
第2章 Reactなにもわからない10
11• Webページでは、(同じURLでも)ブラウザ上の画面に動きを出すことができる• javaScriptによってHTMLを変化させることで実現Reactを使う理由(2)
12• Webページでは、(同じURLでも)ブラウザ上の画面に動きを出すことができる• javaScriptによってHTMLを変化させることで実現Reactを使う理由(2)• Reactを使ってもHTMLの変化を実現させることができる• jQueryと異なり、変化させる処理を陽に記述しなくて良いので、思わぬバグを防げる
13• Webページでは、(同じURLでも)ブラウザ上の画面に動きを出すことができる• javaScriptによってHTMLを変化させることで実現Reactを使う理由(2)• Reactを使ってもHTMLの変化を実現させることができる• jQueryと異なり、変化させる処理を陽に記述しなくて良いので、思わぬバグを防げる
14• Webページでは、(同じURLでも)ブラウザ上の画面に動きを出すことができる• javaScriptによってHTMLを変化させることで実現Reactを使う理由(2)• Reactを使ってもHTMLの変化を実現させることができる• jQueryと異なり、変化させる処理を陽に記述しなくて良いので、思わぬバグを防げるReact Hooksである!!
第3章 React hooksを気合で理解する~クラスコンポーネントと関数コンポーネント~15
とりあえずReact hooksについて調べてみた16要するにフックとは?フックとは、関数コンポーネントに state やライフサイクルといった React の機能を “接続する (hook into)” ための関数です。フックは React をクラスなしに使うための機能ですので、クラス内では機能しません。React公式ドキュメント(https://ja.reactjs.org/docs/hooks-overview.html)より抜粋ここでmiyamotoは衝撃の事実に気づく…
とりあえずReact hooksについて調べてみた17要するにフックとは?フックとは、関数コンポーネントに state やライフサイクルといった React の機能を “接続する (hook into)” ための関数です。フックは React をクラスなしに使うための機能ですので、クラス内では機能しません。React公式ドキュメント(https://ja.reactjs.org/docs/hooks-overview.html)より抜粋ここでmiyamotoは衝撃の事実に気づく…Reactのコンポーネントにはクラスコンポーネントと関数コンポーネントがあるのだ!!
Reactのクラスコンポーネント18• Javascriptのクラスの機能を利用して実装されたReactのフレームワーク主な用語(お気持ち)props … 親から与えられたコンポーネントの状態state … 自分が内部に持っているコンポーネントの状態render … HTMLを生成しDOMに書き出すプロセスpropsまたはstateが更新されるとrenderが(何度でも)実行され画面が変化される。
Reactの関数コンポーネント19• Javascriptの関数の機能を利用して実装されたReactのフレームワーク19• クラスよりも実装がシンプルで再利用しやすく、保守性が高い• ただし、クラスコンポーネントのようにReactの機能を自由に使うことができなかった(stateなどReact.Componentのメソッド)関数コンポネントでも、stateなどクラスコンポーネントで使えていた機能を使えるようにするのが React Hooks!※React16.8で追加された比較的新しい機能
第4章 React Hooksを気合で理解する~useStateとuseEffect~20
• クラスコンポーネントで使えてた機能を関数コンポーネントでも使えるようにするのが React Hooks• React Hooks はReactに新機能を提供するものというより、リファクタリングのための道具を与えるものといえる• React Hooksのうちよく利用するのが useState と useEffect• useMemo, useCallback, useRef とかもたまに使う• useState … クラスコンポーネントの state を 関数コンポーネントでも使えるようにする• useEffect … クラスコンポーネントの 副作用 を 関数コンポーネントでも使えるようにするuseState と useEffect21
• useState … クラスコンポーネントの state を 関数コンポーネントでも使えるようにするuseState の使い方クラスコンポーネント 関数コンポーネント22
• useEffect … クラスコンポーネントの 副作用 (≒レンダリング以外の処理) を 関数コンポーネントでも使えるようにするuseEffect の使い方 (1)副作用を起こせる主なメソッド• componentDidMount出力がDOMにrenderされた直後に呼び出し• componentDidUpdateDOMが更新された直後に呼び出し• componentWillUnmountコンポネントが破棄される直前に呼び出し23
useEffect の使い方 (2)• useEffect … クラスコンポーネントの 副作用 (≒レンダリング以外の処理) を 関数コンポーネントでも使えるようにする24
useEffect の使い方 (2)※ 実際はクラスと関数で微妙に副作用実行のタイミングが異なっているので、書き換えは等価ではないcomponentDidMount,componentDidUpdate に対応componentWillUnmount に対応※両者の違いはuseEffectの第2引数でだいたい制御可能• useEffect … クラスコンポーネントの 副作用 (≒レンダリング以外の処理) を 関数コンポーネントでも使えるようにする25
その他のReact Hooks紹介した以外にもReact Hooksはいっぱいある。• useRef• refのフォワーディングを関数コンポネントで使用する• useContext• コンテクストを関数コンポネントで使用する• useMemo• レンダリング時の関数の実行結果をメモしパフォーマンスを改善するために使用する• useCallback• コールバック関数をメモしパフォーマンスを改善するために使用する• useReducer• Reduxっぽく状態を管理したいときにuseStateの代わりに使用する詳しくは、https://ja.reactjs.org/docs/hooks-reference.html に書いてある。26
• React Hooks を使えば、関数コンポーネントでもクラスコンポーネントで使えていた機能が利用できる• コードの意味が分からないときは公式ドキュメントを読んで体系的に勉強しましょう• LTこんなのでもよいのでぜひ!! (TypeScriptそのものでなくても、周辺分野であれば大丈夫です)まとめと教訓ご清聴ありがとうございました27