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
recoil
Search
8zca
January 05, 2021
Programming
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
recoil
8zca
January 05, 2021
More Decks by 8zca
See All by 8zca
DBはそのままで、 ドメインモデルを分けた話
8zca
0
19
APIの意義と向き合い チームで成長した軌跡
8zca
0
84
10min_elixir
8zca
0
47
Using react at Startup
8zca
0
360
質問サイトからみる Rubyに関する質問傾向 を調べてみたよ
8zca
0
55
Other Decks in Programming
See All in Programming
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
230
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
860
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
230
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
120
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
240
Flow は今どうなっているか
mizdra
PRO
0
520
源内ハンズオン概要編
hideg
0
180
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
480
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
170
実装をデザインガイドラインに追従させるための取り組み / 260731-dip-mosh-design-system
dachi023
0
450
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
3
920
AIが無かった頃の素敵な出会いの話
codmoninc
1
430
Featured
See All Featured
AI: The stuff that nobody shows you
jnunemaker
PRO
9
910
Prompt Engineering for Job Search
mfonobong
0
400
VelocityConf: Rendering Performance Case Studies
addyosmani
332
25k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
570
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
460
Designing Experiences People Love
moore
143
24k
Utilizing Notion as your number one productivity tool
mfonobong
4
540
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
710
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
210
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Transcript
やっとrecoilさわったら めちゃめちゃよかった話 waki
モチベーション 昨年 Facebook からリリースされた状態管理ライブラリの recoil 。 ドキュメント見て「ほぉ」となってただけでした。 TypeScript 対応された(これも結構前)ので使ってみようと思いつつ触れてなかったので 今回試してみました。
空のフロントエンド • 状態管理 ◦ Redux Tool Kit ◦ 素の Redux
より簡単に書ける • API から取得したデータ ◦ swr 他にはreact-query、apollo-client 他には素のreact-redux、context api、 mobx、unstated
demo https://recoil-sample.8zca.vercel.app vercel 最高! code はこちら https://github.com/8zca/recoil-sample
構成 redux の管理方法が個人的にはわかりやすいと思っているので倣いました。
atom 最小単位の state です。 useState と同じ使い方ができます(複数コンポーネントにまたがっ て write/read できます)。 atom
が変わったら再描画されます。 import { atom } from 'recoil' export const userSearchState = atom<string>({ key: 'userSearchState', default: '' }) const setSearchValue = useSetRecoilState(userSearchState) const [searchValue, setSearchValue] = useRecoilState(userSearchState) const searchValue = useRecoilValue(userSearchState) 書き込みだけしたい 読み書き両方 読み込みだけしたい
selector atom の状態をもとに何かを処理した結果を持つことができます。 selector を使っている場合、 atom の変更だけでは再描画されず selector が変わったときだ け再描画されます。
export const userListSelectorState = selector<UserType[]>({ key: 'userListSelectorState', get: async ({ get }) => { const search = get(userSearchState) if (!search) return [] const res = await fetch(`/api/users?q=${search}`) return res.json() } }) get内でget関数を引数に受け取り、他の stateを 取得することができる。 この例では検索ワードを受け取り、 apiにリクエス トしている。 もちろん、component側から検索ワードを引数に selectorを呼び出してもよい。 ※setもありますが未検証
selector を呼び出す例 const userList = useRecoilValueLoadable(userListSelectorState) switch(userList.state) { case 'loading':
return <div>Loading..</div> case 'hasError': return <div>Error!!</div> case 'hasValue': if (userList.contents.length === 0) return <div>No results</div> return userList.contents.map((user) => <div key={user.id}>{user.name}</div>) } useRecoilValue で取り出すこともできます。 その場合は React suspence でローディングの処理がされます。 ただ、 SSR においては suspence が動かないので Loadable をかます必要が あります。
react-reduxとの比較 • code split しやすい ◦ コンポーネントに必要な state だけ読み込める combine
reducer reducer reducer selector atom atom selector component A component A redux recoil
react-reduxとの比較 • 記述量が減る • action を dispatch しなくてもいい const dispatch
= useDispatch() const users = useSelector((state: RootState) => state.users) useEffect(() => { dispatch(fetchUsers()) }, []) const users = useRecoilValueLoadable(userListSelectorState)
react-reduxとの比較 • selector の get は memo 化してくれる ◦ https://recoil-sample.8zca.vercel.app/users
◦ Tom で検索、 2 回め同じ Tom で検索したらリクエストは走らずに結果が表示される
まとめ • ええやん • 半日触った結果、非同期処理も含めて react-redux より簡単に扱えるのでプロダク ションで使ってもいいレベル ◦ zenn
も recoil 使ってるしね ◦ 導入も簡単。型定義も install 不要 ◦ hooks 全開。 • コンポーネント側から見ると atom か selector かは識別してなさそうなので、 selector だ けで運用するというのもやりようによっては可能 ◦ アンチパターンな気がする ◦ atom と selector をちゃんと使い分けしましょう