use*_*604 16 apollo graphql react-apollo apollo-client react-hooks
目前我有一个useLazyQuery
钩子,它在按下按钮时被触发(搜索表单的一部分)。
钩子行为正常,只有在按下按钮时才会触发。但是,一旦我触发它一次,它就会在每次组件重新渲染时触发(通常是由于状态更改)。
因此,如果我搜索一次,然后编辑搜索字段,结果会立即出现,而且我不必再次单击搜索按钮。
不是我想要的用户界面,如果您完全删除搜索文本(因为它试图将搜索文本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>
);
};
Run Code Online (Sandbox Code Playgroud)
Yan*_*avo 18
您不必async
与 apollo 客户端一起使用(您可以,它可以工作)。但是如果你想使用useLazyQuery
你只需要onClick
在 useLazyQuery 调用上而不是直接在 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>
);
}
Run Code Online (Sandbox Code Playgroud)
Dyl*_*all 17
该react-apollo
文档没有提到useLazyQuery
在变量更改时是否应该继续触发查询,但是useApolloClient
当您想要手动触发查询时,他们确实建议使用钩子。他们有一个与此用例匹配的示例(单击按钮会触发查询)。
function DelayedQuery() {
const [dog, setDog] = useState(null);
const client = useApolloClient();
return (
<div>
{dog && <img src={dog.displayImage} />}
<button
onClick={async () => {
const { data } = await client.query({
query: GET_DOG_PHOTO,
variables: { breed: 'bulldog' },
});
setDog(data.dog);
}}
>
Click me!
</button>
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12314 次 |
最近记录: |