如何在SolidJS中缓存服务器响应?现有方案存在局限
在SolidJS中实现服务器响应缓存
我需要在SolidJS中实现服务器响应缓存,当前切换/users与/users/:id页面时,每次都会重复发起服务器请求。
已尝试的方案:提取全局资源
我将资源提取至/api/users.api.ts文件,实现了仅在应用初始化时发起一次请求,还能在该文件中管理重新获取逻辑,相关代码如下:
/api/users.api.ts代码:
export const [usersResource, usersResourceAction] = createResource(getUsers);
修改后的/routes/users/index.tsx:
export default () => { return ( <div> <h1>Users list</h1> <ul> <For each={usersResource()}> {(user) => <A href={`/users/${user.id}`}>{user.name}</A>} </For> </ul> </div> ); };
修改后的/routes/users/[id].tsx:
export default () => { const params = useParams(); return ( <div> <div>User {params.id}</div> <h2>See all users</h2> <ul> <For each={usersResource()}>{(user) => <li>{user.name}</li>}</For> </ul> </div> ); };
新增用户时的重新获取逻辑:
export async function addUser(name: string) { const body = JSON.stringify({ name, }); const req = await fetch("http://localhost:8080/users", { method: "POST", body, headers: { "Content-Type": "application/json", }, }); if (req.ok) { usersResourceAction.refetch() } return req.json(); }
方案局限
该方案存在局限:无法在/api/users.api.ts文件中创建带signal的资源,比如不能在组件外使用useParams:
const params = useParams(); // 错误:不能在组件外使用useParams export const [getUserById, getUserByIdActions] = createResource(params.id, getOneUser);
替代库尝试
我还尝试过solid-cache库,但它不支持更新单个缓存键(比如新增用户时更新users键)。
原始页面代码
/routes/users/index.tsx原代码:
export default () => { const [users] = createResource(getUsers); return ( <div> <h1>Users list</h1> <ul> <For each={users()}> {(user) => <A href={`/users/${user.id}`}>{user.name}</A>} </For> </ul> </div> ); }
/routes/users/[id].tsx原代码:
export default () => { const params = useParams(); const [users] = createResource(getUsers); return ( <div> <div>User {params.id}</div> <h2>See all users</h2> <ul> <For each={users()}>{(user) => <li>{user.name}</li>}</For> </ul> </div> ); };
内容的提问来源于stack exchange,提问作者Dmitry Lavrov
相关产品推荐
相关产品推荐

