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

React修改深层嵌套useState对象报错:Invalid left-hand side in assignment

问题

我有一个ReactJS项目,其中存在一个层级极深的useState变量,结构如下:

{
  chart: { type: 'bar', height: 430 },
  plotOptions: { bar: { horizontal: false, dataLabels: { position: 'top' } } },
  colors,
  dataLabels: { enabled: true, offsetX: -6, style: { fontSize: '12px', colors: ['#fff'] } },
  stroke: { show: true, width: 1, colors: ['#fff'] },
  tooltip: { shared: true, intersect: false },
  xaxis: { categories: ["Mon", "Tue", "Wed", "Thru", "Fri", "Sat", "Sun"] }
}

我想要修改xaxis中的categories值,编写了如下代码:

if(days[index]==="Daily"){
  let temp = {...options};
  temp?.xaxis?.categories = chartData?.days?.days;
  setData(chartData?.days);
  setOptions(temp);
}

但触发了错误:

Invalid left-hand side in assignment expression. (72:6)
 70 |     if(days[index]==="Daily"){
 71 |       let temp = {...options};
> 72 |       temp?.xaxis?.categories = chartData?.days?.days;
     |       ^
 73 |       setData(chartData?.days);
 74 |       setOptions(temp);
 75 |     }

请问我哪里操作错误?是否不能以这种方式修改深层对象?

解答

你出错的核心原因是不能把可选链操作符?.用在赋值语句的左侧。可选链的作用是安全读取深层属性,但它返回的要么是属性值,要么是undefined,没办法直接给这个临时结果赋值。

另外,你用{...options}只做了浅拷贝,xaxis还是原对象的引用,就算赋值成功也可能触发意外的状态突变,违反React状态不可变的原则。

正确的做法是逐层解构拷贝深层对象,确保每一层都是新的引用:

if(days[index] === "Daily"){
  const temp = {
    ...options,
    xaxis: {
      ...options.xaxis,
      categories: chartData?.days?.days || [] // 加默认值防止出现undefined
    }
  };
  setData(chartData?.days);
  setOptions(temp);
}

如果xaxis可能不存在,还可以补充判断处理:

if(days[index] === "Daily"){
  const temp = {
    ...options,
    xaxis: options.xaxis 
      ? { ...options.xaxis, categories: chartData?.days?.days || [] }
      : { categories: chartData?.days?.days || [] } // 若xaxis不存在则直接新建
  };
  setData(chartData?.days);
  setOptions(temp);
}

总结两点:

  • 赋值操作的左侧不能用?.,它仅适用于属性读取场景
  • 修改React深层状态时,必须做逐层的不可变更新,禁止直接修改原对象的引用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:10:37