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

React中如何实现点击循环切换三种状态的普通按钮

React 三态循环按钮实现方案

完全可以实现,这类按钮和双态toggle的逻辑差异仅在于状态数量从2个变为3个,不需要引入第三方组件,用React原生的状态能力即可完成。

核心实现逻辑

  • 提前定义好三个状态的配置项(包含按钮文案、样式、对应的业务值等),避免代码里出现无意义的魔法值
  • 用状态钩子维护当前激活状态的索引值,初始值默认指向第一个状态
  • 按钮点击时,将当前索引值+1后对状态总长度取模,即可实现0→1→2→0的无限循环切换
  • 根据当前激活的状态配置,动态渲染按钮的展示样式、文案,触发对应业务逻辑即可

可直接运行的代码示例

import { useState } from 'react';

// 三个状态的配置可根据业务场景自由替换
const BUTTON_STATE_CONFIG = [
  { text: '未开始', bgColor: '#909399', bizValue: 'idle' },
  { text: '进行中', bgColor: '#409eff', bizValue: 'processing' },
  { text: '已完成', bgColor: '#67c23a', bizValue: 'done' }
];

export default function TriStateButton() {
  const [currentIndex, setCurrentIndex] = useState(0);
  const activeState = BUTTON_STATE_CONFIG[currentIndex];

  const handleButtonClick = () => {
    // 核心循环逻辑,即使后续调整状态数量(比如改成4态),这行逻辑也不需要改动
    setCurrentIndex(prev => (prev + 1) % BUTTON_STATE_CONFIG.length);
    
    // 此处可追加状态切换后的业务逻辑,比如上报、接口请求等
    // if (activeState.bizValue === 'done') { ... }
  };

  return (
    <button
      onClick={handleButtonClick}
      style={{
        padding: '8px 18px',
        border: 'none',
        borderRadius: '4px',
        color: '#fff',
        backgroundColor: activeState.bgColor,
        cursor: 'pointer'
      }}
    >
      {activeState.text}
    </button>
  );
}

扩展说明

如果是类组件场景,逻辑完全一致:仅需将useState替换为类组件的this.state存储当前索引,点击事件中调用setState更新索引值即可。
如果需要支持反向切换、状态跳转、切换前确认等能力,只需要在点击事件函数中追加对应判断逻辑,核心的索引循环计算逻辑不需要改动。

内容的提问来源于stack exchange,提问作者Marcel Drąg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:54:28