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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
非定型業務をAI slackbotで自動化する ~ 社内要望を自動壁打ちするbotを作った ~/automating-ad-hoc-work-with-ai-slackbot
shibayu36
0
580
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
670
LLMにもCAP定理があるという話
harukasakihara
0
280
白金鉱業Meetup_Vol.24_「AIエージェントは分けるほど良い」は本当か? / Is it true that “the more you divide AI agents, the better”?
brainpadpr
1
220
日本 Fintech 未来予測レポート 2027〜2028年(手動編集版)
8maki
0
1.3k
protovalidate-es を導入してみた
bengo4com
0
170
Claude Code の Sandbox 機能を Anthropic Sandbox Runtime(srt) で試そう!/lets-play-anthropic-sandbox-runtime
tomoki10
1
520
10倍の生産性を実現するAI駆動並列エージェントのすべて
kumaiu
4
1.3k
2026TECHFRESH畢業分享會 - 原生還是跨平台? App 開發踩坑實錄
line_developers_tw
PRO
0
680
2026 TECHFRESH 畢業分享會 - AI-Native 重塑軟體工程與虛擬講師
line_developers_tw
PRO
0
670
フロンティアAIのゲート化と地政学リスク
nagatsu
0
110
生成 AI × MCP で切り拓く次世代 SRE!自律型運用への挑戦と開発者体験の進化
_awache
0
190
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
55
8.2k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
390
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Automating Front-end Workflow
addyosmani
1370
210k
What's in a price? How to price your products and services
michaelherold
247
13k
Designing for Performance
lara
611
70k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Agile that works and the tools we love
rasmusluckow
331
21k
For a Future-Friendly Web
brad_frost
183
10k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
940
Paper Plane
katiecoart
PRO
1
51k
Between Models and Reality
mayunak
4
330
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 !