Reactjs 阿波罗';s使用查询和更新父项';s道具及其结果

Reactjs 阿波罗';s使用查询和更新父项';s道具及其结果,reactjs,react-hooks,react-apollo,Reactjs,React Hooks,React Apollo,我有一个包装父组件,它接受一些布局相关的道具,还有一个子组件(表示页面),它需要通过Apollo运行GraphQL查询,并用结果更新父组件的道具(比如页面标题)。需要更新道具的父级不是我选择的模式,而是我必须使用的组件的实现 App=(){ const[layout,setLayout]=useState({}); 返回( ); } PageComponent=(道具)=>{ const{loading,error,data}=useQuery(QUERY);//阿波罗的useQuery use

我有一个包装父组件,它接受一些布局相关的道具,还有一个子组件(表示页面),它需要通过Apollo运行GraphQL查询,并用结果更新父组件的道具(比如页面标题)。需要更新道具的父级不是我选择的模式,而是我必须使用的组件的实现

App=(){
const[layout,setLayout]=useState({});
返回(
);
}
PageComponent=(道具)=>{
const{loading,error,data}=useQuery(QUERY);//阿波罗的useQuery
useffect(()=>{
props.setPageParams({title:data.lists[0].title});
},[数据];
如果(加载)返回加载;
if(error)返回error

; 返回( 组件

); }
我尝试了太多不同的方法将它们全部写在这里,但结果是两件事之一:useEffect中的循环(我有点理解,我认为将
数据
传递到
useffect
会导致它设置父对象的道具,并每次重新渲染子对象,因为它是一个对象,并且没有进行深入比较),或者以下情况:

Cannot update a component (`App`) while rendering a different component (`PageComponent`).
后者发生在尝试几种不使用
useffect
的方法时,例如:

if(data && data.lists && awaitingPageLayout) {
  props.setLayout({ title: data.lists[0].title });
  awaitingPageLayout = false;
}
我还尝试使用useQuery的
onCompleted
,我相信这会导致另一个循环


希望朝着正确的方向推进,我这里没有想法了。感谢你的时间!

你有什么理由不能在
应用程序中使用
useQuery
?@adamjelinski我可以,可以想象,但它会很难看。该组件代表一个页面,由React路由器
Route
呈现,我真的不想要当我的所有查询实际上只与页面组件有关时,将它们带到应用程序。你有什么理由不能在
应用程序中使用
useQuery
?@adamjelinski我可以,可以想象,但它会很难看。该组件代表一个页面,由React路由器
Route
呈现,我不会这么做真的想把我所有的查询都带到应用程序中,而它们实际上只和页面组件有关。