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
Baseline対応のDOMの型定義を作った
uhyo
2
560
AI Agentをシステムに組み込む前にゆるく向き合ってみる
hayama17
0
190
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
11k
そのタスクオンスケですか?
poropinai1966
0
110
MySQL & MySQL HeatWave Report - June 2026
freshdaz
0
280
Mastraエージェント、どのクラウドにデプロイする?
minorun365
PRO
2
130
Fabricをフル活用する AI Agent Hub -製造業特化AIエージェントの設計
iotcomjpadmin
0
190
知見・人・API・DB・予算 ─ ナイナイ尽くしだった人事データ整備 with dbt、5年間の学び
ken6377
1
130
AI時代における最適なQA組織の作り方
ymty
3
330
製造現場での生成AIの活用、およびエージェントAIの実装のあり方、AVEVAの取り組み
iotcomjpadmin
0
210
Multi-Agent並列開発を 安全に回すための技術 / Technology for Safely Multi-Agent Parallel Development
tooppoo
0
250
“全部コピーしない”ファイルデータの活用 : — FSx for ONTAP × S3 Tables × Icebergで作るメタデータカタログ
yoshiki0705
0
260
Featured
See All Featured
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Making Projects Easy
brettharned
120
6.7k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
230
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.6k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
210
Design in an AI World
tapps
1
250
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
270
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
280
A Soul's Torment
seathinner
6
3k
How STYLIGHT went responsive
nonsquared
100
6.2k
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 !