【问题标题】:Passing an object Id by submit button in order to find and change value in array after submiting (react)通过提交按钮传递对象 ID,以便在提交后查找和更改数组中的值(反应)
【发布时间】:2022-01-11 04:57:05
【问题描述】:

我想在从选择按钮中选择新日期后更新嵌套在数组中的对象的值,然后提交它以更改它。

按钮(选择)嵌套在来自材料 ui 的 Accordion 中呈现的数组对象发票中,并且应该更改日期(现在仅一年)并在比较其 ID 号时保存它。

我有两个组件:sideBar 和 simpleForm

const SideBar = ({ className }) => {
  const [invoices, setInvoice] = useState([
    { label: 'Test', invoiceDate: '2021', id: 0 },
    { label: 'Test', invoiceDate: '2022', id: 1 },
    { label: 'Test', invoiceDate: '', id: 2 },
  ])


  const addInvoiceDate = (date, invoice) => {
    setInvoice(
      invoices.map((x) => {
        if (x.id === invoice.id)
          return {
            ...x,
            invoiceDate: date,
          }
        return x
      })
    )
  }

  return (
    <>
      <Wrapper>
        <S.MainComponent>
          <div>
            {invoices.map((invoice) => {
              return (
                <Accordion>
                  <AccordionSummary expandIcon={<ExpandMoreIcon />}>
                    <div key={invoice.id}>
                      {invoice.label}
                      {invoice.invoiceDate}
                    </div>
                  </AccordionSummary>
                  <AccordionDetails>
                    <SimpleForm addInvoiceDate={addInvoiceDate} />
                  </AccordionDetails>
                </Accordion>
              )
            })}
          </div>
        </S.MainComponent>
      </Wrapper>
    </>
  )
}

简单形式:

const SimpleForm = ({ addInvoiceDate }) => {
  const [date, setDate] = useState('')
  const handleSubmit = (e) => {
    e.preventDefault()
    addInvoiceDate(date)
  }

  function range(start, end) {
    return Array(end - start + 1)
      .fill()
      .map((_, placeholder) => start + placeholder)
  }

  const Years = range(2021, 4000)
  const Options = []
  Years.forEach(function (element) {
    Options.push({ label: element, value: element })
  })

  return (
    <form onSubmit={handleSubmit}>
      <select value={date} required onChange={(e) => setDate(e.target.value)}>
        {Options.map((option) => (
          <option value={option.value}>{option.label}</option>
        ))}
      </select>
      <input type='submit' value='Save' />
    </form>
  )
}

我的问题是,我不知道如何成功地将数组对象的 id 号传递给 addInvoiceDate(更改发票日期),以便在原始数组中找到它,比较它然后提交新值。我正在测试添加一个具有新年份值的新对象并且它有效,但在这种情况下,我不必找到对象的 id。如果我想真正找到前一个并通过比较 id 来更新它,那就有点困难了。

任何想法应该如何做?可能我忽略了一些东西或者还没有足够的经验:)

【问题讨论】:

    标签: javascript arrays reactjs object submit-button


    【解决方案1】:

    这个怎么样

    1. &lt;SimpleForm addInvoiceDate={(date) =&gt; addInvoiceDate(date, invoice)} date={invoice.invoiceDate}/&gt; 在 SideBar 的回归
    2. 从 SimpleForm 中移除状态,因为我们现在有一个 date 属性来代替
    3. &lt;select value={date} required onChange={(e) =&gt; addInvoiceDate(e.target.value)}&gt; 在 SimpleForm 的返回中

    有问题请留言

    【讨论】:

    • 嘿 Nikita,非常感谢,它现在可以工作了,但是必须不理会 SimpleForm 中的状态;)所以实际上,您的第 1 点和第 3 点是有效的,但不是 2 。从 SimpleForm 中删除状态将导致“日期未定义”错误。为了在提交后更新数组中的对象,它必须保持独立。不过,您的解决方案是正确的。谢谢。
    • @PH 嗯,你是对的。如果我们摆脱提交按钮并在选择更改时自动提交,它就可以工作。你可以看看我的沙盒codesandbox.io/s/affectionate-antonelli-j6tqb?file=/src/…
    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 2014-05-03
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多