reactjs - 在可折叠表reactjs中使用地图
问题描述
我有一个看起来像这样的可折叠桌子。但是,当我单击一行时,两行都会展开。
这就是我的代码的样子:
const Transaction = ({ categories }) => {
const [open, setOpen] = useState(false);
let categoryList = categories.map((category, index) => {
return (
<TableRow key={index}>
<TableCell>
<IconButton size="small" onClick={() => setOpen(!open)}>
{open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}
</IconButton>
</TableCell>
<TableCell component="th" scope="row">
{category}
</TableCell>
<TableCell />
<TableCell />
<TableCell />
<TableCell />
</TableRow>
);
});
return (
<div className={classes.root}>
<Grid container spacing={2}>
<Grid item xs={12}>
<TableContainer component={Paper}>
<Table>
<TableHead>
<TableRow>
<TableCell />
<TableCell>Category</TableCell>
<TableCell />
<TableCell />
<TableCell />
<TableCell />
</TableRow>
</TableHead>
<TableBody>
{categoryList}
</TableBody>
</Table>
</TableContainer>
</Grid>
</Grid>
</div>
);
};
在我的 categoryList 中,我使用 index 作为键,但它仍然扩展两行而不是选定的特定行。我怎样才能只扩展一行?
解决方案
您的表格行需要控制自己的open
状态。目前,您构建代码的方式它们都共享相同的状态并单击任一表行将引用更改open
状态的相同处理程序,这就是为什么您的两个表行都同时打开和关闭的原因。
因此open
,这个解决方案不是保存一个布尔值,而是保存一个布尔值数组,最初都设置为 false。
const [open, setOpen] = useState(categories.map(() => false));
这将创建一个大小为 的布尔值数组categories
。
此外,该功能自然OnClick
会有所改变:
onClick={() => {
setOpen((pOpen) => pOpen.map((o, i) => {
if (i === index) return !o;
return o;
}));
}}
现在您可以使用索引open[index]
来了解打开的内容。
{open[index] ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}
完整的片段如下:
const Transaction = ({ categories }) => {
/*
* Change this [Origninal]:
* const [open, setOpen] = useState(false);
* To this:
*/
const [open, setOpen] = useState(categories.map(() => false));
React.useEffect(() => {
if (categories.length !== open.length) {
setOpen(categories.map(() => false));
}
}, [categories, open]);
let categoryList = categories.map((category, index) => {
return (
<TableRow key={index}>
<TableCell>
<IconButton size="small"
onClick={() => {
setOpen((pOpen) => pOpen.map((o, i) => {
if (i === index) return !o;
return o;
}));
}}
{open[index] ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}
</IconButton>
</TableCell>
<TableCell component="th" scope="row">
{category}
</TableCell>
<TableCell />
<TableCell />
<TableCell />
<TableCell />
</TableRow>
);
});
return (
<div className={classes.root}>
<Grid container spacing={2}>
<Grid item xs={12}>
<TableContainer component={Paper}>
<Table>
<TableHead>
<TableRow>
<TableCell />
<TableCell>Category</TableCell>
<TableCell />
<TableCell />
<TableCell />
<TableCell />
</TableRow>
</TableHead>
<TableBody>
{categoryList}
</TableBody>
</Table>
</TableContainer>
</Grid>
</Grid>
</div>
);
};
推荐阅读
- html - 淡出 HTML 元素/CSS 遮罩
- string - Julia:用分隔符连接字符串(相当于 R 的粘贴)
- sql - ssis visual studio 2010和excel时间戳作为日期
- sass - Foundation Zurb 的 $grid-margin-gutters 无法按预期工作
- sql-server - 预览报告时出现 SSRS 故障
- javascript - 带角度的字符串插值不绑定
- python - 词形还原机制是否会减小语料库的大小?
- android - 如何在android中为单个模块做一个assembleRelease
- python - 离线安装时找不到张量板
- python - 我在进行初学者编码时收到“扫描字符串文字时的 EOL”,我还想做什么