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
状態管理を楽にする道
Search
Kalan
December 11, 2020
460
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
状態管理を楽にする道
React HAKATAの発表資料です
Kalan
December 11, 2020
More Decks by Kalan
See All by Kalan
單頁式應用中的無障礙設計
kjj6198
0
850
選擇 Svelte 的三個理由 - JSDC
kjj6198
0
450
Svelte - 如何在前端框架中脫穎而出 | ModernWeb'21
kjj6198
0
250
Day25. 如何解析 HTML 語法
kjj6198
0
210
Day24. Svelte 如何編譯程式碼(2)
kjj6198
0
250
Svelte 如何編譯程式碼(1)
kjj6198
0
270
Day22. Svelte 經驗談
kjj6198
0
250
Day18. UI 實戰篇 - 圖片檢視器
kjj6198
0
230
Day17. UI 實戰篇 - 音樂播放器
kjj6198
0
130
Featured
See All Featured
The SEO identity crisis: Don't let AI make you average
varn
0
570
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
410
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
340
WENDY [Excerpt]
tessaabrams
14
40k
GraphQLとの向き合い方2022年版
quramy
50
15k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
380
Code Review Best Practice
trishagee
74
20k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
Bash Introduction
62gerente
615
220k
Rails Girls Zürich Keynote
gr2m
96
14k
Docker and Python
trallard
47
4.2k
Transcript
状態管理を楽にする道 @kalanyei
自己紹介 Kalan 台湾出身 福岡在住 Twitter: @kalanyei React 開発歴五年
よくあるパータン 1. まずローディングを出す 2. useEffectでAPIを呼ぶ 3. setPost を呼んで状態を更新 4. 記事を表示する
問題点 • エラーの場合、どう対応すべきか? • Loading は loading フラグで判断ではなく postがヌルかどうかで判断する
フラグを追加! isLoading, error を追加 .catchでエラー処理する
罠 エラーになったときisLoadingがtrueのまま エラーコンポネントじゃなくLoadingが表示 されてしまう postがヌルに要注意。 Can not read property ‘content’
of null
None
仕様変更なら。。。 • APIが失敗するときに3回までretryしてね。 • ユーザーが戻るボタンを押したとき、もしAPIが終わって いないならキャンセルしてね。
さらにフラグ追加
None
エラーをリセットする必要がある
問題点 • 状態が多くなればなるほど負担がかかる • 実装を徹底的に見ないとロジックはわからない • 仕様変更があったときにコードを変更する必要がある • 変更に応じてバグが出やすくなる 状態が最初から複雑ではなく
どんどん複雑になっていく
状態が最初から複雑ではなく どんどん複雑になっていく
解決案 1 - useReducer 同じところで複数の状態を変更するとき 通常、useReducer が useState より好ましいのは、複数の値にまたがる複雑な state
ロジックがある場合や、前の state に基づいて次の state を決める必要があ る場合です。また、useReducer を使えばコールバックの代わりに dispatch を下位 コンポーネントに渡せるようになるため、複数階層にまたがって更新を発生させ るようなコンポーネントではパフォーマンスの最適化にもなります。 https://ja.reactjs.org/docs/hooks-reference.html#usereducer
None
None
None
None
改善 • 何をするのかを明示している(アクションの名前でわかる) • 実装はアクションやデータを呼ぶだけ • reducerで状態遷移を統一している • reduxはみんな使っている(かも) reducer
や actionを定義するのはちょっと面倒くさいけど。。。
解決案 2 - flag使わず、statusを使う
フラグの問題点 • if (!loading && success && !canceled) みたいなコードが発生しやすい •
新しいフラグを追加すると、状態が2^n個になる • 開発者はすべての状態を把握することが不可能になる
None
TypeScriptに優しい if (status === 'error') {}
また問題点がある • 状態遷移の制御はできない • 状態遷移はわからない
ステートマシン • 遷移(状態に入る、出るとき行う動作) • 状態 • 終了状態 image source: wiki
ちょっと似てる? • actionは遷移(push, coin) • statusは状態(locked, un-locked)
似てるけど足りないよ • 制御はできない。(completed状態になってもloading状態に入る 事ができる) • 開始、終了動作は定義していない
xstate https://github.com/davidkpiano/xstate • Actions :状態に入る、出るときするべきこと • Guards:状態遷移を条件による制御すること ステートマシンを扱えるJavaScriptのライブラリ
状態遷移を可視化する ちゃんと目で見えると議論しやすい
遷移図を定義する
None
https://xstate.js.org/viz/
React に導入! useMachine
React に導入!
None
シンプルになった!
まとめ • フラグをできるだけ抑える • フラグを使わずに、statusを定義する (TypeScriptに一緒に使うと更に効果的) • useReducerを活用する • 状態遷移図を事前に定義する
• 絵を書く • xstateみたいな状態管理ライブラリの導入を検討する
リソース • xstate: https://xstate.js.org/ • xstate visualizer • Robust User
interface with finite state machines • XStateで状態遷移を共通言語にしよう • Should I useState or useReducer
ご清聴ありがとうございました!