reactjs - Apollo useLazyQuery 钩子在重新获取时使用旧变量(而不是新变量)
问题描述
我的数据库存储项目列表。我编写了一个查询,每次单击按钮时从列表中随机返回一个项目。我使用 useLazyQuery 并调用返回的函数来执行查询,它工作正常。我可以在随后的按钮按下时调用 refetch 函数,它会正确返回另一个随机项目。
当我尝试将变量传递给查询时,问题就来了。我想为查询提供不同的标准以定制随机选择的方式。我传递给第一次调用的任何变量都会在每次重新获取时重复,即使它们已经改变。我可以追踪它们在客户端上是不同的,但解析器会追踪以前的变量。
// My query
const PICK = gql`
query Pick($options: PickOptionsInput) {
pick(options: $options) {
title
}
}
`;
// My lazy hook
const [pick, { data, refetch }] = useLazyQuery(PICK, {
fetchPolicy: "no-cache",
});
// My button
<MyButton
onPick={(options) =>
(refetch || pick)({ // Refetch unless this is the first click, then pick
variables: {
options // Options is a custom object of data used to control the pick
},
})
}
/>
我尝试过的一些事情:
- 各种缓存策略
- 不使用对象作为选项并将每个可能的选项定义为不同的变量
我真的很难过。似乎文档说如果在重新获取时提供了新变量,则应该使用它们。我不认为缓存策略是相关的......每次调用我都会得到新的结果,只是输入变量是陈旧的。
解决方案
我猜只有pick
被称为...
...因为<MyBytton/>
没有道具更改,没有onPick
重新定义 - 始终使用的第一个处理程序定义(从第一次渲染开始)和同时options
的状态......
尝试将所有 ( options
,pick
和refetch
) 作为直接道具传递以强制重新渲染和处理程序重新定义:
<MyButton
options={options}
pick={pick}
refetch={refetch}
onPick={(options) =>
(refetch || pick)({ // Refetch unless this is the first click, then pick
variables: {
options // Options is a custom object of data used to control the pick
},
})
}
/>
...或[更好]在将处理程序传递给之前定义处理程序<MyButton/>
:
const pickHandler = useCallback(
(options) => {
if(refetch) {
console.log('refetch', options);
refetch( { variables: { options }});
} else {
console.log('pick', options);
pick( { variables: { options }});
}
},
[options, pick, refetch]
);
<MyButton onPick={pickHandler} />
推荐阅读
- javascript - 如何从此 NodeList 中提取数据?
- csv - Racket:在函数中使用“csv-reading”包
- docker - docker 限制容器网络访问
- javascript - 角度/形式整数验证器
- python - 保存功能在 python 3.8.5 中没有弹出窗口,也没有显示任何错误,这是什么问题?
- ruby-on-rails - Rails:如果 Json 中有不同的属性,如何在 csv 文件中添加数据头?
- swift - CoreML 自动将 int 转换为浮点数
- business-objects - 促销管理 - 错误 - 无法检索根 LCM 文件夹
- python - 一旦我得到超过特定条件限制的项目,如何停止列表理解
- flutter - 如何将 CSS BoxShadow 转换为 Flutter BoxShadow?