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
recoil
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
39
APIの意義と向き合い チームで成長した軌跡
8zca
0
94
10min_elixir
8zca
0
48
Using react at Startup
8zca
0
360
質問サイトからみる Rubyに関する質問傾向 を調べてみたよ
8zca
0
58
Other Decks in Programming
See All in Programming
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
790
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
3.6k
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
32k
Workers Cache を知る
syumai
0
360
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
0
470
Simple Storage Service(S3) is not simple
iwatsukayura
0
290
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
300
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
280
phperだってパンチカードでコーディングしたい
o0h
PRO
0
340
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
390
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
Kotlinの15年とServer-Side Kotlin
n_takehata
1
150
Featured
See All Featured
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Music & Morning Musume
bryan
48
7.4k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
410
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Between Models and Reality
mayunak
4
500
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
340
Utilizing Notion as your number one productivity tool
mfonobong
4
620
Building AI with AI
inesmontani
PRO
1
1.3k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
270
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 をちゃんと使い分けしましょう