我有一个列表,它已经设置为活动,我的意思是第一个列表已经是活动的,但我的问题是如何使其他列表活动也只有当它被点击,只要它被点击,并在同一页面上保持活动
return (
<div className="sidebar">
<div className="sidebarWrapper">
<div className="sidebarMenu">
<h3 className="sidebarTitle">Dashboard</h3>
<ul className="sidebarList">
<Link to="/" className="link">
<li className="sidebarListItem active">
<LineStyleIcon className="sidebarIcon" />
Home
</li>
</Link>
<li className="sidebarListItem">
<TimelineIcon className="sidebarIcon" />
Analytics
</li>
<li className="sidebarListItem">
<TrendingUpIcon className="sidebarIcon" />
Sales
</li>
</ul>
);
CSS:
.sidebarTitle {
font-size: 18px;
font-weight: 700;
color: rgb(187, 186, 186);
}
.sidebarList {
list-style: none;
padding: 5px;
}
.sidebarListItem.active,
.sidebarListItem:hover {
background-color: black;
color: white;
}
你的组件需要保持状态用于当前活动项。初始状态可以是0
,即项目列表中第一个元素的索引。当点击另一个项目时,我们可以将点击项目的index
换成setActive(index)
。确定单个物品的active
属性是active
状态和物品的index
,active == index
状态的衍生物-
function App({ items = [] }) {
const [active, setActive] = React.useState(0)
return items.map((value, index) =>
<ListItem
key={index}
value={value}
active={index == active}
onClick={_ => setActive(index)}
/>
)
}
function ListItem({ value, active, onClick }) {
return <button
type="button"
class={active ? "active" : "inactive"}
onClick={onClick}
children={value}
/>
}
ReactDOM.render(<App items={["🫐", "🍑", "🥝"]}/>, document.body)
button { border-color: dodgerblue; font-size: 4rem; background-color: white; }
.active { border-color: tomato; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.0/umd/react-dom.production.min.js"></script>
我将把列表项存储在一个数组中,以便以后可以遍历它们
const listItems = ["Home", "Analytics", "Sales"];
我将创建一个状态来存储活动索引
const [activeIndex, setActiveIndex] = React.useState(0);
,最后我将呈现列表项如下:
<ul className="sidebarList">
{listItems.map((listItem, index) => {
return (
<li
onClick={() => setActiveIndex(index)}
className={`sidebarListItem ${
index === activeIndex ? "active" : ""
}`}
>
{listItem}
</li>
);
})}
</ul>
当用户点击项目…activeIndex将被设置为被单击的项目的项目索引。
,我正在添加className: "active"只有当item-index === activeIndex