【发布时间】:2021-01-13 00:08:05
【问题描述】:
使用 React,我有一个列表组件,它使用 array.map 来呈现项目列表。
列表项五花八门;每个其他列表项都有不同的背景颜色,这取决于提供列表项的数据结构的 id 字段是偶数还是奇数:
...
const useStyles = makeStyles((theme) => ({
even: {
backgroundColor: theme.palette.background.paper,
},
odd: {
backgroundColor: "#c8c9c7",
},
}));
...
const classes = useStyles();
...
{!list || list.length < 1 ? (
<p>You have no assets selected...</p>
) : (
list.map((items) => (
<ListItem
className={items.id % 2 === 0 ? classes.even : classes.odd}
key={items.id}
>
...
/>
</ListItem>
))
)}
这是它使用的数据结构的示例:
{
{
"id":0,
"foo":"This is a bar"
},
{
"id":1,
"foo":"This is also a bar"
},
{
"id":2,
"foo":"Yes, this too, is a bar"
}
}
我需要删除项目。正常的 javascript.filter 会按预期生成不连续的 id:
{
{
"id":0,
"foo":"This is a bar"
},
{
"id":2,
"foo":"Yes, this too, is a bar"
}
}
我需要它们是连续的:
{
{
"id":0,
"foo":"This is a bar"
},
{
"id":1,
"foo":"Yes, this too, is a bar"
}
}
我有一个功能可以满足我的需要,但需要一些调整:
const handleRemoveAsset = (id) => {
const arrayCopy = [...assetListItems];
const filteredArray = arrayCopy
.filter((item) => item.id !== id)
for (var i=0; i < filteredArray.length; i++) {
filteredArray[i].id = i;
}
setAssetListItems(filteredArray);
};
这可行,但不是简单地使用 React 进行 for 循环...我希望在整个过程中使用过滤器和/或映射,而不是使用我拥有的 for 循环。
我读到您可以链接过滤器和映射并尝试过,但无法完全解决。我想出了这个:
const filteredArray = array
.filter((item) => item.id !== id)
.map((item, index) => {
item && item.id ? item.id : index)});
... 编译失败 - 预期分配给函数调用,而是在 .map 之后的行上看到一个表达式。
在这一点上的任何建议将不胜感激,谢谢!
【问题讨论】:
-
在我看来,应该更新着色代码以使用索引而不是 id。
-
你也可以使用 CSS:stackoverflow.com/questions/3084261/…
-
感谢您的回复!我的 CSS 是垃圾,但使用这种方法似乎比通过 react 构建动态 CSS 样式要简单得多。我会探索它!
标签: javascript reactjs material-ui array.prototype.map