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

React按钮组件单选样式问题:点击新按钮恢复旧按钮原样式

解决单选按钮背景切换问题

问题根源是每个Button组件单独维护自己的激活状态,彼此互不影响,所以点击新按钮时旧按钮无法自动恢复白色背景。把激活状态提升到父组件Category统一管理就能解决,具体修改如下:

修改Category组件

在Category里添加状态记录当前选中的分类ID,给每个Button传递激活状态和点击回调:

import React, { useState } from "react";
import Button from "./Button";

const categoryArray = [
    { id:1, category:"Starter" },
    { id:2, category:"Cold Beverages" },
    { id:3, category:"Hot Beverages" },
    { id:4, category:"South Indian" },
    { id:5, category:"Starter" },
    { id:6, category:"Cold Beverages" },
    { id:7, category:"Hot Beverages" },
    { id:8, category:"South Indian" },
    { id:9, category:"Italian" }
]

export default function Category(){
    // 记录当前选中的分类ID,初始值设为null表示没有选中
    const [selectedCategoryId, setSelectedCategoryId] = useState(null);

    // 处理按钮点击,更新选中的ID
    const handleButtonClick = (id) => {
        setSelectedCategoryId(id);
    }

    return (
        <div className="category-tray">
        {categoryArray.map((categoryTerm) => (
            <Button 
                key={categoryTerm.id} 
                name={categoryTerm.category}
                // 传递当前按钮是否激活的状态
                isActive={selectedCategoryId === categoryTerm.id}
                // 传递点击回调,把当前按钮ID传回去
                onClick={() => handleButtonClick(categoryTerm.id)}
            />
        ))}
        </div>
    );
}

修改Button组件

去掉自己的state,改用父组件传递的props来控制样式和点击事件:

import React from "react";

export default function Button(props){
    return <button 
        className="button" 
        style={{backgroundColor: props.isActive ? "#FD5D5D" : "white"}} 
        onClick={props.onClick}
    >{props.name}</button>
}

这样修改后,每次点击按钮时,父组件会更新选中的ID,所有按钮会根据自己的ID和选中ID是否匹配来决定背景色,实现点击新按钮时旧按钮自动恢复白色的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:40:05