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
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
24
APIの意義と向き合い チームで成長した軌跡
8zca
0
90
10min_elixir
8zca
0
48
Using react at Startup
8zca
0
360
質問サイトからみる Rubyに関する質問傾向 を調べてみたよ
8zca
0
57
Other Decks in Programming
See All in Programming
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
2
1.5k
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
640
AIの中の人になってみる
htkym
0
170
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.8k
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
4
1.1k
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
160
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
2
500
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
360
XHTMLが残したもの
yosuke_furukawa
PRO
2
430
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
290
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
120
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
180
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.7k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Music & Morning Musume
bryan
47
7.4k
AI: The stuff that nobody shows you
jnunemaker
PRO
9
980
Making the Leap to Tech Lead
cromwellryan
135
10k
sira's awesome portfolio website redesign presentation
elsirapls
0
410
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
290
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
680
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Paper Plane
katiecoart
PRO
2
53k
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 をちゃんと使い分けしましょう