gpt4 book ai didi

graphql - 是否可以防止在组件状态更改/重新渲染时重新获取 `useLazyQuery` 查询?

转载 作者:行者123 更新时间:2023-12-04 11:09:28 25 4
gpt4 key购买 nike

目前我有一个 useLazyQuery按下按钮时触发的钩子(Hook)(搜索表单的一部分)。

钩子(Hook)行为正常,只有在按下按钮时才会触发。但是,一旦我触发它一次,它就会在每次组件重新呈现时触发(通常是由于状态更改)。

因此,如果我搜索一次,然后编辑搜索字段,结果会立即出现,而且我不必再次单击搜索按钮。

不是我想要的用户界面,如果您完全删除搜索文本(因为它试图使用 null 作为变量进行搜索),它会导致错误,有什么办法可以防止 useLazyQuery从重新渲染时重新获取?

这可以使用 useQuery 解决。依赖于“搜索”状态,当我单击按钮时该状态会被切换。但是我更愿意看看我是否可以避免增加组件的复杂性。

const AddCardSidebar = props => {
const [searching, toggleSearching] = useState(false);
const [searchParams, setSearchParams] = useState({
name: ''
});
const [searchResults, setSearchResults] = useState([]);
const [selectedCard, setSelectedCard] = useState();

const [searchCardsQuery, searchCardsQueryResponse] = useLazyQuery(SEARCH_CARDS, {
variables: { searchParams },
onCompleted() {
setSearchResults(searchCardsQueryResponse.data.searchCards.cards);
}
});

...

return (
<div>
<h1>AddCardSidebar</h1>
<div>
{searchResults.length !== 0 &&
searchResults.map(result => {
return (
<img
key={result.scryfall_id}
src={result.image_uris.small}
alt={result.name}
onClick={() => setSelectedCard(result.scryfall_id)}
/>
);
})}
</div>
<form>

...

<button type='button' onClick={() => searchCardsQuery()}>
Search
</button>
</form>

...

</div>
);
};

最佳答案

您不必使用 async与阿波罗客户端(你可以,它的工作原理)。但是如果你想使用 useLazyQuery你只需要在 onClick 上传递变量而不是直接在 useLazyQuery 调用上。

对于上面的例子,解决方案是:

function DelayedQuery() {
const [dog, setDog] = useState(null);
const [getDogPhoto] = useLazyQuery(GET_DOG_PHOTO, {
onCompleted: data => setDog(data.dog)
})

return (
<div>
{dog && <img src={dog.displayImage} />}
<button
onClick={() => getDogPhoto({ variables: { breed: 'bulldog' }})}
>
Click me!
</button>
</div>
);
}

关于graphql - 是否可以防止在组件状态更改/重新渲染时重新获取 `useLazyQuery` 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57499553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com