我正在做一个口袋妖怪团队建设者,并试图使用React查询,因为我试图使用该高速缓存功能,而不是作出这么多的请求,以开放和公共PokeAPI。
我有一个下拉菜单,允许用户选择一个口袋妖怪的名字。当一个口袋妖怪被选中,我希望'移动'下拉菜单填充一个列表,口袋妖怪移动选择。
我最初的方法是使用一个依赖于口袋妖怪敏捷度的useEffect钩子。
useEffect(() => {
if (pokeDexNum) {
// fetch `https://pokeapi.co/api/v2/pokemon/${pokeDexNum}`
}
}, [pokeDexNum])
我不知道如何在React-Query中使用它。我想做的是当用户选择一个口袋妖怪时,PokeAPI会获取口袋妖怪可用的移动,并将它们放入“移动”下拉列表的options
中,这样他们就可以选择移动。
从下面的代码中,您可以看到当从“Pokemon”下拉列表中选择一个Pokemon时,它会更新const [pokeDexNum, setPokeDexNum] = useState(null);
状态
<Form>
<Form.Group>
<Form.Dropdown
label="Pokemon"
search
selection
clearable
selectOnBlur={false}
value={pokeDexNum}
onChange={(e, data) => setPokeDexNum(data.value)}
options={[
{ text: "Tepig", value: 498 },
{ text: "Oshawott", value: 501 },
{ text: "Snivy", value: 495 },
]}
/>
<Form.Dropdown label="Moves" search selection options={[]} />
</Form.Group>
</Form>
我如何能够根据pokeDexNum
是否更新来使用react query进行提取
查询示例
const { isLoading, error, data } = useQuery('getPokeMoves', () =>
fetch(`https://pokeapi.co/api/v2/pokemon/${pokeDexNum}`).then(res =>
res.json()
)
)
即使pokeDexNum
是null
,上面的查询有时也会获取。
2条答案
按热度按时间ybzsozfc1#
正如@Arjun的回答所述,您需要将
pokeDexNum
状态添加到queryKey
数组中,可以将其视为useEffect
的依赖项,任何时候pokeDexNum
更新/更改,都会触发该查询的重取。由于
pokeDexNum
的初始值是null
,您不希望在状态更新之前触发查询。为了避免这种情况,您可以在useQuery
中使用enabled
选项:另外,添加一些错误处理也是一个好主意,我想您是为了简洁而省略了这一点。
euoag5mw2#
解决方案:您需要将
pokeDexNum
添加到useQuery的queryKey
中。我的建议是,
定义一个函数来调用
useQuery
.添加你的pokeDexNum
到queryKey
.然后在组件中使用它,
只要您的状态发生变化,
queryKey
也将发生变化,并且将获取查询。