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.6k
React Native で状態管理とコンポーネント設計に悩んだ話
zerosant
June 03, 2022
Tweet
Share
Other Decks in Technology
See All in Technology
Building Scalable Backend Services with Firebase
wisdommatt
0
110
あなたの知らないクラフトビールの世界
miura55
0
120
信頼されるためにやったこと、 やらなかったこと。/What we did to be trusted, What we did not do.
bitkey
PRO
0
2.2k
メンバーがオーナーシップを発揮しやすいチームづくり
ham0215
1
100
#TRG24 / David Cuartielles / Post Open Source
tarugoconf
0
580
Goで実践するBFP
hiroyaterui
1
120
三菱電機で社内コミュニティを立ち上げた話
kurebayashi
1
360
re:Invent 2024のふりかえり
beli68
0
110
I could be Wrong!! - Learning from Agile Experts
kawaguti
PRO
8
3.4k
自社 200 記事を元に整理した読みやすいテックブログを書くための Tips 集
masakihirose
2
330
Godot Engineについて調べてみた
unsoluble_sugar
0
390
Amazon Q Developerで.NET Frameworkプロジェクトをモダナイズしてみた
kenichirokimura
1
200
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
67
4.5k
How STYLIGHT went responsive
nonsquared
96
5.3k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
19
2.3k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.4k
How to train your dragon (web standard)
notwaldorf
89
5.8k
Designing Experiences People Love
moore
139
23k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.6k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
500
Side Projects
sachag
452
42k
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
ご清聴ありがとうございました