【问题标题】:How do I asynchronously update a variable from a paginated API using React hooks?如何使用 React 钩子从分页 API 异步更新变量?
【发布时间】:2022-06-17 00:57:22
【问题描述】:

我目前正在尝试从 API 获取对象的所有属性,并将它们显示在表格中。 API 一次最多返回 10 个结果,如果要获取更多结果,将在响应正文中返回值 nextPageToken。我的目标是获取前 10 个结果,立即将它们显示在表格中,并在我继续访问 API 时添加到表格中。这是我第一次尝试解决方案:

const getProperties = async (id) => {
  const properties = await Api.getProperties(id);
  setProperties(properties.properties);
  if (properties.nextPageToken) loadMoreProperties(id, nextPageToken);
};

const loadMoreProperties = async (id, nextPageToken) => {
  const properties = await Api.getProperties(id, nextPageToken);
  setProperties(prevProperties => {return [...prevProperties, properties.properties]});
  if (properties.nextPageToken) loadMoreProperties(id, properties.nextPageToken);
};

(请注意,以上是简化;实际上,getProperties 中有更多逻辑不需要在后续调用 API 时重复)

我在使用此解决方案时遇到的问题是,当我调用 loadMoreProperties 时,setProperties 调用尚未完成。我如何才能强制调用 loadMoreProperties 仅在设置前一组属性后发生?有没有更好的整体模式可以用来解决这个问题?

【问题讨论】:

    标签: reactjs react-hooks pagination


    【解决方案1】:

    我认为您应该将回调参数传递给您的“setProperties”方法,以便在值更新后进行第二次调用,如下所示:

     setProperties(properties.properties, () => {
        if (properties.nextPageToken)
            loadMoreProperties(id, nextPageToken);
    );
    

    希望对你有帮助

    【讨论】:

    • 很抱歉这里的延迟 - 在许多不同的项目之间反弹。这有助于解决这个问题,但是这会带来的问题是在加载所有属性之前不会设置 setProperties。我真正想做的是每次加载更多时设置属性,以便用户可以在加载其余属性时开始与表格交互
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多