Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ReactのHigher-order Componentsの利用方法
Search
numanomanu
December 15, 2016
Technology
160
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ReactのHigher-order Componentsの利用方法
numanomanu
December 15, 2016
More Decks by numanomanu
See All by numanomanu
誰も教えてくれない。エンジニアのためのブログライティング入門〜書けば書くほどキャリアアップした話〜/ how_to_write_engineering_blog
numanomanu
7
7.2k
新規事業開発におけるエンジニアの心得
numanomanu
7
6k
React 周辺のエコシステムで体験する再利用プログラミング(MANABIYA プログラミングセッション)
numanomanu
0
990
React Redux を用いた SPA 新規サービスを運用して得た知見と実装例
numanomanu
4
7.2k
1年半React.jsのプロジェクトに関わってみて.
numanomanu
0
2.1k
Other Decks in Technology
See All in Technology
Multi-Agent並列開発を 安全に回すための技術 / Technology for Safely Multi-Agent Parallel Development
tooppoo
0
250
水を運ぶ人としてのリーダーシップ
izumii19
4
1.2k
Fabricをフル活用する AI Agent Hub -製造業特化AIエージェントの設計
iotcomjpadmin
0
190
認証認可だけじゃない! ID管理の構成要素と ライフサイクルを意識しよう
ritou
1
440
プライバシー保護の理論と実践
lycorptech_jp
PRO
1
230
Agentic AI 時代のテスト手法: Kiro とはじめるプロパティベーステスト (AWS Summit Japan 2026 | DEV212)
ymhiroki
0
170
クラウドファンディング版StackChan 3体(4体)をインタラクティブな体験型作品にして展示もした話 / スタックチャンお誕生日会2026
you
PRO
0
270
AIDLC_ヤフーショッピングの取り組み
lycorptech_jp
PRO
0
430
背中から、背中へ /paying forward to community
naitosatoshi
0
210
トークン最適化のためのユーザーストーリー分析 / User Story Analysis for Token Optimization
oomatomo
0
160
Docker Desktop不要の時代が来る? WSL標準の「wslc」で Linuxコンテナを動かしてみた.
ueponx
0
510
テスト設計の本質を改めて考えてみる~生成AIを活用する時代だからこそ、作ったテストの説明性を高めよう~
yamasaki696
1
270
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.6k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
650
First, design no harm
axbom
PRO
2
1.2k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.7k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
240
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
How GitHub (no longer) Works
holman
316
150k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
180
Transcript
ReactのHigher-order Componentsの利用方法 Tsuyoshi Numano @Lancers 2016/12/15
自己紹介
沼野剛志 1990年生まれ 出身高専 :神戸高専専攻科(~2012) 出身大学院 :JAIST(~2014) 現在はランサーズ株式会社でフロントエンドエンジニアとして 働いています。主にReact.jsを利用。 自己紹介
ランサーズ株式会社について
React.js のプロダクト:メッセージ画面
React.js のプロダクト:プロジェクト管理画面
ランサーズのフロント周りで利用している技術 ランサーズ流 React.js/redux アプリ開発入門 リポジトリ公開してます!
今日お話しする内容(主にHOCについて話します) - HOC(Higher-order-compoents)の基礎 - 実際に利用されているライブラリについて - 弊社での利用実例 - まとめ
HOCの基礎
A higher-order component is just a function that takes an
existing component and returns another component that wraps it. (引用: Mixins Are Dead. Long Live Composition) - コンポーネントを引数にして、カスタマイズしたコンポーネントを返す関数のこ と - 既存のコンポーネントに新しい機能を追加することが可能 HOC とは何か? HOCの基礎
HOC の基礎 sebmarkbage/Enhance.js の gist の例(HOCの古典) HOCの基礎
要点を抜き出すと 1. 関数がコンポーネントを引数にとって 3. 引数にとったコンポーネントに 合成してreurn. (data という props を加えて返す)
2. 何か処理を行って。 (ここでは、stateに data: ‘Hello’ を代入) HOCの基礎
HOC の基礎:利用する側の実装 HOCの基礎
要点を抜き出すと 1. 先ほどの関数の引数に、コンポーネントを指定する 2. Enhance.js から渡した data が利用できる HOCの基礎
コンポーネントに機能を加えて、 新たなコンポーネントを返す関数 Enhancer MyComponent return Enhance(MyComponent) Reactのコンポーネントが引数 合成されたコンポーネント (Higher-Order Components)
data data HOC の基礎 イメージ図 HOCの基礎
実際に利用されている ライブラリについて
• react-redux • connect() • material-ui (material design を react
のコンポーネントで利用できるライブラリ) • muiThemeable() • redux-form (フォームの処理を react-redux のフローに乗せてくれるライブラリ) • reduxForm() • react-router(react のコンポーネント単位でルーティングを行えるライブラリ) • withRouter() • radium (cssの擬似セレクタをインラインで扱うライブラリ) • enhanceWithRadium() 最近よく見かける HOC を利用しているライブラリとその実装 ライブラリについて
material-ui での例 Material Design を react の component で利用出来るライブラリ ライブラリについて
material-ui / themes - テーマの色設定などは、muiTheme という形で1つのファイルで管理している - textColor などの定義を、自作のコンポーネントでも使いたい場合・・・ material-ui での例
ライブラリについて
- muiThemeable()()という HOC を呼び出して、独自のコンポーネントに適応 - MyComponent というコンポーネントに、muiThemeable を適応している 1.関数の引数に、コンポーネントを指定する 2.
textColor が呼び出せるようになった material-ui での例 ライブラリについて
muiThemeable.jsの中身を簡略化したもの ライブラリについて material-ui での例
muiThemeable.jsの中身を簡略化したもの 1.関数が、引数にコンポーネントをとって 3.引数にとったコンポーネントに合成して返す 2. 何らかの処理を加えて ライブラリについて material-ui での例
ReduxForm での例 フォームなどを redux のフローで扱えるライブラリ ライブラリについて
ReduxForm での例 ライブラリについて
ReduxForm での例 1.関数の引数に、コンポーネントを指定する 2. reduxのフローで操作可能になる ライブラリについて
reduxForm.js の中身を簡略化したもの ライブラリについて
reduxForm.js の中身を簡略化したもの 1.関数が、引数にコンポーネントをとって 3.引数にとったコンポーネントに合成して返す 2. 何らかの処理を加えて ライブラリについて
ここまでのまとめ1 React関連のライブラリを使っていて というような、コンポーネントを引数に取る構成の記述を見かけた場合はHOC の実装を使っているのではないかと考えると理解しやすい。 ライブラリについて
ここまでのまとめ2 1. 関数がコンポーネントを引数にとって 2. 何らかの処理を加えて a. 新しい props の注入 b.
共通のライフサイクル処理 3. 引数にとったコンポーネントに合成して返す 案外、 HOC の実装はパッと見で複雑でも、元のコンポーネントに新しく props を注入したりしているだけかもしれません。 ライブラリについて
弊社での利用実例
HOC の 2 つのパターン React Higher Order Components in depthの記事によると、HOC
には2つの パターンがあります 1. 先ほどまでの props を新しく追加する例は Props Proxy 2. PropsProxy 以外には Inheritance Inversion (逆継承) 実際の実装を見ながら順に説明していきます 弊社での利用実例
HOC の具体的な実装例1 ボタンのバリエーションを HOC で表現する 以下のようなボタンを作りたい時 弊社での利用実例
HOC の具体的な実装例1:HOCを作成 - createPrimaryButton という関数で、HOCを作成 - material-ui の RaisedButton コンポーネントを拡張
弊社での利用実例
HOC の具体的な実装例1:HOCを作成 - createPrimaryButton という関数で、HOCを作成 - material-ui の RaisedButton コンポーネントを拡張
1.引数にコンポーネントをとる関数を作る 2.処理を加えて、引数にとったコンポーネントに合成して返す 3. コンポーネントを引数に、ボタンを作成 弊社での利用実例
HOC の具体的な実装例1: 呼び出す側 - PrimaryButton という名前で呼び出せる - material-ui の label
などのプロパティがそのまま利用できる 弊社での利用実例
HOC の具体的な実装例1 - createButton に引数をつけて、バリエーションを増やす - color, size, shape をそれぞれ追加
弊社での利用実例
HOC の具体的な実装例1 - createButton に引数をつけて、バリエーションを増やす - color, size, shape をそれぞれ追加
弊社での利用実例 1.引数に変数を加える 2.引数から、一意の名前のコンポーネントを作成する
HOC の具体的な実装例1 - PrimaryButtonFullWidthなど、限定的な名前を持たせることで、コードが リーダブルになる 弊社での利用実例
HOC の具体的な実装例1(補足) - FlowTypeなどで型を持たせると、さらにリーダブルになる 弊社での利用実例
HOC の具体的な実装例2 - 閲覧するのにログインが必要なコンポーネントをHOCで制御 - Reduxで、 session.userId でログインユーザを管理してる前提 - loggedInRequired()
という HOC を作る 弊社での利用実例
HOC の具体的な実装例2 - ログインが必要な箇所は、HOCでラップしてあげる - 「ログインしていません」のようなダイアログを出したい 弊社での利用実例
HOC の具体的な実装例2 弊社での利用実例
HOC の具体的な実装例2 1.関数が、コンポーネントを引数にとって 2.引数にとったコンポーネントをextends して 3. render をハイジャック 4. extends
したコンポーネントを返す 弊社での利用実例
HOC の具体的な実装例2 で行っていること ラップしたコンポーネント自身を extends している。(Inheritance inversion) - HOCのライフサイクルメソッドを、ラップしたコンポーネントに適応 -
HOCから、ラップしたコンポーネントの state や props に thisでアクセス - 条件によって、レンダリングしないように、 render をハイジャックできる ログインが必要なコンポーネントは、このHOCを利用すれば良いため、他のコンポーネ ント内にif文などを書かなくて良くなり、コンポーネント自身の責務に集中出来る。 弊社での利用実例
複数のHOCを合成して使うテクニック - コンポーネントを複数のHOCでラップしたい場合 - loggedInRequired(connect(mapStateToProps, mapDispatchToProps)(ProfileForm)) と書くのか? - redux の
compose や lodash.js の _.compose を利用 弊社での利用実例
まとめ
まとめ - HOC はコンポーネントを引数にして、カスタマイズしたコンポーネントを返 す関数のこと - material-ui や redux-form など、様々なライブラリで利用されている -
組み合わせることで、既存のコンポーネントに新しい機能を追加することが 可能 - アプリケーション内で共通に利用する機能や、パーツをまとめるのに便利 - 慣れればコードを読みやすくかける
https://www.wantedly.com/projects/74679
Thank you !