You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React循环动态给组件传递props时展开为索引对象如何解决

问题原因

当前写法的核心错误:Object.keys(component.props).map(...)返回的是单属性对象构成的数组,对数组做展开时,JS会将数组数字索引作为键、索引对应元素作为值,最终传入组件的props就会出现0、1、2为键的嵌套结构,和预期的平级结构不符。
逻辑等价验证:

// 你当前写法的展开效果和这段代码完全一致
const props = { ...[{prop1: "prop1"}, {prop2: "prop2"}, {prop3: "prop3"}] }
// props输出:{0: {prop1: "prop1"}, 1: {prop2: "prop2"}, 2: {prop3: "prop3"}}
修正方案

核心思路:先构造平级的普通props对象,再将对象展开传入组件,禁止直接展开map生成的对象数组。

方案1:Object.fromEntries 写法(最简洁,现代环境推荐)

将map遍历的返回值改为[属性名, 属性值]格式的键值对数组,再通过Object.fromEntries转为平级对象即可。代码里给component.props加了空对象兜底,避免props为空时Object.keys抛出报错:

{array?.[i] && (
  <Component
    {...Object.fromEntries(
      Object.keys(component.props ?? {}).map(prop => [prop, array[i][prop]])
    )}
  />
)}

该API为ES2019标准,支持所有现代浏览器,无需额外依赖。

方案2:reduce 写法(兼容性最佳)

通过reduce遍历属性键,直接在初始空对象上挂载对应属性,最终返回完整的平级props对象,兼容ES5及以上环境:

{array?.[i] && (
  <Component
    {...Object.keys(component.props ?? {}).reduce((res, prop) => {
      res[prop] = array[i][prop]
      return res
    }, {})}
  />
)}

场景简化写法

如果不需要过滤多余属性,array[i]上的所有属性都需要传给组件,可以直接展开数组项,无需手动遍历属性键:

{array?.[i] && <Component {...array[i]} />}

内容的提问来源于stack exchange,提问作者4rmr3d1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:00:53