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

为什么往空数组中新增元素后,表格会重复渲染历史条目?

问题原因

每次触发添加操作时,代码都会遍历全量订单数组,把所有历史订单重新生成行追加到表格末尾,而旧的已渲染行没有被清理,自然会出现条目重复的问题。

解决方法

这里提供两种可选方案:

方案1:每次渲染前清空表格(逻辑简单,适合数据量不大的场景)

只需要在遍历订单生成行之前,清空表格现有内容即可,修改后的JS代码如下:

const addMore = document.getElementById("pAdd");
const tForm = document.getElementById("t");
let table = document.getElementById("table")

let orders = []
addMore.addEventListener("click", function(e) {
  e.preventDefault()
  let order = {
    productName: document.getElementById("pName").value,
    productPrice: document.getElementById("pPrice").value,
    qty: document.getElementById("qty").value,
    total: document.getElementById("total").value,
  }
  orders.push(order)
  tForm.reset();

  // 新增这行,清空表格原有内容
  table.innerHTML = ''

  orders.forEach(allOrder => {
    let row = document.createElement("tr")
    Object.values(allOrder).forEach(text => {
      let cell = document.createElement("td")
      let texNode = document.createTextNode(text)
      cell.appendChild(texNode)
      row.appendChild(cell)
    })
    table.appendChild(row)
  })
})

function addNumber() {
  var x = document.getElementById("pPrice").value;
  var y = document.getElementById("qty").value;
  var z = document.getElementById("amount").value;
  var disc = document.getElementById("disc").value
  var discTotal = y * x * disc / 100;
  document.getElementById("total").value = (y * x) - z - discTotal;
}

方案2:仅渲染新增订单(性能更高,无需重复渲染历史数据)

不需要每次都遍历全量订单,直接给最新提交的这条订单生成行插入表格即可,修改后的JS代码如下:

const addMore = document.getElementById("pAdd");
const tForm = document.getElementById("t");
let table = document.getElementById("table")

let orders = []
addMore.addEventListener("click", function(e) {
  e.preventDefault()
  let order = {
    productName: document.getElementById("pName").value,
    productPrice: document.getElementById("pPrice").value,
    qty: document.getElementById("qty").value,
    total: document.getElementById("total").value,
  }
  orders.push(order)
  tForm.reset();

  // 只给最新的这条订单生成行
  let row = document.createElement("tr")
  Object.values(order).forEach(text => {
    let cell = document.createElement("td")
    let texNode = document.createTextNode(text)
    cell.appendChild(texNode)
    row.appendChild(cell)
  })
  table.appendChild(row)
})

function addNumber() {
  var x = document.getElementById("pPrice").value;
  var y = document.getElementById("qty").value;
  var z = document.getElementById("amount").value;
  var disc = document.getElementById("disc").value
  var discTotal = y * x * disc / 100;
  document.getElementById("total").value = (y * x) - z - discTotal;
}

两种方案都可以解决重复渲染的问题,可根据你的实际使用场景选择。


内容的提问来源于stack exchange,提问作者Romanch haque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:18:02