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

React TypeScript中如何实现按钮组单选仅激活被点击按钮

问题原因

你当前用单个布尔类型值作为全局选中状态,只能记录「整体是否选中」的二元状态,无法区分具体是哪个尺寸按钮被点击,三个按钮又共用同一个状态判断逻辑,自然会同步切换激活样式,没法实现单选效果。

修改方案

把状态类型从布尔值改为存储「当前选中项的唯一标识」,可以直接用尺寸字符(S/M/L)或者按钮id作为状态值:

  • 初始化状态时可设置默认选中项,比如默认选M就初始化为'M',不需要默认选中就初始化为null
  • 点击按钮时,把状态更新为当前点击按钮对应的标识
  • 判断按钮是否激活时,只需要比对「当前按钮的标识」和「状态存储的选中标识」是否相等,相等才追加选中样式
修改后完整代码
/** @jsxImportSource @emotion/react */
import React, { useState } from 'react';
import styles from './PizzaSize.styles';
export const PizzaSize: React.FC = () => {
  // 替换原布尔状态,存储当前选中的尺寸,此处默认选中M,无默认需求可设为null
  const [selectedSize, setSelectedSize] = useState<string | null>('M');
  
  // 点击时传入当前按钮对应的尺寸值更新状态
  const clickHandler = (size: string) => {
    setSelectedSize(size);
  };

  return (
    <div css={styles.pizza__size__selector}>
      <button
        css={
          selectedSize === 'S'
            ? [styles.pizza__size__btn, styles.pizza__size__btn__selected]
            : styles.pizza__size__btn
        }
        onClick={() => clickHandler('S')}
      >
        S
      </button>
      <button
        css={
          selectedSize === 'M'
            ? [styles.pizza__size__btn, styles.pizza__size__btn__selected]
            : styles.pizza__size__btn
        }
        onClick={() => clickHandler('M')}
      >
        M
      </button>
      <button
        css={
          selectedSize === 'L'
            ? [styles.pizza__size__btn, styles.pizza__size__btn__selected]
            : styles.pizza__size__btn
        }
        onClick={() => clickHandler('L')}
      >
        L
      </button>
    </div>
  );
};
可选优化建议

如果后续尺寸选项会调整,可以把尺寸数据抽成数组遍历渲染,不用重复写多份按钮结构,减少冗余代码:

// 抽离尺寸配置
const sizeOptions = ['S', 'M', 'L'];

// 渲染部分简化为
return (
  <div css={styles.pizza__size__selector}>
    {sizeOptions.map(size => (
      <button
        key={size}
        css={
          selectedSize === size
            ? [styles.pizza__size__btn, styles.pizza__size__btn__selected]
            : styles.pizza__size__btn
        }
        onClick={() => setSelectedSize(size)}
      >
        {size}
      </button>
    ))}
  </div>
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:51:28