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

ReactJS中点击2D网格指定单元格修改对应倍数单元格背景色问题排查

问题原因
  • 状态更新异步:setFillcolor是React的异步状态更新方法,调用后不会立刻修改当前作用域内的fillcolor变量,后续循环中拿到的还是更新前的空值,背景色设置不会生效。
  • 临时数组修改不生效:你在组件内定义的items是每次组件渲染时生成的临时数组,在changeColor中直接修改数组元素不会触发组件重渲染,且下次渲染时会重新生成初始items,修改内容会被完全覆盖。
  • 状态设计不合理:仅存储填充颜色,没有存储判断高亮的核心条件,无法在渲染时动态匹配需要变色的单元格。
修复代码

调整状态设计,存储当前点击的单元格编号,每次渲染时动态判断每个单元格是否为该编号的倍数,再设置对应背景色即可:

const { useState } = React;

function App() {
  // 存储当前点击的编号,初始为null代表无选中
  const [selectedNum, setSelectedNum] = useState(null);

  const handleCellClick = (num) => {
    setSelectedNum(num);
  };

  // 每次渲染动态生成单元格
  const cells = [];
  for (let i = 1; i <= 100; i++) {
    const isMultiple = selectedNum !== null && i % selectedNum === 0;
    cells.push(
      <div
        key={i}
        onClick={() => handleCellClick(i)}
        className="border border-gray-600 text-center p-2"
        style={{ backgroundColor: isMultiple ? "yellow" : "transparent" }}
      >
        {i}
      </div>
    );
  }

  return (
    <div className="App">
      <div className="container">
        <div className="grid grid-cols-10 grid-rows-10 gap-0">
          {cells}
        </div>
      </div>
    </div>
  );
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 10:51:03