如何在反应中使用单一方法仅扩展 more/less 一个 ListItem
How to expand more/less only one ListItem using single method in react
我使用 material-ui 在 link https://material-ui.com/components/lists/#simple-list 上找到了我需要的东西。在这个 link 上有一章“嵌套列表项”。本章只有一个嵌套列表项,带有展开方法more/less。我的侧边栏中有两个嵌套项目。它们都调用 handleClick 方法来扩展 more/less 选项。我想每次点击只展开一个(点击的)嵌套项目。我还想减少对上一个项目的扩展。这是我的侧边栏:
import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Drawer from "@material-ui/core/Drawer";
import Toolbar from "@material-ui/core/Toolbar";
import List from "@material-ui/core/List";
import ListItem from "@material-ui/core/ListItem";
import ListItemIcon from "@material-ui/core/ListItemIcon";
import ListItemText from "@material-ui/core/ListItemText";
import Collapse from "@material-ui/core/Collapse";
import ExpandLess from "@material-ui/icons/ExpandLess";
import ExpandMore from "@material-ui/icons/ExpandMore";
import HomeIcon from '@material-ui/icons/Home';
import SupervisorAccountIcon from '@material-ui/icons/SupervisorAccount';
import AccessibilityNewIcon from '@material-ui/icons/AccessibilityNew';
import VisibilityIcon from '@material-ui/icons/Visibility';
import AddIcon from '@material-ui/icons/Add';
const drawerWidth = 260;
const useStyles = makeStyles((theme) => ({
drawer: {
width: drawerWidth,
flexShrink: 0,
},
drawerPaper: {
width: drawerWidth,
},
drawerContainer: {
overflow: "auto",
},
root: {
width: "100%",
maxWidth: 360,
backgroundColor: theme.palette.background.paper,
},
nested: {
paddingLeft: theme.spacing(4),
},
}));
export default function SideBar() {
const classes = useStyles();
const [open, setOpen] = React.useState(true);
const handleClick = () => {
setOpen(!open);
};
return (
<Drawer
className={classes.drawer}
variant="permanent"
classes={{
paper: classes.drawerPaper,
}}
>
<Toolbar />
<div className={classes.drawerContainer}>
<List
component="nav"
aria-labelledby="nested-list-subheader"
className={classes.root}
>
<ListItem button>
<ListItemIcon>
<HomeIcon />
</ListItemIcon>
<ListItemText primary="Home" />
</ListItem>
<ListItem button onClick={handleClick}>
<ListItemIcon>
<SupervisorAccountIcon />
</ListItemIcon>
<ListItemText primary="Administrators" />
{open ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse in={open} timeout="auto" unmountOnExit>
<List component="div" disablePadding>
<ListItem button className={classes.nested}>
<ListItemIcon>
<VisibilityIcon />
</ListItemIcon>
<ListItemText primary="View" />
</ListItem>
<ListItem button className={classes.nested}>
<ListItemIcon>
<AddIcon />
</ListItemIcon>
<ListItemText primary="Add administrator" />
</ListItem>
</List>
</Collapse>
<ListItem button onClick={handleClick}>
<ListItemIcon>
<AccessibilityNewIcon />
</ListItemIcon>
<ListItemText primary="Trainers" />
{open ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse in={open} timeout="auto" unmountOnExit>
<List component="div" disablePadding>
<ListItem button className={classes.nested}>
<ListItemIcon>
<VisibilityIcon />
</ListItemIcon>
<ListItemText primary="View" />
</ListItem>
<ListItem button className={classes.nested}>
<ListItemIcon>
<AddIcon />
</ListItemIcon>
<ListItemText primary="Add trainer" />
</ListItem>
</List>
</Collapse>
</List>
</div>
</Drawer>
);
}
知道怎么做吗?
使用类似的东西。这不是最好的解决方案。但它会起作用。您也可以使用 ref.
handleClick = (id) => {
setOpen(id);
}
<ListItem button onClick={() => handleClick('item1')}>
<ListItemIcon>
<AccessibilityNewIcon />
</ListItemIcon>
<ListItemText primary="Trainers" />
{open ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse in={open === 'item1'} timeout="auto" unmountOnExit>
<List component="div" disablePadding>
<ListItem button className={classes.nested}>
<ListItemIcon>
<VisibilityIcon />
</ListItemIcon>
<ListItemText primary="View" />
</ListItem>
<ListItem button className={classes.nested}>
<ListItemIcon>
<AddIcon />
</ListItemIcon>
<ListItemText primary="Add trainer" />
</ListItem>
</List>
</Collapse>
您可以使用渲染道具。这是一个 CodeSandbox。
我们可以通过为列表项设置id并在调用handleClick方法时检索它来实现。除了设置 id,项目名称也可以直接传递给上面回答的 handleClick 方法。
Link: CodeSandBox
import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Drawer from "@material-ui/core/Drawer";
import Toolbar from "@material-ui/core/Toolbar";
import List from "@material-ui/core/List";
import ListItem from "@material-ui/core/ListItem";
import ListItemIcon from "@material-ui/core/ListItemIcon";
import ListItemText from "@material-ui/core/ListItemText";
import Collapse from "@material-ui/core/Collapse";
import ExpandLess from "@material-ui/icons/ExpandLess";
import ExpandMore from "@material-ui/icons/ExpandMore";
import HomeIcon from "@material-ui/icons/Home";
import SupervisorAccountIcon from "@material-ui/icons/SupervisorAccount";
import AccessibilityNewIcon from "@material-ui/icons/AccessibilityNew";
import VisibilityIcon from "@material-ui/icons/Visibility";
import AddIcon from "@material-ui/icons/Add";
const drawerWidth = 260;
const useStyles = makeStyles(theme => ({
drawer: {
width: drawerWidth,
flexShrink: 0
},
drawerPaper: {
width: drawerWidth
},
drawerContainer: {
overflow: "auto"
},
root: {
width: "100%",
maxWidth: 360,
backgroundColor: theme.palette.background.paper
},
nested: {
paddingLeft: theme.spacing(4)
}
}));
export default function SideBar() {
const classes = useStyles();
const [openedItemId, setOpenedItemId] = React.useState(true);
const handleClick = orgEvent => {
let clickedItemId = orgEvent.currentTarget.id;
if (openedItemId === clickedItemId) {
setOpenedItemId("");
} else {
setOpenedItemId(clickedItemId);
}
//setOpen(!open);
};
return (
<Drawer
className={classes.drawer}
variant="permanent"
classes={{
paper: classes.drawerPaper
}}
>
<Toolbar />
<div className={classes.drawerContainer}>
<List
component="nav"
aria-labelledby="nested-list-subheader"
className={classes.root}
>
<ListItem button>
<ListItemIcon>
<HomeIcon />
</ListItemIcon>
<ListItemText primary="Home" />
</ListItem>
<ListItem id="item-administrators" button onClick={handleClick}>
<ListItemIcon>
<SupervisorAccountIcon />
</ListItemIcon>
<ListItemText primary="Administrators" />
{openedItemId === "item-administrators" ? (
<ExpandLess />
) : (
<ExpandMore />
)}
</ListItem>
<Collapse
in={openedItemId === "item-administrators"}
timeout="auto"
unmountOnExit
>
<List component="div" disablePadding>
<ListItem button className={classes.nested}>
<ListItemIcon>
<VisibilityIcon />
</ListItemIcon>
<ListItemText primary="View" />
</ListItem>
<ListItem button className={classes.nested}>
<ListItemIcon>
<AddIcon />
</ListItemIcon>
<ListItemText primary="Add administrator" />
</ListItem>
</List>
</Collapse>
<ListItem id="item-trainers" button onClick={handleClick}>
<ListItemIcon>
<AccessibilityNewIcon />
</ListItemIcon>
<ListItemText primary="Trainers" />
{openedItemId === "item-trainers" ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse
in={openedItemId === "item-trainers"}
timeout="auto"
unmountOnExit
>
<List component="div" disablePadding>
<ListItem button className={classes.nested}>
<ListItemIcon>
<VisibilityIcon />
</ListItemIcon>
<ListItemText primary="View" />
</ListItem>
<ListItem button className={classes.nested}>
<ListItemIcon>
<AddIcon />
</ListItemIcon>
<ListItemText primary="Add trainer" />
</ListItem>
</List>
</Collapse>
</List>
</div>
</Drawer>
);
}
我使用 material-ui 在 link https://material-ui.com/components/lists/#simple-list 上找到了我需要的东西。在这个 link 上有一章“嵌套列表项”。本章只有一个嵌套列表项,带有展开方法more/less。我的侧边栏中有两个嵌套项目。它们都调用 handleClick 方法来扩展 more/less 选项。我想每次点击只展开一个(点击的)嵌套项目。我还想减少对上一个项目的扩展。这是我的侧边栏:
import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Drawer from "@material-ui/core/Drawer";
import Toolbar from "@material-ui/core/Toolbar";
import List from "@material-ui/core/List";
import ListItem from "@material-ui/core/ListItem";
import ListItemIcon from "@material-ui/core/ListItemIcon";
import ListItemText from "@material-ui/core/ListItemText";
import Collapse from "@material-ui/core/Collapse";
import ExpandLess from "@material-ui/icons/ExpandLess";
import ExpandMore from "@material-ui/icons/ExpandMore";
import HomeIcon from '@material-ui/icons/Home';
import SupervisorAccountIcon from '@material-ui/icons/SupervisorAccount';
import AccessibilityNewIcon from '@material-ui/icons/AccessibilityNew';
import VisibilityIcon from '@material-ui/icons/Visibility';
import AddIcon from '@material-ui/icons/Add';
const drawerWidth = 260;
const useStyles = makeStyles((theme) => ({
drawer: {
width: drawerWidth,
flexShrink: 0,
},
drawerPaper: {
width: drawerWidth,
},
drawerContainer: {
overflow: "auto",
},
root: {
width: "100%",
maxWidth: 360,
backgroundColor: theme.palette.background.paper,
},
nested: {
paddingLeft: theme.spacing(4),
},
}));
export default function SideBar() {
const classes = useStyles();
const [open, setOpen] = React.useState(true);
const handleClick = () => {
setOpen(!open);
};
return (
<Drawer
className={classes.drawer}
variant="permanent"
classes={{
paper: classes.drawerPaper,
}}
>
<Toolbar />
<div className={classes.drawerContainer}>
<List
component="nav"
aria-labelledby="nested-list-subheader"
className={classes.root}
>
<ListItem button>
<ListItemIcon>
<HomeIcon />
</ListItemIcon>
<ListItemText primary="Home" />
</ListItem>
<ListItem button onClick={handleClick}>
<ListItemIcon>
<SupervisorAccountIcon />
</ListItemIcon>
<ListItemText primary="Administrators" />
{open ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse in={open} timeout="auto" unmountOnExit>
<List component="div" disablePadding>
<ListItem button className={classes.nested}>
<ListItemIcon>
<VisibilityIcon />
</ListItemIcon>
<ListItemText primary="View" />
</ListItem>
<ListItem button className={classes.nested}>
<ListItemIcon>
<AddIcon />
</ListItemIcon>
<ListItemText primary="Add administrator" />
</ListItem>
</List>
</Collapse>
<ListItem button onClick={handleClick}>
<ListItemIcon>
<AccessibilityNewIcon />
</ListItemIcon>
<ListItemText primary="Trainers" />
{open ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse in={open} timeout="auto" unmountOnExit>
<List component="div" disablePadding>
<ListItem button className={classes.nested}>
<ListItemIcon>
<VisibilityIcon />
</ListItemIcon>
<ListItemText primary="View" />
</ListItem>
<ListItem button className={classes.nested}>
<ListItemIcon>
<AddIcon />
</ListItemIcon>
<ListItemText primary="Add trainer" />
</ListItem>
</List>
</Collapse>
</List>
</div>
</Drawer>
);
}
知道怎么做吗?
使用类似的东西。这不是最好的解决方案。但它会起作用。您也可以使用 ref.
handleClick = (id) => {
setOpen(id);
}
<ListItem button onClick={() => handleClick('item1')}>
<ListItemIcon>
<AccessibilityNewIcon />
</ListItemIcon>
<ListItemText primary="Trainers" />
{open ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse in={open === 'item1'} timeout="auto" unmountOnExit>
<List component="div" disablePadding>
<ListItem button className={classes.nested}>
<ListItemIcon>
<VisibilityIcon />
</ListItemIcon>
<ListItemText primary="View" />
</ListItem>
<ListItem button className={classes.nested}>
<ListItemIcon>
<AddIcon />
</ListItemIcon>
<ListItemText primary="Add trainer" />
</ListItem>
</List>
</Collapse>
您可以使用渲染道具。这是一个 CodeSandbox。
我们可以通过为列表项设置id并在调用handleClick方法时检索它来实现。除了设置 id,项目名称也可以直接传递给上面回答的 handleClick 方法。
Link: CodeSandBox
import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Drawer from "@material-ui/core/Drawer";
import Toolbar from "@material-ui/core/Toolbar";
import List from "@material-ui/core/List";
import ListItem from "@material-ui/core/ListItem";
import ListItemIcon from "@material-ui/core/ListItemIcon";
import ListItemText from "@material-ui/core/ListItemText";
import Collapse from "@material-ui/core/Collapse";
import ExpandLess from "@material-ui/icons/ExpandLess";
import ExpandMore from "@material-ui/icons/ExpandMore";
import HomeIcon from "@material-ui/icons/Home";
import SupervisorAccountIcon from "@material-ui/icons/SupervisorAccount";
import AccessibilityNewIcon from "@material-ui/icons/AccessibilityNew";
import VisibilityIcon from "@material-ui/icons/Visibility";
import AddIcon from "@material-ui/icons/Add";
const drawerWidth = 260;
const useStyles = makeStyles(theme => ({
drawer: {
width: drawerWidth,
flexShrink: 0
},
drawerPaper: {
width: drawerWidth
},
drawerContainer: {
overflow: "auto"
},
root: {
width: "100%",
maxWidth: 360,
backgroundColor: theme.palette.background.paper
},
nested: {
paddingLeft: theme.spacing(4)
}
}));
export default function SideBar() {
const classes = useStyles();
const [openedItemId, setOpenedItemId] = React.useState(true);
const handleClick = orgEvent => {
let clickedItemId = orgEvent.currentTarget.id;
if (openedItemId === clickedItemId) {
setOpenedItemId("");
} else {
setOpenedItemId(clickedItemId);
}
//setOpen(!open);
};
return (
<Drawer
className={classes.drawer}
variant="permanent"
classes={{
paper: classes.drawerPaper
}}
>
<Toolbar />
<div className={classes.drawerContainer}>
<List
component="nav"
aria-labelledby="nested-list-subheader"
className={classes.root}
>
<ListItem button>
<ListItemIcon>
<HomeIcon />
</ListItemIcon>
<ListItemText primary="Home" />
</ListItem>
<ListItem id="item-administrators" button onClick={handleClick}>
<ListItemIcon>
<SupervisorAccountIcon />
</ListItemIcon>
<ListItemText primary="Administrators" />
{openedItemId === "item-administrators" ? (
<ExpandLess />
) : (
<ExpandMore />
)}
</ListItem>
<Collapse
in={openedItemId === "item-administrators"}
timeout="auto"
unmountOnExit
>
<List component="div" disablePadding>
<ListItem button className={classes.nested}>
<ListItemIcon>
<VisibilityIcon />
</ListItemIcon>
<ListItemText primary="View" />
</ListItem>
<ListItem button className={classes.nested}>
<ListItemIcon>
<AddIcon />
</ListItemIcon>
<ListItemText primary="Add administrator" />
</ListItem>
</List>
</Collapse>
<ListItem id="item-trainers" button onClick={handleClick}>
<ListItemIcon>
<AccessibilityNewIcon />
</ListItemIcon>
<ListItemText primary="Trainers" />
{openedItemId === "item-trainers" ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse
in={openedItemId === "item-trainers"}
timeout="auto"
unmountOnExit
>
<List component="div" disablePadding>
<ListItem button className={classes.nested}>
<ListItemIcon>
<VisibilityIcon />
</ListItemIcon>
<ListItemText primary="View" />
</ListItem>
<ListItem button className={classes.nested}>
<ListItemIcon>
<AddIcon />
</ListItemIcon>
<ListItemText primary="Add trainer" />
</ListItem>
</List>
</Collapse>
</List>
</div>
</Drawer>
);
}