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

React中删除trainingData数组元素后DOM无法同步更新的问题解决

解决React中删除数组元素后DOM不更新的问题

我来帮你搞定这个问题!先看看你代码里导致DOM不更新的几个关键问题,再给你调整后的解决方案:

1. 直接修改原状态数组,React检测不到变化

你写的var json = trainingData;是把状态数组的引用赋值给了json,这时候修改json等同于直接修改原状态。React的状态更新依赖于引用变化——只有传入新的数组对象,React才会触发重新渲染。直接修改原数组的话,状态引用没改变,React会认为数据没变化,自然不会更新DOM。

2. 使用delete操作符处理数组,留下空位

delete json[key]这种方式并不会真正移除数组元素,只是把对应位置的值设为undefined(也就是你看到的null),数组的长度依然没变。map遍历时会依然遍历到这个空位,导致DOM里还是显示两条数据。

3. 用数组索引作为key

你在map里用key={i},当数组元素被删除后,后续元素的索引会发生变化,React会因为key的变化而复用错误的组件,也可能导致更新异常。正确的做法是用数据里唯一的标识作为key,比如trainingsid。


修正后的完整代码示例

下面是调整后的代码,同时补充了API调用的逻辑(假设你有后端接口用于删除数据):

import React, { useState, useEffect } from 'react'

function Training({}) {
  const [trainingData, setTrainingData] = useState([]);

  // 模拟从API获取数据的逻辑
  useEffect(() => {
    const fetchTrainingData = async () => {
      // 替换成你的实际API地址
      const res = await fetch('/api/trainings');
      const data = await res.json();
      setTrainingData(data);
    };
    fetchTrainingData();
  }, []);

  const deleteData = async (id) => {
    try {
      // 先调用后端接口删除数据库中的数据
      await fetch(`/api/trainings/${id}`, {
        method: 'DELETE',
        headers: { 'Content-Type': 'application/json' }
      });

      // 过滤出不需要删除的元素,生成全新数组
      const updatedTrainings = trainingData.filter(item => item.trainingsid !== id);
      // 更新状态,传入新数组触发重新渲染
      setTrainingData(updatedTrainings);
    } catch (err) {
      console.error('删除操作失败:', err);
      // 这里可以添加错误提示,比如弹窗告知用户
    }
  }

  return (
    <div>
      {trainingData.map((d) => (
        <div key={d.trainingsid} >
          {d.day} - {d.time1} bis {d.time2} Uhr
          <button className="button is-danger" onClick={() => deleteData(d.trainingsid)}>Delete</button>
          <br />
        </div>
      ))}
    </div>
  )
}

export default Training

关键改进点说明:

  • 用filter生成新数组:filter会返回一个全新的数组,自动排除要删除的元素,状态引用发生变化后,React会立即触发重新渲染。
  • 先调用API再更新状态:确保后端数据删除成功后再同步前端状态,避免出现前端和后端数据不一致的情况。
  • 用trainingsid作为key:每个训练项的trainingsid是唯一标识,React可以准确识别哪些元素被删除,正确更新DOM。

这样修改后,点击Delete按钮时,对应的元素会从数据库和前端状态中被正确移除,DOM也会同步更新啦!

内容的提问来源于stack exchange,提问作者Mr. Hankey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:47:27