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

点击Delete All按钮后数组数据删除需刷新页面才生效问题

问题:点击Delete All按钮后页面需刷新才显示数据已删除的解决办法

已将showPro()函数置于全局作用域,在deleteAll()中调用该函数,但点击Delete All按钮时,dataPro数组与localStorage中的数据实际已被删除,必须刷新页面才能看到页面更新效果,如何解决?

原代码

// read data
function showPro() {
    let table = "";
    for(let i = 0 ; i < dataPro.length ; i++){
        table += `
        <tr>
        <td>${i}</td>
        <td>${dataPro[i].title}</td>
        <td>${dataPro[i].price}</td>
        <td>${dataPro[i].taxes}</td>
        <td>${dataPro[i].ads}</td>
        <td>${dataPro[i].discount}</td>
        <td>${dataPro[i].total}</td>
        <td>${dataPro[i].category}</td>
        <td><button id="update">update</button></td>
        <td><button onclick ="deleteData(${i})" id="delete">delete</button></td>
        </tr>
        `
        document.getElementById('tbody').innerHTML = table;
    }
    let btnDelete = document.getElementById('deleteAll')
    if(dataPro.length > 0){
        btnDelete.innerHTML = `
        <button onclick="deleteAll()">Delete All</button>
        `
    }else{
        btnDelete.innerHTML = ""
    }
}
showPro()

// delete data 
function deleteData(i) {
    dataPro.splice(i,1);
    localStorage.product = JSON.stringify(dataPro);
    showPro();
}
function deleteAll(){
    localStorage.clear()
    dataPro.splice(0)
    showPro()           //  CHECK !!! it doesn't delete until you reload
}

解决方法

问题出在两个地方,分别修正即可:

1. 修正showPro()的DOM更新逻辑

原代码中document.getElementById('tbody').innerHTML = table;放在了for循环内部,当dataPro数组为空时,循环根本不会执行,这行代码也就不会运行,导致tbody保留旧数据。把这行代码移到循环外部,不管数组有没有数据,都能强制更新tbody内容:

function showPro() {
    let table = "";
    for(let i = 0 ; i < dataPro.length ; i++){
        table += `
        <tr>
        <td>${i}</td>
        <td>${dataPro[i].title}</td>
        <td>${dataPro[i].price}</td>
        <td>${dataPro[i].taxes}</td>
        <td>${dataPro[i].ads}</td>
        <td>${dataPro[i].discount}</td>
        <td>${dataPro[i].total}</td>
        <td>${dataPro[i].category}</td>
        <td><button id="update">update</button></td>
        <td><button onclick ="deleteData(${i})" id="delete">delete</button></td>
        </tr>
        `
    }
    // 将DOM更新移到循环外部
    document.getElementById('tbody').innerHTML = table;
    let btnDelete = document.getElementById('deleteAll')
    if(dataPro.length > 0){
        btnDelete.innerHTML = `
        <button onclick="deleteAll()">Delete All</button>
        `
    }else{
        btnDelete.innerHTML = ""
    }
}

2. 修正deleteAll()的数组清空逻辑

dataPro.splice(0)不会清空数组(splice第二个参数默认是0,即不删除任何元素),改为直接赋值空数组,同时同步更新localStorage(如果不需要清空整个localStorage,只更新product键更稳妥):

function deleteAll(){
    // 直接清空数组
    dataPro = [];
    // 同步更新localStorage的product数据
    localStorage.setItem('product', JSON.stringify(dataPro));
    // 如果确实需要清空整个localStorage,保留下面这行,否则可以删除
    // localStorage.clear();
    showPro();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:06:40