Submit Search
React Hooksでカスタムフックをつくろう
2 likes
4,666 views
Yoichi Toyota
React Hooksで実現できることをカスタムフックの作り方の実例を踏まえて紹介します。
Technology
Read more
1 of 31
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
More Related Content
PPTX
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
NTT DATA Technology & Innovation
PDF
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
PDF
○ヶ月でできた!?さくらのクラウド開発秘話(【ヒカ☆ラボ】さくらインターネットとMilkcocoa!年末イベント:ここだけのウラ話)
さくらインターネット株式会社
PDF
JP1/AJS2オペレータ勉強会
mizuky fujitani
PPTX
Argo CD Deep Dive
shunki fujiwara
PDF
Mobage を支える Ruby の技術 ~ 複数DB編 ~
Naotoshi Seo
PDF
Ethernetの受信処理
Takuya ASADA
PPTX
Redisの特徴と活用方法について
Yuji Otani
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
NTT DATA Technology & Innovation
ストリーム処理を支えるキューイングシステムの選び方
Yoshiyasu SAEKI
○ヶ月でできた!?さくらのクラウド開発秘話(【ヒカ☆ラボ】さくらインターネットとMilkcocoa!年末イベント:ここだけのウラ話)
さくらインターネット株式会社
JP1/AJS2オペレータ勉強会
mizuky fujitani
Argo CD Deep Dive
shunki fujiwara
Mobage を支える Ruby の技術 ~ 複数DB編 ~
Naotoshi Seo
Ethernetの受信処理
Takuya ASADA
Redisの特徴と活用方法について
Yuji Otani
What's hot
(20)
PPTX
AWSメンテナンス ElastiCache編
Serverworks Co.,Ltd.
PDF
AWS Black Belt Techシリーズ Amazon Kinesis
Amazon Web Services Japan
PDF
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
Google Cloud Platform - Japan
PPTX
StackStormを活用した運用自動化の実践
Shu Sugimoto
PPTX
継続的にテスト可能な設計を考える
Atsushi Nakamura
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
Kohei Tokunaga
PDF
【B-4】オープンソース開発で、フリー静的解析ツールを使ってみる
Developers Summit
PDF
KafkaとPulsar
Yahoo!デベロッパーネットワーク
PDF
並行処理初心者のためのAkka入門
Yoshimura Soichiro
PPTX
Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...
NTT DATA Technology & Innovation
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo!デベロッパーネットワーク
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
NTT DATA Technology & Innovation
PDF
構成情報データベースをGitで管理したいネットワーク運用者の憂鬱
Yuya Rin
PDF
社内のマニュアルをSphinxで作ってみた
Iosif Takakura
PPTX
今だから!Amazon CloudFront 徹底活用
Yasuhiro Araki, Ph.D
PDF
工数把握のすすめ 〜WorkTimeプラグインの使い方〜
Tomohisa Kusukawa
PDF
Play with DockerでDocker学習環境を整えよう!
Hori Tasuku
PDF
Apache OpenWhiskで実現するプライベートFaaS環境 #tjdev
Yahoo!デベロッパーネットワーク
PDF
Docker道場オンライン#1 Docker基礎概念と用語の理解
Masahito Zembutsu
PDF
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
NTT DATA Technology & Innovation
AWSメンテナンス ElastiCache編
Serverworks Co.,Ltd.
AWS Black Belt Techシリーズ Amazon Kinesis
Amazon Web Services Japan
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
Google Cloud Platform - Japan
StackStormを活用した運用自動化の実践
Shu Sugimoto
継続的にテスト可能な設計を考える
Atsushi Nakamura
コンテナ未経験新人が学ぶコンテナ技術入門
Kohei Tokunaga
【B-4】オープンソース開発で、フリー静的解析ツールを使ってみる
Developers Summit
KafkaとPulsar
Yahoo!デベロッパーネットワーク
並行処理初心者のためのAkka入門
Yoshimura Soichiro
Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...
NTT DATA Technology & Innovation
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Yahoo!デベロッパーネットワーク
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
NTT DATA Technology & Innovation
構成情報データベースをGitで管理したいネットワーク運用者の憂鬱
Yuya Rin
社内のマニュアルをSphinxで作ってみた
Iosif Takakura
今だから!Amazon CloudFront 徹底活用
Yasuhiro Araki, Ph.D
工数把握のすすめ 〜WorkTimeプラグインの使い方〜
Tomohisa Kusukawa
Play with DockerでDocker学習環境を整えよう!
Hori Tasuku
Apache OpenWhiskで実現するプライベートFaaS環境 #tjdev
Yahoo!デベロッパーネットワーク
Docker道場オンライン#1 Docker基礎概念と用語の理解
Masahito Zembutsu
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
NTT DATA Technology & Innovation
Ad
More from Yoichi Toyota
(20)
PDF
超フランクにスクラムの大事なことの話をする
Yoichi Toyota
PDF
ジャワカレーをおいしく作る最後の一押し
Yoichi Toyota
PDF
ライブラリを作る思考回路
Yoichi Toyota
PDF
DynamoDB設計のちょっとした技
Yoichi Toyota
PDF
はじめてのDynamoDBスキーマ設計
Yoichi Toyota
PDF
オブジェクト指向についてあまり知られていないこと
Yoichi Toyota
PDF
Ruby is comming ractor編
Yoichi Toyota
PDF
array.map(&:key)ってなんやねん
Yoichi Toyota
PDF
はじめてのPull Request
Yoichi Toyota
PDF
Railsの開発環境作るぞ
Yoichi Toyota
PDF
jqで極めるシェル芸の話
Yoichi Toyota
PDF
足し算をつくろう
Yoichi Toyota
PPTX
ActionCableのクライアントはRails外から利用できるのか
Yoichi Toyota
PPTX
サーバーレスアプリケーションの作り方
Yoichi Toyota
PDF
SPA時代のOGPとの戦い方
Yoichi Toyota
PDF
AWS WAFでらくらくファイアーウォール生活
Yoichi Toyota
PDF
Docker in production
Yoichi Toyota
PDF
How to fight against “full scratch disease”
Yoichi Toyota
PDF
Amazon lexを触ってみた
Yoichi Toyota
PDF
Forkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーン
Yoichi Toyota
超フランクにスクラムの大事なことの話をする
Yoichi Toyota
ジャワカレーをおいしく作る最後の一押し
Yoichi Toyota
ライブラリを作る思考回路
Yoichi Toyota
DynamoDB設計のちょっとした技
Yoichi Toyota
はじめてのDynamoDBスキーマ設計
Yoichi Toyota
オブジェクト指向についてあまり知られていないこと
Yoichi Toyota
Ruby is comming ractor編
Yoichi Toyota
array.map(&:key)ってなんやねん
Yoichi Toyota
はじめてのPull Request
Yoichi Toyota
Railsの開発環境作るぞ
Yoichi Toyota
jqで極めるシェル芸の話
Yoichi Toyota
足し算をつくろう
Yoichi Toyota
ActionCableのクライアントはRails外から利用できるのか
Yoichi Toyota
サーバーレスアプリケーションの作り方
Yoichi Toyota
SPA時代のOGPとの戦い方
Yoichi Toyota
AWS WAFでらくらくファイアーウォール生活
Yoichi Toyota
Docker in production
Yoichi Toyota
How to fight against “full scratch disease”
Yoichi Toyota
Amazon lexを触ってみた
Yoichi Toyota
Forkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーン
Yoichi Toyota
Ad
React Hooksでカスタムフックをつくろう
1.
React Hooksで カスタムフックを つくろう 株式会社エクストーン 豊田陽一
2.
今日のお話 ● React Hooksおさらい ●
React Hooksのうれしいところ ● カスタムフックをつくろう
3.
React Hooksのおさらい
4.
React Hooks ▰ 関数型コンポーネントのためのAPI ▰
React 16.8.0以降で利用可能 ▰ 関数型コンポーネント内からのみ利用可能
5.
関数型コンポーネント ▰ propsを引数に受け取り、Reactコン ポーネントを返す関数 ▰ stateやライフサイクルイベントを持たない ▰
Facebook的におすすめ ▰ 出来ることが少ないのでRedux等と組み合わせ て使われていた
6.
React Hooksで出来ること ▰ useState ▰
状態の保持・更新 ▰ useEffect ▰ ライフサイクルイベントの管理 ▰ マウント時 / 更新時 / アンマウント時 ▰ useContext ▰ コンテキストで管理している値の参照
7.
どうやって実現しているのか ▰ 関数型言語的なアプローチ ▰ コンポーネント毎にLinkedListを保持 ▰
useXXXを呼ぶたびにLinkedListの値を参照 し、値を返した上でポインタを進める ▰ useXXXがトップレベルでしか呼べない理 由がこれ ▰ render毎にuseXXXの呼び出す回数がズ レるとLinkedList内で参照される値が変わ るせい
8.
useStateの実現例 ▰ useState ▰ リスト内には状態とそれを更新する関数を持つ ▰
状態を更新する関数は、リスト内の情報を「新しい 値と、それを更新する新しい関数」に更新する ▰ 基本的にはどのフックAPIも似たような作りになっ ている
9.
React Hooksのうれしいところ
10.
関数型コンポーネントで出来るこ とが増えた ▰ 状態が持てる ▰ コンテキストの参照が出来る ▰
ライフサイクルの管理が出来る → クラス型コンポーネントと同等の機能が 実現できるようになった
11.
では無い!
12.
それやったら クラス型 使えばええねん
13.
そうではなく
14.
再利用の単位: コンポーネント ▰ 状態の保持 ▰
ライフサイクルによるロジック ▰ 複雑化しがち ▰ カプセル化 ▰ コンポーネントの保持している状態をコンポーネン ト外から参照できない
15.
再利用の単位: コンポーネント ▰ ロジックの値を参照したい場合には不 向き ▰
ex) ログイン中のユーザー名を取得する ▰ ex) ログイン状態を監視し、変更があった場合に コールバックを呼ぶ ▰ etc.
16.
再利用の単位: カスタムフック ▰ 関数 ▰
コンポーネント間で共通するロジックの 共有 ▰ useStateを利用することでステートフル にすることが出来る
17.
再利用の単位: カスタムフック ▰ 規約としてuseXXXという名前にする ▰
関数型コンポーネントと同様に、React Hooks APIをトップレベルでのみ呼び出 せる ▰ 他のカスタムフックを呼ぶことも可能
18.
本当に React Hooksで うれしいこと
19.
カスタムフックという 新しい 再利用の単位を 実現したこと
20.
カスタムフックを作ろう
21.
ログイン機能を作る ▰ やりたいこと ▰ IDとパスワードをサーバーに送るとログインが 出来る ▰
ログイン状態になるとユーザーのプロフィール 情報が取得出来る
22.
提供するAPI ▰ useSignIn ▰ ログイン機能 ▰
Provider ▰ コンテキストの値を提供するプロバイダ ▰ UserContext ▰ ユーザー情報を管理するコンテキスト
23.
useSignIn ログイン機能の提供
24.
useSignIn ▰ サインイン機能を実現 ▰ state:
ログイン状態 (ログイン前/通信中/ログ イン失敗/ログイン成功) ▰ errors: ログイン失敗時のエラー ▰ signIn: ログインAPIをリクエストする関数
25.
useSignInの利用イメージ const SignIn =
(props) => { const [state, error, signIn] = useSignIn() const { user } = useContext(UserContext) if (user) { return <></> } return <div> {error} <button onClick={signIn} disabled={state === ‘loading’}>Sign In</button> </div> } export default SignIn
26.
useSignInの実装 const useSignIn =
() => { const [state, setState] = useState('before_sign_in') const [errors, setErrors] = useState(null) const { user, setUser } = useContext(UserContext) const signIn = useCallback(() => { if (user !== null) { return } if (state === 'loading' || state === 'success') { return } if (state === 'waiting_callback') { firebase.auth().getRedirectResult().then((result) => { if (result.credential) { setState('loading') setUser(result.user) setState('success') } }).catch((error) => { setState('error') setErrors(error.code) }) setState('loading') } else { const provider = new firebase.auth.GoogleAuthProvider() firebase.auth().signInWithRedirect(provider) setState('waiting_callback') } }, [user, setUser, state]) return [state, errors, signIn] }
27.
Provider, UserContext const UserContext
= createContext({ user: null, setUser: () => {} }) const Provider = ({children}) => { const [user, setUser] = useState(null) useEffect(() => { firebase.auth().onAuthStateChanged(function(user) { setUser(user) }); }, [user, setUser]) return <UserContext.Provider value={{ user, setUser }}> {children} </UserContext.Provider> }; export { UserContext, Provider }
28.
コンポーネントから ログイン関連の処理を 隠せた!
29.
おわりに ▰ カスタムフック ▰ 新しい共通化の単位 ▰
基本のReact Hooks APIの組み合わせで実現 ▰ 名前はuseXXXにする
30.
こんなの作った ▰ useMediaQuery ▰ npm
i @rswisteria/react-use-media-query ▰ https://www.npmjs.com/package/@rswisteria/react-use-media-query ▰ https://github.com/rswisteria/useMediaQuery ▰ JavaScript上でメディアクエリを扱うカスタムフック
31.
みんなも カスタムフック 作って 公開しよう!
Download