缓存
Jotai 提供原始函数来优化重新渲染。 它旨在仅保存“当前”原子值,并且不缓存旧值。
缓存有时很有用。 例如,如果异步原子触发网络请求,我们可能希望缓存响应。
jotai-cache 是一个第三方库来帮助此类用例。
安装
yarn add jotai-cache
atomWithCache
atomWithCache(read, options): Atom
atomWithCache
创建一个新的带缓存的只读原子。
参数
read:定义只读原子的读取函数。
options(可选):自定义原子行为的选项对象
选项
size(可选):缓存项的最大大小。
shouldRemove(可选):检查是否应删除缓存项的函数。
areEqual(可选):比较原子值的函数。
示例
import { atom, useAtom } from "jotai";import { atomWithCache } from "jotai-cache";const idAtom = atom(1);const normalAtom = atom(async (get) => {const id = get(idAtom);const response = await fetch(`https://reqres.in/api/users/${id}?delay=1`);return response.json();});const cachedAtom = atomWithCache(async (get) => {const id = get(idAtom);const response = await fetch(`https://reqres.in/api/users/${id}?delay=1`);return response.json();});const NormalUser = () => {const [{ data }] = useAtom(normalAtom);return (<div><h1>User (normal atom)</h1><ul><li>ID: {data.id}</li><li>First name: {data.first_name}</li><li>Last name: {data.last_name}</li></ul></div>);};const CachedUser = () => {const [{ data }] = useAtom(cachedAtom);return (<div><h1>User (cached atom)</h1><ul><li>ID: {data.id}</li><li>First name: {data.first_name}</li><li>Last name: {data.last_name}</li></ul></div>);};const App = () => {const [id, setId] = useAtom(idAtom);return (<div>ID: {id}{" "}<button type="button" onClick={() => setId((c) => c - 1)}>Prev</button>{" "}<button type="button" onClick={() => setId((c) => c + 1)}>Next</button><hr /><Suspense fallback="Loading..."><CachedUser /></Suspense><hr /><Suspense fallback="Loading..."><NormalUser /></Suspense></div>);};