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

React组件状态问题:点击切换颜色时重置前一个组件为黑色

解决方案提示

你的问题核心在于每个Square组件各自独立维护自己的颜色状态,组件之间无法共享状态,所以没法判断另一个组件的颜色并重置它。解决思路是把状态提升到父组件,由父组件统一管理两个方块的颜色,子组件只负责接收颜色和点击事件。

具体实现步骤:

  • 父组件中维护两个方块的颜色状态(用数组存储更方便)
  • 父组件定义点击处理函数:点击某个方块时,先检查另一个方块的颜色是否为橙色,若是则重置为黑色,再将当前点击的方块设为橙色
  • 子组件Square改为受控组件,通过props接收颜色和点击回调

代码示例:

父组件(比如App.js)

import { useState } from 'react';
import Square from './Square';

const App = () => {
  // 用数组存储两个方块的颜色,初始都是黑色
  const [squareColors, setSquareColors] = useState(['black', 'black']);

  const handleSquareClick = (index) => {
    setSquareColors(prevColors => {
      // 复制之前的状态,避免直接修改原数组
      const newColors = [...prevColors];
      // 获取另一个方块的索引
      const otherIndex = index === 0 ? 1 : 0;
      // 如果另一个方块是橙色,重置为黑色
      if (newColors[otherIndex] === 'orange') {
        newColors[otherIndex] = 'black';
      }
      // 将当前点击的方块设为橙色
      newColors[index] = 'orange';
      return newColors;
    });
  };

  return (
    <div>
      <Square color={squareColors[0]} onClick={() => handleSquareClick(0)} />
      <Square color={squareColors[1]} onClick={() => handleSquareClick(1)} />
    </div>
  );
};

export default App;

子组件(Square.js)

const Square = ({ color, onClick }) => {
  // 子组件不再自己维护状态,完全由父组件控制
  return (
    <div
      style={{
        width: '100px',
        height: '100px',
        backgroundColor: color,
        margin: '10px',
        cursor: 'pointer'
      }}
      onClick={onClick}
    />
  );
};

export default Square;

关键点说明:

  • 状态提升后,父组件拥有所有方块的状态,能轻松实现跨组件的状态控制
  • 使用函数式更新setSquareColors(prevColors => ...)确保每次更新都基于最新的状态
  • 子组件变成纯展示组件,只负责渲染和触发点击事件,逻辑更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:12:34