如何显示来自 React-Query 的单个缓存数据?
How to display individual cache data from React-Query?
我的应用程序有一个用户输入 query
,然后获取 response data
,也是 cached
。
对于每个 cache data
,我想为每个 previous query
显示一个按钮,用户可以单击该按钮以在屏幕上再次加载该数据。
假设我首先输入了 id 1
,然后 data
是 cached
并呈现。当我用 Object.values(cacheData.queriesMap)
记录我的 cached data
时,我收到 {["rickandmorty",0]: Query, ["rickandmorty","1"]: Query}
。我现在想遍历我的缓存数据并显示每个单独的查询。
// <Home />
const cachedCharacters = Object.values(cacheData.queriesMap).map(character => (
<button>{character.state.data.name}</button>
))
return (
<div>
{cachedCharacters}
</div>
)
但是,我收到了 TypeError: Cannot read property 'name' of undefined
。我怀疑这个错误的原因是因为第一个查询是 ["rickandmorty",0]
,一个应用程序在安装时获取的不存在的项目。
然后我将我的应用程序设置为在组件安装时禁用抓取。
// <Home/>
const { isLoading, error, data } = useQuery(
["rickandmorty", idQuery],
handleRickAndMortyFetch,
{
enabled: false || idQuery !== 0,
);
然而,应用程序仍然在安装时进行初始提取。如果我首先输入 id 1
,我会再次收到 {["rickandmorty",0]: Query, ["rickandmorty","1"]: Query}
.
如果 initial fetch
是阻止每个人 cache data
被渲染的原因,我如何 disable
如果 enabled: false
不工作,initial fetch
?如果阻止呈现每个单独的缓存数据是另一个问题,请提出解决方案。 https://codesandbox.io/s/rick-and-morty-render-cache-data-8dv6y
您的代码是正确的。您在开发工具中看到的初始查询并不一定意味着它正在获取。如果您查看 idQuery
0 的状态,则没有它的 data/error 被更新的计数。它只是处于空闲状态。
我建议您在映射之前先尝试过滤 cacheData.queriesMap
以确保您的角色有数据。您可以检查 state.data
或确保查询具有 state.status === 'success'
。或者最简单的方法可能是只显示哪些查询已经有数据。
const cachedCharacters = Object.values(
cacheData.queriesMap
).map((character, index) => (
<>
{character.state.data ? (
<button key={`${character.state.data.name}${index}`}>
{character.state.data.name}
</button>
) : null}
</>
));
我的应用程序有一个用户输入 query
,然后获取 response data
,也是 cached
。
对于每个 cache data
,我想为每个 previous query
显示一个按钮,用户可以单击该按钮以在屏幕上再次加载该数据。
假设我首先输入了 id 1
,然后 data
是 cached
并呈现。当我用 Object.values(cacheData.queriesMap)
记录我的 cached data
时,我收到 {["rickandmorty",0]: Query, ["rickandmorty","1"]: Query}
。我现在想遍历我的缓存数据并显示每个单独的查询。
// <Home />
const cachedCharacters = Object.values(cacheData.queriesMap).map(character => (
<button>{character.state.data.name}</button>
))
return (
<div>
{cachedCharacters}
</div>
)
但是,我收到了 TypeError: Cannot read property 'name' of undefined
。我怀疑这个错误的原因是因为第一个查询是 ["rickandmorty",0]
,一个应用程序在安装时获取的不存在的项目。
然后我将我的应用程序设置为在组件安装时禁用抓取。
// <Home/>
const { isLoading, error, data } = useQuery(
["rickandmorty", idQuery],
handleRickAndMortyFetch,
{
enabled: false || idQuery !== 0,
);
然而,应用程序仍然在安装时进行初始提取。如果我首先输入 id 1
,我会再次收到 {["rickandmorty",0]: Query, ["rickandmorty","1"]: Query}
.
如果 initial fetch
是阻止每个人 cache data
被渲染的原因,我如何 disable
如果 enabled: false
不工作,initial fetch
?如果阻止呈现每个单独的缓存数据是另一个问题,请提出解决方案。 https://codesandbox.io/s/rick-and-morty-render-cache-data-8dv6y
您的代码是正确的。您在开发工具中看到的初始查询并不一定意味着它正在获取。如果您查看 idQuery
0 的状态,则没有它的 data/error 被更新的计数。它只是处于空闲状态。
我建议您在映射之前先尝试过滤 cacheData.queriesMap
以确保您的角色有数据。您可以检查 state.data
或确保查询具有 state.status === 'success'
。或者最简单的方法可能是只显示哪些查询已经有数据。
const cachedCharacters = Object.values(
cacheData.queriesMap
).map((character, index) => (
<>
{character.state.data ? (
<button key={`${character.state.data.name}${index}`}>
{character.state.data.name}
</button>
) : null}
</>
));