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

React状态部分丢失:可编辑表格数据提交异常问题

问题根源分析

你遇到的核心问题是新增行的数据在序列化时丢失——因为你创建行数据时用了new Array(),然后给数组添加自定义属性(比如id、date),但JSON序列化数组时只会处理索引对应的元素,不会保留这些自定义属性。所以后端收到的是没有有效字段的空数据结构,自然看不到新增行的内容。

另外代码里还有几处小bug会导致数据异常,下面一步步帮你解决:

1. 把行数据从数组改为对象

不管是addrow还是componentDidMount里的空行初始化,都要把new Array()改成{}(普通对象),因为行数据是键值对结构,不是数组:

修改addrow方法:

addrow = () => {
  var objToday = new Date(),
      curMonth = objToday.getMonth(),
      curYear = objToday.getFullYear(),
      curDay = objToday.getDate().toString().padStart(2, '0');
  // 构造标准日期格式,去掉不必要的后缀(后端一般不需要st/nd/th)
  var today = `${curYear}-${curMonth + 1}-${curDay}`;
  
  // 用对象替代数组存储行数据
  var newrow = {
    id: 0,
    date: today,
    location_lat: 0,
    location_lon: 0,
    value: 0
  };
  var updateData = update(this.state.data, {$push: [newrow]});
  this.setState({data: updateData});
}

修改componentDidMount中的空行初始化:

// 原错误写法:
// var newrow = new Array();
// newrow.id = 0;
// ...
// this.setState({data:newrow})

// 修改为:
var newrow = [{
  id: 0,
  date: "",
  location_lat: "",
  location_lon: "",
  value: ""
}];
this.setState({data: newrow})

这里要注意:data始终应该是对象组成的数组,不能直接把单个对象赋值给data,否则react-table渲染会出错。

2. 修复日期计算的变量提前引用问题

你原来的代码里在定义today之前就用它计算dayOfMonth,这会导致today是undefined,日期字符串异常。上面的addrow修改已经去掉了无效的后缀逻辑,直接构造后端常用的YYYY-MM-DD格式日期。

3. 优化行编辑的state更新逻辑

当前renderEditable里的state更新写法没问题,但可以改成依赖prevState的形式,避免异步更新可能导致的数据不一致:

onBlur={e => {
  this.setState(prevState => ({
    data: prevState.data.map((row, idx) => {
      if (idx === cellInfo.index) {
        return {...row, [cellInfo.column.id]: e.target.innerHTML};
      }
      return row;
    })
  }));
}}

4. 确认save方法的正确性

你的saveDataMeasurements方法本身没有问题,修改完行数据的创建方式后,JSON序列化就能正确包含所有字段,后端就能收到新增行的数据了。

总结

核心问题是用数组存储行数据导致自定义属性无法被JSON序列化,改为对象后就能解决。同时修复日期计算和state初始化的小bug,确保整个数据流程的一致性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:33:32