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

数据保存后更新触发数组非可写长度错误,求解决方案

问题解决思路

这个错误的核心原因是:从数据库返回的数据里,children数组的length属性被设置为不可写(比如数据被Object.freeze冻结,或者ORM框架返回了不可变的对象结构)。你之前的浅拷贝只复制了companies数组的第一层,但children还是引用原数组,直接调用splice修改时,因为原数组的length不能被修改,就触发了报错。

具体修复方案

方案1:修改删除逻辑,确保操作可写的新数组

把要修改的children数组先拷贝成一个新的可写数组,再执行删除操作:

const handleDeleteDepartment = (companyIndex, departmentIndex) => {
  if (departmentIndex !== 0) {
    // 浅拷贝companies数组
    const newCompanies = [...companies];
    // 深拷贝目标company对象,重点复制children为新数组
    const targetCompany = {
      ...newCompanies[companyIndex],
      children: [...newCompanies[companyIndex].children]
    };
    // 在新数组上执行删除
    targetCompany.children.splice(departmentIndex, 1);
    // 更新到新companies数组中
    newCompanies[companyIndex] = targetCompany;
    setCompanies(newCompanies);
  }
};

方案2:在获取数据库数据时预处理,转换为可写结构

如果从数据库拿到的整个数据结构都是不可变的,在存入状态前就把所有children数组转换成可写的:

// 示例:获取数据库数据后处理
const getCompaniesFromDB = async () => {
  const rawData = await yourDBQueryFunction();
  // 遍历每个公司,将children转为新数组
  const writableData = rawData.map(company => ({
    ...company,
    children: [...company.children]
  }));
  setCompanies(writableData);
};

额外提示

如果项目中使用了不可变数据管理工具(比如Immer、Redux Toolkit),建议用对应的API来修改数据,避免手动操作带来的问题。

内容的提问来源于stack exchange,提问作者Samathi kisalka Sapumana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:38:14