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

React筛选项目时如何为筛选按钮添加激活类并切换样式

解决筛选按钮的激活状态样式问题

你当前给<a>标签添加的active属性并非标准HTML属性,React不会自动将其转换为类名。要实现点击后按钮保持特定颜色的效果,核心思路是根据当前filter状态动态为按钮添加/移除CSS类,具体步骤如下:

1. 动态设置按钮的className属性

将每个筛选按钮的active替换为条件判断的className,当按钮对应的筛选值与当前filter状态匹配时,添加自定义的激活类(比如active):

<div className="portfolio__labels">
  <a 
    className={filter === "all" ? "active" : ""} 
    onClick={() => setFilter("all")}
  >
    All
  </a>
  <a
    className={filter === "frontend" ? "active" : ""}
    onClick={() => setFilter("frontend")}
  >
    Frontend Development
  </a>
  <a
    className={filter === "3d" ? "active" : ""}
    onClick={() => setFilter("3d")}
  >
    3D Modeling
  </a>
  <a
    className={filter === "branding" ? "active" : ""}
    onClick={() => setFilter("branding")}
  >
    Branding
  </a>
</div>

如果按钮已有基础类名,可使用模板字符串组合:

className={`portfolio__label ${filter === "all" ? "active" : ""}`}

2. 添加激活状态的CSS样式

在你的样式文件中,为.active类定义激活状态的颜色及其他样式:

.portfolio__labels a.active {
  color: #ff4081; /* 替换成你想要的颜色 */
  font-weight: bold; /* 可选:添加加粗等额外样式 */
}

可选优化:简化筛选逻辑

当前你通过map为每个项目添加filtered属性再判断显示,其实可以直接用filter方法简化代码,还能省去projects状态变量:

function Projects() {
  const [filter, setFilter] = useState("all");

  // 直接计算筛选后的项目
  const filteredProjects = portfolio.filter(project => {
    if (filter === "all") return true;
    return project.category.includes(filter);
  });

  return (
    <>
      <div className="portfolio">
        {/* 筛选按钮部分同上 */}
        <div className="portfolio__container">
          <ul>
            {filteredProjects.map(item => (
              <li key={item.name} className='card'>
                <Link className='card_path' to={item.source}>
                  <h1>{item.title}</h1>
                  <p>{item.description}</p>
                  <div className="card_preview">
                    <img src={item.preview} />
                    <img src={item.overlay} />
                  </div>
                  <span>{item.tools}</span>
                </Link>
              </li>
            ))} 
          </ul>
        </div>    
      </div>
    </>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:01:05