Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
1k
React Redux を用いた SPA 新規サービスを運用して得た知見と実装例
numanomanu
4
7.3k
1年半React.jsのプロジェクトに関わってみて.
numanomanu
0
2.1k
Other Decks in Technology
See All in Technology
営業オントロジーの作り方と、エージェントからの辿り方 ── ナレッジワークの現場から
kworkdev
PRO
1
210
可視化から始めたAI駆動開発_ochi_ver1.01 / AI-Driven Development Starting with Visualization_ver1.01
yayoi_dd
0
110
ログラスのマルチプロダクトを 支える認証基盤 〜テナントごとに異なる統制とどう向き合うか〜
dada4386
3
250
音声コミュニティを守るAI監視基盤_ 90%以上の入力削減を支えたServerless設計と運用判断
shuheioka123
0
120
Terraformを用いたJamf Pro構成のIaC, GitOps化への挑戦
yukun
0
120
Mastering Agentic Development: Harness Engineering for Effective Coding Agents
konippi
3
660
高負荷プロダクション環境におけるAWS Lambdaのリアル 〜スケールとコストを左右する実行ライフサイクルの技術仕様〜
maimyyym
2
830
AWS DevOps Agent スキルをつかいこなそう / Master AWS DevOps Agent Skills
kinunori
2
640
Coil3を内部実装から読み解く~キャッシュ戦略とAVIF画像の描画〜/nikkei-tech-talk50
nikkei_engineer_recruiting
0
180
[Kiro Meetup #7] Kiro Crew Dive Deep
konippi
0
430
企業の現実世界をグラフで写し取る
sansantech
PRO
0
220
大阪オフィスに Unitree Go2 がやってきたので Physical AI やってみた
dafujii
0
160
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
450
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
GraphQLとの向き合い方2022年版
quramy
50
15k
Being A Developer After 40
akosma
91
590k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
250
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
The SEO identity crisis: Don't let AI make you average
varn
0
560
My Coaching Mixtape
mlcsv
0
330
Design in an AI World
tapps
1
340
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 !