javascript - 使用 useState 更改列表中的活动状态
问题描述
零件
这是一个代码示例。我想要的是当我单击它时为每个单独的列表项切换活动状态(真/假)。我不想一次全部更改。
有什么帮助吗?提前致谢。
import React, { useState } from "react";
const App = () => {
const [active, setActive] = useState({});
const items = [
{ name: 'Item 1' },
{ name: 'Item 2' },
{ name: 'Item 3' }
];
handleClick = (index) => {
...
}
const list = items.map( (item, index) => {
return(
<li
key={index}
onClick={() => handleClick(index)}
className={active ? "active" : null}
>
{item.name}
</li>
)
})
return {
<>
<ul>{list}</ul>
</>
}
}
export default App;
解决方案
isActive
第一个选项 -为每个元素引入属性
我将在每个项目items
的active
属性中引入并根据单击的项目来操作它们。需要将其添加到useState
您可以使用 更新isActive
属性的位置.map()
。
类似如下:
const [items, setItems] = useState([
{ name: 'Item 1', isActive: true },
{ name: 'Item 2', isActive: false },
{ name: 'Item 3', isActive: false }
]);
handleClick = (index) => {
setItems(prevItems =>
prevItems.map((e, i) => ({...e, isActive: i === index}))
);
}
const list = items.map( (item, index) => {
return(
<li
key={index}
onClick={() => handleClick(index)}
className={item.isActive ? 'active' : null}
>
{item.name}
</li>
)
})
return {
<>
<ul>{list}</ul>
</>
}
第二个选项 - 存储index
单击的活动元素
为单击的元素存储index
有助于您识别.map()
哪个是活动元素。因此,通过简单的检查,i === index
您可以向元素添加active
类。<li>
index
您可以为with创建一个状态,useState
如下所示:
const [index, setIndex] = useState(0);
const items = [
{ name: 'Item 1' },
{ name: 'Item 2' },
{ name: 'Item 3' }
];
handleClick = (i) => {
setIndex(i);
}
const list = items.map( (item, i) => {
return(
<li
key={i}
onClick={() => handleClick(i)}
className={i === index ? 'active' : null}
>
{item.name}
</li>
)
})
return {
<>
<ul>{list}</ul>
</>
}
我希望这有帮助!
推荐阅读
- .net - 在 Mathematica 中创建 PetroSIM COM 对象失败
- c++ - 在二维向量中查找非支配点
- material-ui - material-ui Snackbar 组件错误:不能作为后代出现
- r - 如何提取满足一列条件但在另一列排序的行?
- java - 用户入职状态机 - 存储和实现
- jenkins - 如何定义管道阶段一次并多次使用它
- json - 为什么我的 XML http 请求返回的是 HTML 而不是 JSON?
- ios - 构建带有或不带有今日扩展的应用程序?
- node.js - 在组件中使用 ng-multiselect-dropdown 而不是 app.module.ts
- java - 在 CollectionLoadContext#cleanup 上,localLoadingCollectionKeys 包含 [3] 个条目