Apollo useLazyQuery 反复调用

Posted

技术标签:

【中文标题】Apollo useLazyQuery 反复调用【英文标题】:Apollo useLazyQuery repeatedly called 【发布时间】:2020-05-31 23:42:29 【问题描述】:

我正在尝试构建一个可用于对表进行任何 CRUD 操作的表单。对于更新操作,我想将变量与路由一起传递。所有这些都工作正常,但是当我使用惰性查询调用查询时,它对前几次调用什么都不做,然后在第三次调用时返回数据。这正常吗?我是否调用了错误的查询?有没有办法等待查询返回数据?

import React,  useState, useEffect  from "react";
import Router,  useRouter  from "next/router";

import Container from "react-bootstrap/Container";

import  useLazyQuery  from "@apollo/react-hooks";
import  GET_PLATFORM  from "../graphql/platforms";

export default function platformsForm(props) 
  const router = useRouter();

  // grab the action requested by caller and the item to be updated (if applicable)
  const [formAction, setFormAction] = useState(router.query.action);
  const [formUpdateId, setFormUpdateId] = useState(router.query.id);

  const [
    getPlatformQuery,
     loading, error, data: dataGet, refetch, called 
  ] = useLazyQuery(GET_PLATFORM, 
    variables:  id: formUpdateId 
  );

  useEffect(() => 
    console.log("update");
    // var dataReturned = getPlatformLookup(formUpdateId);

    !called && getPlatformQuery( variables:  id: formUpdateId  );
    if (dataGet && dataGet.Platform.platformName) 
      console.log(
        dataGet.Platform.platformName,
        dataGet.Platform.platformCategory
      );
    
  ),
    [];

  return (
    <Container>
      <h4>
        Name: dataGet && dataGet.Platform.platformName
        <br />
        Cat: dataGet && dataGet.Platform.platformCategory
        <br />
        formAction: formAction
        <br />
        formUpdateId: formUpdateId
        <br />
      </h4>
    </Container>
  );

【问题讨论】:

【参考方案1】:

要调用 useLazyQuery,您需要使用 useEffect 并传递空数组 [],这样您就可以只调用一次查询,这在您的代码中已经完成(您的 useEffect 中有语法错误,)失踪)。 此外,您不能在 useEffect 回调内部使用从 lazyQuery 返回的数据 (dataGet)。

你应该这样做:

// this useEffect hook will call your lazy query exactly once
useEffect(() => 
    getPlatformQuery( variables:  id: formUpdateId  );

  , []);

// you can fetch your data here (outside of the useEffect Hook)
if (dataGet && dataGet.Platform.platformName) 
      console.log(
        dataGet.Platform.platformName,
        dataGet.Platform.platformCategory
      );
 
return(<Container>
      <h4>
        Name: dataGet && dataGet.Platform.platformName
        <br />
        Cat: dataGet && dataGet.Platform.platformCategory
        <br />
        formAction: formAction
        <br />
        formUpdateId: formUpdateId
        <br />
      </h4>
    </Container>);

【讨论】:

以上是关于Apollo useLazyQuery 反复调用的主要内容,如果未能解决你的问题,请参考以下文章

apollo useLazyQuery 绕过缓存

获取更多功能未定义用于 useLazyQuery react-apollo 钩子

[React + GraphQL] Use useLazyQuery to manually execute a query with Apollo React Hooks

如何在 react-apollo 中等待多个 useLazyQuery

Apollo-client 有条件地同时运行 useLazyQuery 和 useQuery - 最好的方法是啥?

React 函数组件中的多个 useLazyQuery 钩子(Apollo 客户端)