料青山看我应如是
每个按钮都需要单独的状态。我建议使用地图来存储一个按钮 ID 和一个布尔值,以确定它是否为“黑色”,即点击处理程序只是切换一个布尔值。我不知道这是否是将代码复制/粘贴到 SO 时的拼写错误,但需要在功能组件主体中声明反应状态。const [isBlack, setIsBlack] = useState({});您还可以通过将其转换为柯里化回调来使用单击处理程序,将按钮 ID 获取并包含在范围内。这使用功能状态更新来浅层复制现有状态并更新包含的按钮 ID 的值。const handleBtn = btnId => e => { e.preventDefault(); setIsBlack(state => ({ ...state, [btnId]: !state[btnId], }));};完整代码function Mata() { const [activeTab, setActiveTab] = useState("activeTab"); const [isBlack, setIsBlack] = useState({}); const handleBtn = btnId => e => { e.preventDefault(); setIsBlack(state => ({ ...state, [btnId]: !state[btnId] })); }; return ( <div className="container"> <button style={{ backgroundColor: isBlack["btn1"] ? "#262626" : "#F3F3F3" }} className={`btn1 ${isBlack["btn1"] && activeTab}`} onClick={handleBtn("btn1")} > btn1 </button> <button style={{ backgroundColor: isBlack["btn2"] ? "#262626" : "#F3F3F3" }} className={`btn2 ${isBlack["btn2"] && activeTab}`} onClick={handleBtn("btn2")} > btn2 </button> <button style={{ backgroundColor: isBlack["btn3"] ? "#262626" : "#F3F3F3" }} className={`btn3 ${isBlack["btn3"] && activeTab}`} onClick={handleBtn("btn3")} > btn3 </button> <button style={{ backgroundColor: isBlack["btn4"] ? "#262626" : "#F3F3F3" }} className={`btn4 ${isBlack["btn4"] && activeTab}`} onClick={handleBtn("btn4")} > btn4 </button> <button style={{ backgroundColor: isBlack["btn5"] ? "#262626" : "#F3F3F3" }} className={`btn5 ${isBlack["btn5"] && activeTab}`} onClick={handleBtn("btn5")} > btn5 </button> </div> );}有很多重复的代码,所以一个更干的版本,其中活动选项卡和按钮作为道具传递。function Mata({ activeTab = '', buttons }) { const [isBlack, setIsBlack] = useState({}); const handleBtn = btnId => e => { e.preventDefault(); setIsBlack(state => ({ ...state, [btnId]: !state[btnId] })); }; return ( <div className="container"> {buttons.map(btn => ( <button style={{ backgroundColor: isBlack[btn] ? "#262626" : "#F3F3F3" }} className={`btn1 ${isBlack[btn] && activeTab}`} onClick={handleBtn(btn)} > {btn} </button> ))} </div> );}像这样使用const buttons = ["btn1", "btn2", "btn3", "btn4", "btn5"];...<Mata buttons={buttons} />编辑似乎你真的在创建一个“标签管理器”。我建议将状态放样到父级并转换Mata为只呈现“选项卡”按钮的“哑”组件。采用 3 个道具:活动选项卡索引、按钮数组和状态更新回调。function Mata({ activeTab = -1, buttons, setActiveTab }) { return ( <div className="container"> {buttons.map((btn, i) => { const isActive = i === activeTab; return ( <button key={btn.id} style={{ backgroundColor: isActive ? "#262626" : "#F3F3F3" }} className={`${btn.id} ${isActive && activeTab}`} onClick={() => setActiveTab(i)} > {btn.id} </button> ); })} </div> );}示例选项卡数据const tabs = [ { id: "btn1", data: "data1" }, { id: "btn2", data: "data2" }, { id: "btn3", data: "data3" }, { id: "btn4", data: "data4" }, { id: "btn5", data: "data5" }];用法示例<Mata activeTab={activeTab} buttons={tabs} setActiveTab={setActiveTab} />{activeTab === -1 ? ( <div>Social Media</div>) : ( <div>{tabs[activeTab].data}</div>)}添加“图标”类似于在运行时选择类型如果 SVG 图标还不是反应组件,将它们包装成一个简单的功能组件const Icon1 = () => <svg>...</svg>;在标签数据中添加一个图标字段并将值设置为图标组件const tabs = [ { id: "btn1", data: "data1", icon: Icon1 }, { id: "btn2", data: "data2", icon: Icon2 }, { id: "btn3", data: "data3", icon: Icon3 }, { id: "btn4", data: "data4", icon: Icon4 }, { id: "btn5", data: "data5", icon: Icon5 }];并解构并重命名以呈现function Mata({ activeTab = -1, buttons, setActiveTab }) { return ( <div className="container"> {buttons.map((btn, i) => { const isActive = i === activeTab; const { icon: Icon, id } = btn; // <-- rename icon -> Icon return ( <button key={id} style={{ backgroundColor: isActive ? "#262626" : "#F3F3F3" }} className={`${id} ${isActive && activeTab}`} onClick={() => setActiveTab(i)} > <Icon /> {id} // <-- render icon component </button> ); })} </div> );}