reactjs 从处于React使用状态的数组中接合对象

pqwbnv8z  于 2022-12-03  发布在  React
关注(0)|答案(2)|浏览(167)

我有一个包含项目列表的对象数组。这些项目是从动态窗体域更新的。下面是项目对象

{ product_id: { name: "", price: 0, hsn: "" }, quantity: 0, cgst_amount: 0, sgst_amount: 0, igst_amount: 0, total: 0 }Ï

当我想从动态表单中删除不需要的项时,我使用splice方法删除给定索引中的对象。这将从数组中删除正确的对象,但在UI部分,它将始终删除UI中显示的最后一项,而不是删除数组中已删除的对象。
这是我的项目数组

const [items, setItems] = useState(quotation.items ? quotation.items : []);

这是表格

<div className="items-container mt-2">
          {items?.map((item, index) => (<div className="items">
            <div className="item-close">
              <div className="item-close-icon" onClick={() => closeItem(index)}>
                {items.length > 1 ? <Icon as={FaTimes} color="red.500" size="1.5em" /> : ""}
              </div>
            </div>
            <div className="card-field-two">
              <div className="card-field">
                <FormLabel htmlFor="item-name">Item</FormLabel>
                <Input placeholder="Item" defaultValue={item.product_id.name} disabled={!isEdit} />
              </div>
              <div className="card-field">
                <FormLabel htmlFor="item-quantity">Quantity</FormLabel>
                <Input placeholder="Quantity" defaultValue={item.quantity} disabled={!isEdit} />
              </div>
            </div>
            <div className="card-field-two">
              <div className="card-field">
                <FormLabel htmlFor="item-rate">Price</FormLabel>
                <Input placeholder="Price" defaultValue={item.product_id.price} disabled={true} />
              </div>
              <div className="card-field">
                <FormLabel htmlFor="hsn">HSN</FormLabel>
                <Input placeholder="HSN" defaultValue={item.product_id.hsn} disabled={!isEdit} />
              </div>
            </div>
            <div className="card-field-two">
              <div className="card-field">
                <FormLabel htmlFor="cgst">CGST</FormLabel>
                <Input placeholder="CGST" defaultValue={item.cgst_amount} disabled={true} />
              </div>
              <div className="card-field">
                <FormLabel htmlFor="sgst">SGST</FormLabel>
                <Input placeholder="SGST" defaultValue={item.sgst_amount} disabled={true} />
              </div>
            </div>
            <div className="card-field-two">
              <div className="card-field">
                <FormLabel htmlFor="igst">IGST</FormLabel>
                <Input placeholder="IGST" defaultValue={item.igst_amount} disabled={true} />
              </div>
              <div className="card-field">
                <FormLabel htmlFor="total">Total</FormLabel>
                <Input placeholder="Total" defaultValue={item.total_amount} disabled={true} />
              </div>
            </div>
          </div>))}
          <button className="add-item-btn orange-btn" disabled={!isEdit} onClick={() => setItems([...items, { product_id: { name: "", price: 0, hsn: "" }, quantity: 0, cgst_amount: 0, sgst_amount: 0, igst_amount: 0, total: 0 }])}>Add Item</button>
        </div>

下面是用于删除项目的close函数

const closeItem = (index) => {
  let itemsArray = [...items];
  itemsArray.splice(index, 1);
  let newArray = [...itemsArray]
  setItems(newArray);
}
dzjeubhm

dzjeubhm1#

当您没有手动提供数组元素的键时,默认情况下会使用索引作为键,如果数组元素重新排序,这可能会导致问题:
如果项目的顺序可能会改变,我们不建议使用索引键。这会对性能产生负面影响,并可能导致组件状态问题。请查看Robin Pokorny的文章,了解使用索引键的负面影响的详细解释。如果您选择不为列表项分配显式键,那么React将默认使用索引键。

qlvxas9a

qlvxas9a2#

我有这个问题,但我可以修复它.我使用somcode像这样:

setItems((items) => [...items, input].filter((item) => item.title != null));

您可以使用以下命令:

setItems((items) => [...items, newArray].filter(item => item.product_id != null));

或:

setItems((items) => [...items, newArray]);

希望这对程序员有帮助:)

相关问题