javascript - 如何在映射的promise中一一修改useState数组

标签 javascript reactjs react-hooks es6-promise

我有 const [items, setItems] = useState<any[]>(itemsB.map(() => ({ loading: true })));

itemsB.map(async (itemB: any, index: number) => {
    searchItems(itemB).then(result => {
        const newItems = [...items]; // Ref A
        newItems[index] = result;
        setItems(newItems);
    })
})

因为内部函数是异步获取,所以项目以不可预测的顺序返回,我想将它们添加到 items一旦准备好,就用实际结果更改占位符加载对象。这几乎做到了这一点,但是 items引用 A 中引用的内容不会更新,因此它会循环更改每个内容,最后仅显示已检索的最后一个项目。

如果我做 Promise.all().then() ,它会等到检索到所有项目后才执行 then部分,所以我想知道如何在解决项目时设置它们。

最佳答案

对 setItems 的调用会进行批处理以优化性能。如果前一个状态依赖于当前状态,请使用 setItems 的重载版本,它将 previousState 作为第一个参数。

searchItems(itemB).then(result => {
        setItems(items => {
                  const newItems = [...items]; // Ref A
                  newItems[index] = result;
                  return newItems;
        });
})

关于javascript - 如何在映射的promise中一一修改useState数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59598098/

相关文章:

javascript - 输入类型按钮在按下时会改变颜色?

javascript - 如何使用 html javascript jquery 自动显示包含图像的文件夹?

javascript - React-Native 的本地 require() 路径

javascript - 使用 .on ('click' 和 .click 有什么区别?

javascript - 在单个 React 元素上使用多个引用

reactjs - Material UI v5 -> 如何设置自动完成选项的样式

javascript - MobX 存储在 React Native 中未更新

reactjs - 取消订阅 rxjs 中的计时器

javascript - React 从 API 获取数据给出错误 Cannot read property of undefined

javascript - 使用 Context API 在函数组件中未定义 React 状态属性