首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用子组件中的异步请求更新父组件状态

使用子组件中的异步请求更新父组件状态
EN

Stack Overflow用户
提问于 2020-05-24 05:23:52
回答 1查看 149关注 0票数 1

我正在使用React hooks + Apollo hooks来延迟加载一系列组件。这些组件在每次挂载时都会进行查询。我希望这些组件的父组件跟踪每次异步调用与数据解析的时间。

我有一个工作示例,它将父状态传递给它的子状态,并在回调中进行更新。然而,我见过这样的例子,子进程试图在父进程有时间更新之前更新父进程的状态。这会导致状态更新过多,或者更新不足。

下面是我目前正在做的一个例子:

代码语言:javascript
复制
const Parent = () => {
  const [state, setState] = useState();

  const handleChange = () => {
    setState(state + 1); 
  }

  if (state < 10) {
    return <div>no more results</div>;
  }

  // it's possilbe that 5-6 mount at once and fire off queries
  return (
    <>
      {arr.map(c => <Child handleChange={handleChange} />)}
    </>
  )
}

const Child = ({ handleChange }) => {
  const [ loadMore, { called, loading, data }] = useLazyQuery(QUERY, {
    onCompleted: (data) => {
      if (data.length > 0) {
        handleChange() 
      }
    }
  });

  // When a user scrolls into view, make request
  return (
    <Waypoint onEnter={loadMore}>
      {do something with data}
    </Waypoint>
  )
};

当父进程的子进程进行异步调用时,有没有更好的方法来管理父进程的状态?而不引入Redux?

EN

回答 1

Stack Overflow用户

发布于 2020-05-24 05:30:41

这可能是一个解决方案。

代码语言:javascript
复制
const Parent = () => {
  const [state, setState] = useState(0);

  const handleChange = (idx) => {
    setState(idx); 
  }

  if (state < arr.length) {
    return <div>no more results</div>;
  }

  return (
    <>
      {arr.map((c, idx) => <Child handleChange={handleChange} key={idx} id={idx}/>)}
    </>
  )
}

const Child = ({ handleChange, id }) => {
  const [ loadMore, { called, loading, data }] = useLazyQuery(QUERY, {
    onCompleted: (data) => {
      if (data.length > 0) {
        handleChange(id) 
      }
    }
  });

  // When a user scrolls into view, make request
  return (
    <Waypoint onEnter={loadMore}>
      {do something with data}
    </Waypoint>
  )
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61978741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档