SlideShare a Scribd company logo
React Hooksで
カスタムフックを
つくろう
株式会社エクストーン 豊田陽一
今日のお話
● React Hooksおさらい
● React Hooksのうれしいところ
● カスタムフックをつくろう
React Hooksのおさらい
React Hooks
▰ 関数型コンポーネントのためのAPI
▰ React 16.8.0以降で利用可能
▰ 関数型コンポーネント内からのみ利用可能
関数型コンポーネント
▰ propsを引数に受け取り、Reactコン
ポーネントを返す関数
▰ stateやライフサイクルイベントを持たない
▰ Facebook的におすすめ
▰ 出来ることが少ないのでRedux等と組み合わせ
て使われていた
React Hooksで出来ること
▰ useState
▰ 状態の保持・更新
▰ useEffect
▰ ライフサイクルイベントの管理
▰ マウント時 / 更新時 / アンマウント時
▰ useContext
▰ コンテキストで管理している値の参照
どうやって実現しているのか
▰ 関数型言語的なアプローチ
▰ コンポーネント毎にLinkedListを保持
▰ useXXXを呼ぶたびにLinkedListの値を参照
し、値を返した上でポインタを進める
▰ useXXXがトップレベルでしか呼べない理
由がこれ
▰ render毎にuseXXXの呼び出す回数がズ
レるとLinkedList内で参照される値が変わ
るせい
useStateの実現例
▰ useState
▰ リスト内には状態とそれを更新する関数を持つ
▰ 状態を更新する関数は、リスト内の情報を「新しい
値と、それを更新する新しい関数」に更新する
▰ 基本的にはどのフックAPIも似たような作りになっ
ている
React Hooksのうれしいところ
関数型コンポーネントで出来るこ
とが増えた
▰ 状態が持てる
▰ コンテキストの参照が出来る
▰ ライフサイクルの管理が出来る
→ クラス型コンポーネントと同等の機能が
実現できるようになった
では無い!
それやったら
クラス型
使えばええねん
そうではなく
再利用の単位: コンポーネント
▰ 状態の保持
▰ ライフサイクルによるロジック
▰ 複雑化しがち
▰ カプセル化
▰ コンポーネントの保持している状態をコンポーネン
ト外から参照できない
再利用の単位: コンポーネント
▰ ロジックの値を参照したい場合には不
向き
▰ ex) ログイン中のユーザー名を取得する
▰ ex) ログイン状態を監視し、変更があった場合に
コールバックを呼ぶ
▰ etc.
再利用の単位: カスタムフック
▰ 関数
▰ コンポーネント間で共通するロジックの
共有
▰ useStateを利用することでステートフル
にすることが出来る
再利用の単位: カスタムフック
▰ 規約としてuseXXXという名前にする
▰ 関数型コンポーネントと同様に、React
Hooks APIをトップレベルでのみ呼び出
せる
▰ 他のカスタムフックを呼ぶことも可能
本当に
React Hooksで
うれしいこと
カスタムフックという
新しい
再利用の単位を
実現したこと
カスタムフックを作ろう
ログイン機能を作る
▰ やりたいこと
▰ IDとパスワードをサーバーに送るとログインが
出来る
▰ ログイン状態になるとユーザーのプロフィール
情報が取得出来る
提供するAPI
▰ useSignIn
▰ ログイン機能
▰ Provider
▰ コンテキストの値を提供するプロバイダ
▰ UserContext
▰ ユーザー情報を管理するコンテキスト
useSignIn
ログイン機能の提供
useSignIn
▰ サインイン機能を実現
▰ state: ログイン状態 (ログイン前/通信中/ログ
イン失敗/ログイン成功)
▰ errors: ログイン失敗時のエラー
▰ signIn: ログインAPIをリクエストする関数
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
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]
}
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 }
コンポーネントから
ログイン関連の処理を
隠せた!
おわりに
▰ カスタムフック
▰ 新しい共通化の単位
▰ 基本のReact Hooks APIの組み合わせで実現
▰ 名前はuseXXXにする
こんなの作った
▰ useMediaQuery
▰ npm i @rswisteria/react-use-media-query
▰ https://www.npmjs.com/package/@rswisteria/react-use-media-query
▰ https://github.com/rswisteria/useMediaQuery
▰ JavaScript上でメディアクエリを扱うカスタムフック
みんなも
カスタムフック
作って
公開しよう!

More Related Content

PPTX
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
PDF
ストリーム処理を支えるキューイングシステムの選び方
PDF
○ヶ月でできた!?さくらのクラウド開発秘話(【ヒカ☆ラボ】さくらインターネットとMilkcocoa!年末イベント:ここだけのウラ話)
PDF
JP1/AJS2オペレータ勉強会
PPTX
Argo CD Deep Dive
PDF
Mobage を支える Ruby の技術 ~ 複数DB編 ~
PDF
Ethernetの受信処理
PPTX
Redisの特徴と活用方法について
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
ストリーム処理を支えるキューイングシステムの選び方
○ヶ月でできた!?さくらのクラウド開発秘話(【ヒカ☆ラボ】さくらインターネットとMilkcocoa!年末イベント:ここだけのウラ話)
JP1/AJS2オペレータ勉強会
Argo CD Deep Dive
Mobage を支える Ruby の技術 ~ 複数DB編 ~
Ethernetの受信処理
Redisの特徴と活用方法について

What's hot (20)

PPTX
AWSメンテナンス ElastiCache編
PDF
AWS Black Belt Techシリーズ Amazon Kinesis
PDF
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
PPTX
StackStormを活用した運用自動化の実践
PPTX
継続的にテスト可能な設計を考える
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
【B-4】オープンソース開発で、フリー静的解析ツールを使ってみる
PDF
並行処理初心者のためのAkka入門
PPTX
Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...
PDF
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
構成情報データベースをGitで管理したいネットワーク運用者の憂鬱
PDF
社内のマニュアルをSphinxで作ってみた
PPTX
今だから!Amazon CloudFront 徹底活用
PDF
工数把握のすすめ 〜WorkTimeプラグインの使い方〜
PDF
Play with DockerでDocker学習環境を整えよう!
PDF
Apache OpenWhiskで実現するプライベートFaaS環境 #tjdev
PDF
Docker道場オンライン#1 Docker基礎概念と用語の理解
PDF
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
AWSメンテナンス ElastiCache編
AWS Black Belt Techシリーズ Amazon Kinesis
株式会社コロプラ『GKE と Cloud Spanner が躍動するドラゴンクエストウォーク』第 9 回 Google Cloud INSIDE Game...
StackStormを活用した運用自動化の実践
継続的にテスト可能な設計を考える
コンテナ未経験新人が学ぶコンテナ技術入門
【B-4】オープンソース開発で、フリー静的解析ツールを使ってみる
並行処理初心者のためのAkka入門
Apache BigtopによるHadoopエコシステムのパッケージング(Open Source Conference 2021 Online/Osaka...
Yahoo! JAPANのIaaSを支えるKubernetesクラスタ、アップデート自動化への挑戦 #yjtc
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
構成情報データベースをGitで管理したいネットワーク運用者の憂鬱
社内のマニュアルをSphinxで作ってみた
今だから!Amazon CloudFront 徹底活用
工数把握のすすめ 〜WorkTimeプラグインの使い方〜
Play with DockerでDocker学習環境を整えよう!
Apache OpenWhiskで実現するプライベートFaaS環境 #tjdev
Docker道場オンライン#1 Docker基礎概念と用語の理解
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
Ad

More from Yoichi Toyota (20)

PDF
超フランクにスクラムの大事なことの話をする
PDF
ジャワカレーをおいしく作る最後の一押し
PDF
ライブラリを作る思考回路
PDF
DynamoDB設計のちょっとした技
PDF
はじめてのDynamoDBスキーマ設計
PDF
オブジェクト指向についてあまり知られていないこと
PDF
Ruby is comming ractor編
PDF
array.map(&:key)ってなんやねん
PDF
はじめてのPull Request
PDF
Railsの開発環境作るぞ
PDF
jqで極めるシェル芸の話
PDF
足し算をつくろう
PPTX
ActionCableのクライアントはRails外から利用できるのか
PPTX
サーバーレスアプリケーションの作り方
PDF
SPA時代のOGPとの戦い方
PDF
AWS WAFでらくらくファイアーウォール生活
PDF
Docker in production
PDF
How to fight against “full scratch disease”
PDF
Amazon lexを触ってみた
PDF
Forkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーン
超フランクにスクラムの大事なことの話をする
ジャワカレーをおいしく作る最後の一押し
ライブラリを作る思考回路
DynamoDB設計のちょっとした技
はじめてのDynamoDBスキーマ設計
オブジェクト指向についてあまり知られていないこと
Ruby is comming ractor編
array.map(&:key)ってなんやねん
はじめてのPull Request
Railsの開発環境作るぞ
jqで極めるシェル芸の話
足し算をつくろう
ActionCableのクライアントはRails外から利用できるのか
サーバーレスアプリケーションの作り方
SPA時代のOGPとの戦い方
AWS WAFでらくらくファイアーウォール生活
Docker in production
How to fight against “full scratch disease”
Amazon lexを触ってみた
Forkwell Meetup #3 Productivity Engineering スポンサーLT - 株式会社エクストーン
Ad

React Hooksでカスタムフックをつくろう