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

React中实现函数调用仅影响被点击的按钮(切换颜色)

解决React多按钮单独切换颜色的问题

嘿,作为React新手碰到这个问题太正常啦!咱们先理清楚问题根源:你现在用了一个全局的colorActive状态,所有按钮都绑定同一个状态值,所以一点击自然所有按钮都会跟着变。要实现仅点击的按钮变色,只需要调整状态的存储方式,让每个按钮有自己的激活状态就行,而且完全不用为每个按钮写单独函数~

具体步骤:

1. 重构状态结构

把原来单一的布尔值状态,改成一个对象来记录每一天的激活状态,这样每个按钮都有自己的独立状态:

constructor(props) {
  super(props);
  this.state = {
    // 初始化所有天数为未激活状态
    activeDays: {
      Sunday: false,
      Monday: false,
      Tuesday: false,
      Wednesday: false,
      Thursday: false,
      Friday: false,
      Saturday: false
    }
  };
  this.toggleDayButton = this.toggleDayButton.bind(this);
}

2. 修改切换函数,接收按钮标识

让toggleDayButton函数接收被点击的日期名称,然后只更新对应日期的状态值:

toggleDayButton = (day) => {
  // 使用函数式更新state,确保拿到最新的状态值
  this.setState(prevState => ({
    activeDays: {
      // 先拷贝之前的所有状态,避免覆盖其他天数
      ...prevState.activeDays,
      // 切换当前点击天数的激活状态
      [day]: !prevState.activeDays[day]
    }
  }));
};

3. 绑定按钮与对应状态

每个按钮点击时传递自己的日期名称,并且根据activeDays里的对应值设置颜色:

<Button 
  onClick={() => this.toggleDayButton("Sunday")} 
  color={this.state.activeDays.Sunday ? "primary" : "default"}
>
  Sunday
</Button>
<Button 
  onClick={() => this.toggleDayButton("Monday")} 
  color={this.state.activeDays.Monday ? "primary" : "default"}
>
  Monday
</Button>
<!-- 剩下的Tuesday到Saturday按钮同理 -->

(可选)优化:循环渲染按钮

如果觉得重复写按钮代码太麻烦,可以把天数放到数组里循环渲染,代码更简洁:

render() {
  const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  
  return (
    <div>
      {days.map(day => (
        <Button 
          key={day} // 必须加key,React列表渲染要求
          onClick={() => this.toggleDayButton(day)} 
          color={this.state.activeDays[day] ? "primary" : "default"}
        >
          {day}
        </Button>
      ))}
    </div>
  );
}

这样修改后,点击任意按钮就只会改变该按钮的颜色啦,而且全程只用了一个切换函数,完全符合你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:38:25