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

React中点击提交按钮传递对象ID更新数组内嵌套对象值的实现问询

实现方案

核心问题是当前链路缺少「将当前操作的invoice ID传递给更新方法」的逻辑,按以下步骤修改即可完成需求:


步骤1:补全参数传递链路

有两种可选实现方式,任选其一即可:

方案A:给SimpleForm传递当前发票对象

首先修正SideBar中列表key的挂载位置(React要求循环渲染的最外层元素绑定key),同时新增props把当前循环到的invoice对象传给SimpleForm:

{invoices.map((invoice) => {
  return (
    // key绑定到循环返回的最外层元素
    <Accordion key={invoice.id}>
      <AccordionSummary expandIcon={<ExpandMoreIcon />}>
        <div>
          {invoice.label}
          {invoice.invoiceDate}
        </div>
      </AccordionSummary>
      <AccordionDetails>
        {/* 新增currentInvoice参数传递当前发票对象 */}
        <SimpleForm addInvoiceDate={addInvoiceDate} currentInvoice={invoice} />
      </AccordionDetails>
    </Accordion>
  )
})}

再修改SimpleForm的提交逻辑,调用更新方法时传入双参数:

// 新增接收currentInvoice参数
const SimpleForm = ({ addInvoiceDate, currentInvoice }) => {
  const [date, setDate] = useState('')
  const handleSubmit = (e) => {
    e.preventDefault()
    // 同时传递选中的年份和当前发票对象
    addInvoiceDate(date, currentInvoice)
    // 可选:提交后清空选择框
    setDate('')
  }
  // 剩余代码保持不变...
}

方案B:提前绑定参数(无需修改SimpleForm)

如果不想给SimpleForm加额外props,可在SideBar传递方法时直接绑定当前invoice参数,SimpleForm原有代码不用做任何调整:

<SimpleForm addInvoiceDate={(date) => addInvoiceDate(date, invoice)} />

可选优化:避免闭包异常

建议修改addInvoiceDate的状态更新为函数式写法,避免因闭包拿到旧的invoices数组导致更新错误:

const addInvoiceDate = (date, invoice) => {
  setInvoice(
    // 使用函数式更新拿到最新的数组快照
    prevInvoices => prevInvoices.map((x) => {
      if (x.id === invoice.id)
        return {
          ...x,
          invoiceDate: date,
        }
      return x
    })
  )
}

内容的提问来源于stack exchange,提问作者P H

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:36:08