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
6.1k
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
データと地図で読む 大井町の「かわるもの、かわらないもの」
yoshiyama_hana
0
550
GMOフィナンシャルゲートが挑む、「止まらない」決済インフラ構築の裏側【SORACOM Discovery 2026】
soracom
PRO
0
100
Azure Durable Functions で作った NL2SQL Agent の精度向上に取り組んだ話/aidevday2026
thara0402
0
120
現場をAIで動かす「フィジカル AI」の組み込み設計の考え方【SORACOM Discovery 2026】
soracom
PRO
0
140
全社でのソフトウェアサプライチェーン攻撃対策をやってみた with Takumi Guard
z63d
0
320
reFACToring
moznion
1
830
歴史から理解するクラウドインフラのしくみ
kizawa2020
0
190
13年運用タイトルのサーバーサイドが辿り着いた現在地 ― モンスターストライクにおける技術・組織・AI活用から得た知見
mixi_engineers
PRO
1
270
検索技術知識0のエンジニアが広告検索システムを内製化して運用するまで
lycorptech_jp
PRO
0
110
『モンスターストライク』 の運営に伴走する! データ民主化への 解析グループの3つのアプローチ
mixi_engineers
PRO
0
160
WEBフロントエンド研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
660
1台から試せる!Edge IoTを使った位置情報の活用設計【SORACOM Discovery 2026】
soracom
PRO
0
100
Featured
See All Featured
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
270
Producing Creativity
orderedlist
PRO
348
40k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
420
Paper Plane (Part 1)
katiecoart
PRO
1
9.9k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Speed Design
sergeychernyshev
33
1.9k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Site-Speed That Sticks
csswizardry
13
1.4k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
From π to Pie charts
rasagy
0
240
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 !