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 Native で状態管理とコンポーネント設計に悩んだ話
Search
zerosant
June 03, 2022
Technology
2
1.5k
React Native で状態管理とコンポーネント設計に悩んだ話
zerosant
June 03, 2022
Tweet
Share
Other Decks in Technology
See All in Technology
サイバーセキュリティと認知バイアス:対策の隙を埋める心理学的アプローチ
shumei_ito
0
380
【Startup CTO of the Year 2024 / Audience Award】アセンド取締役CTO 丹羽健
niwatakeru
0
990
10XにおけるData Contractの導入について: Data Contract事例共有会
10xinc
6
620
TanStack Routerに移行するのかい しないのかい、どっちなんだい! / Are you going to migrate to TanStack Router or not? Which one is it?
kaminashi
0
580
初心者向けAWS Securityの勉強会mini Security-JAWSを9ヶ月ぐらい実施してきての近況
cmusudakeisuke
0
120
Amplify Gen2 Deep Dive / バックエンドの型をいかにしてフロントエンドへ伝えるか #TSKaigi #TSKaigiKansai #AWSAmplifyJP
tacck
PRO
0
380
TypeScript、上達の瞬間
sadnessojisan
46
13k
隣接領域をBeyondするFinatextのエンジニア組織設計 / beyond-engineering-areas
stajima
1
270
リンクアンドモチベーション ソフトウェアエンジニア向け紹介資料 / Introduction to Link and Motivation for Software Engineers
lmi
4
300k
SREが投資するAIOps ~ペアーズにおけるLLM for Developerへの取り組み~
takumiogawa
1
180
dev 補講: プロダクトセキュリティ / Product security overview
wa6sn
1
2.3k
データプロダクトの定義からはじめる、データコントラクト駆動なデータ基盤
chanyou0311
2
310
Featured
See All Featured
Visualization
eitanlees
145
15k
4 Signs Your Business is Dying
shpigford
180
21k
Writing Fast Ruby
sferik
627
61k
Become a Pro
speakerdeck
PRO
25
5k
A designer walks into a library…
pauljervisheath
203
24k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
For a Future-Friendly Web
brad_frost
175
9.4k
BBQ
matthewcrist
85
9.3k
Done Done
chrislema
181
16k
Gamification - CAS2011
davidbonilla
80
5k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
Optimising Largest Contentful Paint
csswizardry
33
2.9k
Transcript
React Native でコンポーネント設計と 状態管理に悩んだ話 at TECH STAND #8 React Native
& React 2022.06.03 スターフェスティバル株式会社 ソフトウェアエンジニア 吉藤 徹
自己紹介 吉藤 徹 Yoshifuji Toru スターフェスティバル株式会社 ソフトウェアエンジニア @zerosant 普段は TypeScript
でサーバーサイド・フロントエンドを書いています。 Node.js や React がメイン。最近はサーバーサイド寄りが若干多め。
今日話すこと • サービス紹介 • 状態管理に悩んだ話 • コンポーネント設計に悩んだ話
サービス紹介 • 日本最大級の企業・ワーカー向け フードデリバリーサービス • 10,000種類以上のラインナップ • 会議・接待・イベントシーンにマッチし たごちそうをお届け
サービス紹介 • 毎日選べる日替わりメニューをオフィ スにお届け • 健康的な食事で福利厚生を充実 • Web・アプリ・Slackから注文
サーバーサイド API Batch フロントエンド ワーカー向け画面 各種管理画面 エンジニア2名 Slack Bot App
ごちクルNowの開発体制
技術選定 Why React Native ? • 普段からReactでフロントエンドを開発している。 • Flutterも検討したが、学習コストと天秤にかけてスピードを重視。
状態管理に悩んだ話
状態管理に悩んだ話 Web版での状態管理は... • Reduxを採用している。 • APIレスポンスや通信状態などを含め、Reduxに全部任せる。 • 単純なUIの制御状態は Local State
で管理する。
状態管理に悩んだ話 でも、Reduxはしんどい • コード量が多く、少しの改修でも変更量がかさむ。 • Redux不要論も囁かれ始める世の中。
「状態」ってなに...?
状態を分類した 1. セッションデータ ◦ 認証情報やそれに関連するユーザー情報・ユーザー設定。 ◦ 多くのページで使用されることを想定している。 2. ドメインデータ ◦
「商品」や「注文」といった、サービスが取り扱う固有なデータ。 ◦ サーバーからAPI経由で取得する。 ◦ 未取得・取得成功/失敗といった通信に関する状態も同時に持つ。 3. UIの制御状態 ◦ フォームの入力状態や開閉状態など。 ◦ ユーザーの操作によって変更され、 UIの表示に影響する。
状態の分類 → 状態管理の手法 1. セッションデータ → React Context ◦ 認証情報やそれに関連するユーザー情報・ユーザー設定。
◦ 多くのページで使用されることを想定している。 2. ドメインデータ → Local State or Redux ◦ 「商品」や「注文」といった、サービスが取り扱う固有なデータ。 ◦ サーバーからAPI経由で取得する。 ◦ 未取得・取得成功/失敗といった通信に関する状態も同時に持つ。 3. UIの制御状態 → Local State or React Context ◦ フォームの入力状態や開閉状態など。 ◦ ユーザーの操作によって変更され、 UIの表示に影響する。
状態管理の手法 : React Context いつ React Context を使うのか → ページを跨いで保持したいもので、更新頻度が低いものに使う
コンテクストは、ある React コンポーネントのツリーに対して「グローバル」とみなすことができる、現在の認証済 みユーザ・テーマ・優先言語といったデータを共有するために設計されています。 React 公式 - コンテクスト
状態管理の手法 : React Context React Context で管理するもの • セッションデータ ◦
すべてのページ/画面にまたがって使用する。 ◦ 更新頻度は低い • UIの制御状態 ◦ グローバルな制御状態のみ。 ◦ ModalとかSnackbarとか。
状態管理の手法 : Local State Local State で管理するもの • ドメインデータ ◦
特定のページ/画面のみで使用する、ページ固有のものに限る。 • UIの制御状態 ◦ フォームの入力状態など。 ◦ コンポーネントのライフサイクルに依存するもの。
状態管理の手法 : Redux Redux (などの状態管理ライブラリ) で管理するもの • ドメインデータ ◦ ページ/画面をまたがって保持する必要のあるもの。
◦ 該当するものはなさそう。 ◦ → 該当するものが出現したら導入する。
徐々に侵される Context
反省 • Modal や Snackbar など、グローバルなUIコン ポーネントにドメインデータを表示したくなる。 • 時が来たらReduxを入れるという決意、無謀(甚 大な作業量)
• 特定の処理だけを行うためだけの Contextが増 えていく。 • グッバイ秩序 ※ イメージ
Facebook もやってる FACEBOOK ALSO DOES SO.
コンポーネント設計に悩んだ話
状態管理に悩んだ話 Web版でのコンポーネント設計は... • 細かいルールは存在しなかった。 • ワーカー向け画面や複数の管理画面で使い回すUI部品は共通化している。 • Reduxを採用し、Container Component を作っていた。
• Redux の Action Creator で API を呼び出していた。 • あとは src/components にどんどん追加していく。
Reduxから解き放たれた私たち ※ イメージ
状態管理に悩んだ話 秩序を取り戻そう • API呼び出しは特定のレイヤで行う。 • Screen単位でContainer Componentを作って、そこでのみAPIを呼び出す。 • Atomic Design
でいう Pages と Templates に近い。 • あとは src/components にどんどん追加していく(雑)
目指すコンポーネント設計 ※ イメージ
肥大化する Container Component
反省 • Container コンポーネントが肥大化。 • Presentational コンポーネントの凝集度がと ても低い。 • どうにかして分割したいけど、
API call のレイ ヤを統一しつつ分割するとなると ... • 尽きぬ悩み ※ イメージ
まとめ • 状態管理に悩んだ話 ◦ 状態を三分類した。 ◦ 状態の特性ごとに適した状態管理手法を検討した。 • コンポーネント設計に悩んだ話 ◦
ページ/画面単位でビューとロジックを分離した。 ◦ ほんとはもっと細かい悩みはたくさんあるけど紹介しきれない ...!
We are hiring!!! スターフェスティバルでは、エンジニアを大募集しています!!!!! 採用情報 スターフェスティバル 採用情報 CTOによる対談記事 「イチから作り出せるチャンスがたくさんある」 CTO経験者が語った、スタフェス開発への期待|スター
フェスティバル公式|note
ご清聴ありがとうございました