javascript - 如何通过 React 优化在不同菜单项之间切换 className?
问题描述
我有标题组件,我想在菜单的所有元素之间切换 className (如果菜单的一个元素处于活动状态并且用户正在单击另一个元素 - 该元素变为活动状态而所有其他元素都没有)。我有这样的代码
import React, { useState } from 'react';
import './header.scss';
export const Header = ({ favoriteCount }) => {
const [activeIndex, setActiveIndex] = useState(0);
function toggleClass(index) {
setActiveIndex(index);
}
return (
<header className="header">
<div className="container header-container">
<ul className="header-menu">
<li>
<a
className={
activeIndex === 0
? 'header-menu__link active'
: 'header-menu__link'
}
onClick={() => {
toggleClass(0);
}}
href="##"
>
Characters
</a>
</li>
<li>
<a
className={
activeIndex === 1
? 'header-menu__link active'
: 'header-menu__link'
}
onClick={() => {
toggleClass(0);
}}
href="##"
>
Favorites
</a>
</li>
</ul>
<div className="header-favorite-count">
<i className="far fa-heart"></i>
{favoriteCount}
</div>
</div>
</header>
);
};
和样式来可视化切换类
&-menu__link {
color: lightgray;
}
.active {
color: #fff;
}
这种方法有效,但看起来令人毛骨悚然。也许有人知道如何优化它?
解决方案
我不会使用索引,我会使用项目的文本。我还会在中包含该文本,href
以便指示锚点导致的内容。为避免重复代码,您可以将菜单项放在可重用数组中,如下所示:
const menuItems = [
"Characters",
"Favorites",
];
export const Header = ({ favoriteCount }) => {
const [activeItem, setActiveItem] = useState("");
const setActiveItem = useCallback((event) => {
setActiveItem(event.currentTarget.href.substring(2));
}, []);
const list = menuItems.map(item =>
<li key={item}>
<a
className={`header-menu__link ${item === activeItem ? "active" : ""}`}
onClick={setActiveItem}
href={"##" + item}>
{item}
</a>
</li>
);
return (
<header className="header">
<div className="container header-container">
<ul className="header-menu">
{list}}
</ul>
<div className="header-favorite-count">
<i className="far fa-heart"></i>
{favoriteCount}
</div>
</div>
</header>
);
};
推荐阅读
- python - 如何使用python将数据框中的列从小数转换为百分比
- python - 在 python 3 中使用 Counter 对键值对进行分组并获取计数
- amazon-web-services - 您请求的引擎模式无服务器当前在 5.7 (2.07.1) 中不可用
- raspberry-pi3 - “QWidget::paintEngine: 不应再被调用”错误语法
- ios - 将 Flutter 升级到 2.3.0-1.0.pre.267 或 Firebase 软件包后,Flutter iOS 构建失败
- maven - Maven deploy 给出 Failed to deploy artifacts: Broken Pipe
- python - 在 Django Manager 中使用其他模型会导致 ImportError: partial initialized module (由于循环依赖)
- python - 如何在python结构中转义双引号和单引号
- html - CSS 动态 ID 目标
- typescript - Angular 11 应用程序在部署到 IIS 时无法正常工作