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

如何在useState Hook中管理多按钮点击状态,避免重复定义state

实现方案

方案1:用数组/对象统一存储所有按钮状态

只需要定义一个状态,用数组(按钮数量固定用数组更方便)或者对象(按钮有唯一业务ID用对象更方便)存储所有按钮的点击状态,点击时传入当前按钮的标识,仅修改对应位置的状态值即可。
代码示例:

import { useState } from 'react'

// 初始化长度为10的数组,每个元素对应一个按钮的点击状态,默认未点击
const [clickStates, setClickStates] = useState(Array(10).fill(false))

// 点击时传入当前按钮的索引
const toggleBtnState = (index) => {
  setClickStates(prev => {
    // 拷贝原数组避免直接修改状态
    const newStates = [...prev]
    // 仅修改当前点击按钮的状态
    newStates[index] = !newStates[index]
    return newStates
  })
}

// 渲染按钮
function App() {
  return (
    <div>
      {clickStates.map((isClicked, index) => (
        <button
          key={index}
          onClick={() => toggleBtnState(index)}
          style={{ background: isClicked ? 'green' : 'gray' }}
        >
          按钮{index + 1}
        </button>
      ))}
    </div>
  )
}

如果按钮有独立的业务ID,可改用对象存储状态:

const [clickStates, setClickStates] = useState({
  submit: false,
  cancel: false,
  edit: false
  // 其余按钮ID依次添加即可
})

const toggleBtnState = (btnId) => {
  setClickStates(prev => ({
    ...prev,
    [btnId]: !prev[btnId]
  }))
}

// 调用时传入对应按钮ID
<button onClick={() => toggleBtnState('submit')}>提交</button>

方案2:封装独立的按钮子组件

如果按钮的点击状态不需要父组件统一管控,仅按钮自身使用,直接封装带独立状态的按钮组件是最简洁的方案,后续新增按钮也不需要修改状态定义。
代码示例:

import { useState } from 'react'

// 封装独立按钮组件,内部自己维护点击状态
const ToggleBtn = ({ children }) => {
  const [isClicked, setIsClicked] = useState(false)
  return (
    <button
      onClick={() => setIsClicked(!isClicked)}
      style={{ background: isClicked ? 'green' : 'gray' }}
    >
      {children}
    </button>
  )
}

// 父组件直接调用即可,无需管理每个按钮的状态
function App() {
  return (
    <div>
      <ToggleBtn>按钮1</ToggleBtn>
      <ToggleBtn>按钮2</ToggleBtn>
      <ToggleBtn>按钮3</ToggleBtn>
      {/* 剩余7个按钮直接复用组件即可 */}
    </div>
  )
}

选型建议

  • 父组件需要统一获取所有按钮的点击状态时,选方案1
  • 按钮状态仅内部使用,不需要父组件感知时,选方案2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:18:05