Slide 1

Slide 1 text

React Queryは非同期の 状態管理ライブラリだ HRBrain 長期インターン 安井大晟

Slide 2

Slide 2 text

自己紹介 01. 02. 03. 04. 05. 状態管理の種類 Client State vs Server State 非同期の状態を 管理する キャッシュを 管理する Table of contents

Slide 3

Slide 3 text

自己紹介 01.

Slide 4

Slide 4 text

経歴 2019年 早稲田大学教育学部入学 2021年 42Tokyo入学 プログラミングを始める 2022年 技育展優秀賞 2022年 HRBrain長期インターン開始 2023年 春のJavaScript祭りLT登壇 2023年 社内Qiita Engineer Festa運営中

Slide 5

Slide 5 text

02. 状態管理の種類

Slide 6

Slide 6 text

Reactの状態には 何種類ある? Redux Context API Recoil jotai useState React Query SWR

Slide 7

Slide 7 text

A. 3種類

Slide 8

Slide 8 text

株式会社ナレッジワークよしこさんの 記事をお借りします

Slide 9

Slide 9 text

Client State Global State Server State Reactの状態には3種類ある 各Component内で 管理される状態 ページをまたいで 保持し続ける 必要のある状態 サーバーデータ のキャッシュ

Slide 10

Slide 10 text

Client State Global State Server State Reactの状態には3種類ある UIの状態 トースト表示 APIレスポンス

Slide 11

Slide 11 text

Client State Global State Server State Reactの状態には3種類ある UIの状態 トースト表示 APIレスポンス クライアントの状態 サーバーの状態

Slide 12

Slide 12 text

本来、サーバーの状態は クライアントの状態と 分けて管理されるべきである

Slide 13

Slide 13 text

Client State Global State Server State Reactの状態には3種類ある UIの状態 トースト表示 APIレスポンス クライアントの状態 サーバーの状態

Slide 14

Slide 14 text

Client State Global State Server Stateが存在しない UIの状態 トースト表示 APIレスポンス

Slide 15

Slide 15 text

Redux

Slide 16

Slide 16 text

Client State Global State Server Stateが存在しない UIの状態 トースト表示 APIレスポンス Reduxでは、 Server Stateを Global State として管理している

Slide 17

Slide 17 text

03. Client State vs Server State

Slide 18

Slide 18 text

Client StateとServer State の違いは? 以後、Client State = Client State + Global State

Slide 19

Slide 19 text

Client State vs Server State Client State Server State 所有者 クライアントが完全に所有している リモートに操作されうる 同期性 同期的に使用することができる 非同期的に使用する必要がある 最新性 常に最新の状態である 状態が古くなる可能性がある

Slide 20

Slide 20 text

Client State vs Server State Client State Server State 所有者 クライアントが完全に所有している リモートに操作されうる 同期性 同期的に使用することができる 非同期的に使用する必要がある 最新性 常に最新の状態である 状態が古くなる可能性がある

Slide 21

Slide 21 text

04. 非同期の状態を管 理する

Slide 22

Slide 22 text

ReduxとReact Queryでの 非同期な状態の実装を比較 loadingで検証

Slide 23

Slide 23 text

Reduxの場合

Slide 24

Slide 24 text

React Queryの場合

Slide 25

Slide 25 text

React Queryの場合

Slide 26

Slide 26 text

React Queryは非同期の 状態管理ライブラリだ

Slide 27

Slide 27 text

05. キャッシュを 管理する

Slide 28

Slide 28 text

Client State vs Server State Client State Server State 所有者 クライアントが完全に所有している リモートに操作されうる 同期性 同期的に使用することができる 非同期的に使用する必要がある 最新性 常に最新の状態である 状態が古くなる可能性がある

Slide 29

Slide 29 text

状態をなるべく 最新に保ちたい

Slide 30

Slide 30 text

useQueryを使用した データフェッチの流れ 1. useQueryがコンポーネントで呼ばれ、データフェッチを開始 2. queryKeyを参考にキャッシュを確認する - キャッシュヒットした場合、キャッシュされたデータをコンポーネントに返却 - キャッシュヒットしなかった場合、または、キャッシュヒットしたがキャッシュが stale状態の場 合は3に進む 3. バックグラウンドで新しいデータを fetchしてアップデートする 4. 新しいデータをキャッシュに保存して再レンダリングする

Slide 31

Slide 31 text

なるべくキャッシュを 返してfetchを減らしたい

Slide 32

Slide 32 text

StaleTimeとcacheTime ● staleTime ○ キャッシュをstale(古くなったとみなす) 状態にするまでの期間 ○ デフォルト:0 ● cacheTime ○ キャッシュをガベージコレクション(メモリ領域の開放)するまでの 時間 ○ デフォルト:5分

Slide 33

Slide 33 text

StaleTimeを使用する ● staleTime:0 ○ 常に最新のデータを取得する ● staleTime:Infinity ○ キャッシュが常にfreshなのでネットワークのリクエストが走らず、 キャッシュからデータを取得する ○ 自分しか変更できないデータに有効

Slide 34

Slide 34 text

StaleTimeを使用する ● staleTime:0 ○ 基本はこの設定で良い ● staleTime:Infinity ○ データが更新されるタイミングがわかっていれば Infinityにして、更新時に明示的にinvalidateする 最新性を優先する

Slide 35

Slide 35 text

Client State vs Server State Client State Server State 所有者 クライアントが完全に所有している リモートに操作されうる 同期性 同期的に使用することができる 非同期的に使用する必要がある 最新性 常に最新の状態である 状態が古くなる可能性がある

Slide 36

Slide 36 text

Thanks!!!

Slide 37

Slide 37 text

Thanks!!! ● Twitter ○ https://twitter.com/ytaisei_ ● Qiita ○ https://qiita.com/taisei-13046 ● Zenn ○ https://zenn.dev/taisei_13046