use*_*808 4 expand reactjs material-ui
我正在使用 React JS - Material UI ListItem (使用 Collapse API)实现列表的展开/折叠功能
当我单击 ListItem 时,它会展开/折叠所有子列表项而不是选定的子列表项。
这是示例代码。看起来我在其中一个元素中设置了不正确的键值,但无法弄清楚。有人能帮我吗?如果信息不充分,请告诉我
贾法尔
class CategoriesResults extends Component {
constructor(props) {
super(props);
this.state = {
open: false
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log("Handle Clicked....");
this.setState(prevState => ({
open: !prevState.open
}));
}
render() {
const docs = data.documents; //this coming from a json file, please see below for the sample json
return (
<div>
<List component='nav' aria-labelledby='nested-list-subheader'>
{docs.map(doc => {
return (
<div key={doc.Id}>
<ListItem button key={doc.Id} onClick={this.handleClick}>
<ListItemText primary={doc.Name} />
{this.state.open ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse
key={doc.Sheets.Id}
in={this.state.open}
timeout='auto'
unmountOnExit
>
<List component='li' disablePadding key={doc.Id}>
{doc.Sheets.map(sheet => {
return (
<ListItem button key={sheet.Id}>
<ListItemIcon>
<InsertDriveFileTwoToneIcon />
</ListItemIcon>
<ListItemText key={sheet.Id} primary={sheet.Title} />
</ListItem>
);
})}
</List>
</Collapse>
<Divider />
</div>
);
})}
</List>
</div>
);
}
}
**Sample JSON**
{
"documents": [
{
"Id": 1,
"Name": "Category 1",
"Sheets": [
{
"Id": 1,
"Title": "Title1 "
},
{
"Id": 2,
"Title": "Title 2"
},
{
"Id": 3,
"Title": "Title 3"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
has*_*aib 10
我已将其转换为一个使用钩子的基于函数的组件,以便未来的人们可以轻松理解它:
import React, { useState } from 'react'
const CustomizedListItem = ({ doc }) => {
const [ open, setOpen ] = useState(false)
const handleClick = () => {
setOpen(!open)
}
return (
<div>
<ListItem button key={doc.Id} onClick={handleClick}>
<ListItemText primary={doc.Name} />
{open ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse
key={doc.Sheets.Id}
in={open}
timeout='auto'
unmountOnExit
>
<List component='li' disablePadding key={doc.Id}>
{doc.Sheets.map(sheet => {
return (
<ListItem button key={sheet.Id}>
<ListItemIcon>
{/* <InsertDriveFileTwoToneIcon /> */}
</ListItemIcon>
<ListItemText key={sheet.Id} primary={sheet.Title} />
</ListItem>
)
})}
</List>
</Collapse>
<Divider />
</div>
)
}
export default function CategoriesResults() {
const docs = data.documents //this coming from a json file
return (
<div>
<List component='nav' aria-labelledby='nested-list-subheader'>
{docs.map(doc => {
return (
<CustomizedListItem key={doc.id} doc={doc} />
)
})}
</List>
</div>
)
}
Run Code Online (Sandbox Code Playgroud)
您的所有 ListItems 都会根据相同的状态展开。
如果 open 是true
,则所有这些都进入in=true
其Collapse
组件,因此所有这些都被展开。
要解决这个问题,您应该将可扩展的 ListItem 提取到一个单独的组件中,该组件将管理它自己的状态:
class CustomizedListItem extends React.Component {
constructor(props) {
super(props);
this.state = {
open: false
};
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log("Handle Clicked....");
this.setState(prevState => ({
open: !prevState.open
}));
}
render(){
const { doc } = this.props;
return (
<div>
<ListItem button key={doc.Id} onClick={this.handleClick}>
<ListItemText primary={doc.Name} />
{this.state.open ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse
key={doc.Sheets.Id}
in={this.state.open}
timeout='auto'
unmountOnExit
>
<List component='li' disablePadding key={doc.Id}>
{doc.Sheets.map(sheet => {
return (
<ListItem button key={sheet.Id}>
<ListItemIcon>
{/* <InsertDriveFileTwoToneIcon /> */}
</ListItemIcon>
<ListItemText key={sheet.Id} primary={sheet.Title} />
</ListItem>
);
})}
</List>
</Collapse>
<Divider />
</div>
)
}
}
export default class CategoriesResults extends React.Component {
render() {
const docs = data.documents; //this coming from a json file, please see below for the sample json
return (
<div>
<List component='nav' aria-labelledby='nested-list-subheader'>
{docs.map(doc => {
return (
<CustomizedListItem key={doc.id} doc={doc} />
);
})}
</List>
</div>
);
}
}
Run Code Online (Sandbox Code Playgroud)
我使用了类组件,因为您在问题中使用了它。如果您想使用react-hooks看到相同的解决方案,请告诉我:)
归档时间: |
|
查看次数: |
11823 次 |
最近记录: |