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

React 如何根据传入的按钮名动态修改对应hook的状态值

最优方案:聚合同类型状态为单个对象

你完全可以和类组件的实现逻辑对齐,把分散的4个按钮状态合并为一个对象类型的state,直接用计算属性动态更新对应键值即可:

import { useState } from 'react'

// 初始化状态,默认值可替换为你需要的基础按钮类名
const [btnClass, setBtnClass] = useState({
  btn1: 'btn',
  btn2: 'btn',
  btn3: 'btn',
  btn4: 'btn'
})

// 点击事件处理逻辑
const handleClick = (e) => {
  const buttonName = e.target.name
  // 这里可以加你自己的对错判断逻辑,动态赋值success/error类名
  const targetClass = 你的判断逻辑 ? 'btn-success' : 'btn-danger'
  
  setBtnClass(prev => ({
    // 保留其他按钮的状态
    ...prev,
    // 动态更新当前点击按钮的类名
    [buttonName]: targetClass
  }))
}

渲染按钮时直接从状态对象取值即可:

<button name="btn1" className={btnClass.btn1} onClick={handleClick}>选项1</button>
<button name="btn2" className={btnClass.btn2} onClick={handleClick}>选项2</button>
<button name="btn3" className={btnClass.btn3} onClick={handleClick}>选项3</button>
<button name="btn4" className={btnClass.btn4} onClick={handleClick}>选项4</button>

这种方案的扩展性最强,后续如果新增选项只需要在初始化状态里加对应键即可,不需要额外声明新的state。


次选方案:不改动现有状态声明的前提下用映射表简化

如果你不想修改现有的setBtn1/setBtn2等状态声明,可以用映射表替代冗余的if判断:

// 提前建立按钮标识和对应setter的映射关系
const btnSetterMap = {
  1: setBtn1,
  2: setBtn2,
  3: setBtn3,
  4: setBtn4
}

// 提取点击按钮的数字标识
const btnNum = button.match(/\d+/)[0]
// 直接调用对应setter,可选链做容错处理
btnSetterMap[btnNum]?.('btn-success')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:54:03