Javascript 在React+;中使用useLazyQuery时的无限循环;阿波罗/GraphQL?

Javascript 在React+;中使用useLazyQuery时的无限循环;阿波罗/GraphQL?,javascript,reactjs,react-hooks,apollo,Javascript,Reactjs,React Hooks,Apollo,到目前为止,我的代码如下所示: const { ID } = useParams(); const [getObjects, {loading, data}] = useLazyQuery(GET_OBJECTS_BY_ID); const objectWithID = props.data.find(datum => datum._id == ID); if (objectWithID.conditional) { getObjects({variables: {objectI

到目前为止,我的代码如下所示:

const { ID } = useParams();
const [getObjects, {loading, data}] = useLazyQuery(GET_OBJECTS_BY_ID);

const objectWithID = props.data.find(datum => datum._id == ID);
if (objectWithID.conditional) {
    getObjects({variables: {objectIds: objectWithID.subObjects}});
    //Do a bunch of other stuff including a separate render
}
else {...}

我所做的基本工作是首先查找具有指定
ID
的对象,然后查询其子对象。我想在查询之前首先找到
objectWithID
变量,然后根据它的一个参数,有条件地使用它的值,因此我认为
useLazyQuery
有助于实现这一点。然而,这导致了一个无限循环:出于某种原因,它被无限次地调用,使我的网页崩溃。我是否错误地使用了
useLazyQuery
?如何防止这种无限循环?

在这种情况下,您正在render方法内部执行查询,这意味着它将继续触发。取而代之的是,考虑使用<代码>使用效果< /代码>钩子:< /p>
const { ID } = useParams();
const [getObjects, { loading, data }] = useLazyQuery(GET_OBJECTS_BY_ID);

const objectWithID = useMemo(() => {
  return props.data.find((datum) => datum._id == ID);
}, [props.data, ID]);

useEffect(() => {
  if (objectWithID.conditional) {
    getObjects({ variables: { objectIds: objectWithID.subObjects } });
  }
}, [getObjects, objectWithID]);

return objectWithID.conditional ? (
  <>Render one thing</>
) : (
  <>Render the other thing</>
);
const{ID}=useParams();
const[getObjects,{loading,data}]=useLazyQuery(通过\u ID获取\u对象);
const objectWithID=useMoom(()=>{
返回props.data.find((datum)=>datum.\u id==id);
},[props.data,ID]);
useffect(()=>{
if(objectWithID.conditional){
getObjects({变量:{ObjectId:objectWithID.SubObject}});
}
},[getObjects,objectWithID]);
是否返回ID为的objectWithID.conditional?(
呈现一件事
) : (
渲染另一个东西
);

请注意,我还加入了一个
useMoom
钩子来记忆
objectWithID
值,因此它只在
props.data
ID
更改时才会更改。

如果ID已经存在,您可以直接使用useQuery(在您的情况下无需使用useLazy query),我认为,但是,根据objectWithID上的条件,我呈现了一些不同的内容,因此条件会导致错误。我的错误是,我忘了包含一些重要的内容,在您键入响应时我正在编辑这些内容。根据条件,我将定义完全不同的回调并呈现不同的内容,因此我不确定useEffect是否仍然可以用于此目的。您仍然可以在下方设置渲染键,使其关闭
objectWithID.conditional,但使用该效果来管理数据获取