【发布时间】:2019-12-21 07:08:48
【问题描述】:
目前我有一个useLazyQuery 钩子,它在按下按钮时触发(搜索表单的一部分)。
钩子行为正常,仅在按下按钮时触发。但是,一旦我触发了它一次,它就会在每次组件重新渲染时触发(通常是由于状态更改)。
因此,如果我搜索一次,然后编辑搜索字段,结果会立即出现,我不必再次单击搜索按钮。
不是我想要的 UI,如果您完全删除搜索文本(因为它试图使用 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>
);
};
【问题讨论】:
-
即使我遇到了这个问题。我要做的是在组件安装期间使用LazyQuery
useEffect(() => refetchFunction(), [])但是每当我的状态发生变化时,都会再次调用refetchFunction(内部某个地方)
标签: graphql apollo react-hooks react-apollo apollo-client