目前,我的所有列表均已折叠,但它们链接到一个状态为“打开”,因此,如果我打开一个列表,则所有其他列表都将打开。 在不使每个列表具有很多状态的情况下,使崩溃彼此分开的最佳方法是什么。
编辑:应用程序正在经历无限循环
App.tsx
interface IState {
error: any,
intro: any,
threads: any[],
title: any,
}
export default class App extends React.Component<{}, IState> {
constructor (props : any) {
super (props);
this.state = {
error: "",
intro: "Welcome to RedQuick",
threads: [],
title: ""
};
this.getRedditPost = this.getRedditPost.bind(this)
this.handleClick = this.handleClick.bind(this)
}
public getRedditPost = async (e : any) => {
e.preventDefault();
const subreddit = e.target.elements.subreddit.value;
const redditAPI = await fetch('https://www.reddit.com/r/'+ subreddit +'.json');
const data = await redditAPI.json();
console.log(data);
if (data.kind) {
this.setState({
error: undefined,
intro: undefined,
threads: data.data.children,
title: data.data.children[0].data.subreddit.toUpperCase()
});
} else {
this.setState({
error: "Please enter a valid subreddit name",
intro: undefined,
threads: [],
title: undefined
});
}
}
public handleClick = (index : any) => {
this.setState({ [index]: true });
}
public render() {
return (
<div>
<Header
getRedditPost={this.getRedditPost}
/>
<p className="app__intro">{this.state.intro}</p>
{
this.state.error === "" && this.state.title.length > 0 ?
<LinearProgress />:
<ThreadList
error={this.state.error}
handleClick={this.handleClick}
threads={this.state.threads}
title={this.state.title}
/>
}
</div>
);
}
}
Threadlist.tsx
<div className="threadlist__subreddit_threadlist">
<List>
{ props.threads.map((thread : any, index : any) =>
<div key={index} className="threadlist__subreddit_thread">
<Divider />
<ListItem button={true} onClick={props.handleClick(index)}/* component="a" href={thread.data.url}*/ >
<ListItemText primary={thread.data.title} secondary={<p><b>Author: </b>{thread.data.author}</p>} />
{props[index] ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse in={props[index]} timeout="auto" unmountOnExit={true}>
<p>POOP</p>
</Collapse>
<Divider />
</div>
) }
</List>
</div>
答案 0 :(得分:5)
您必须为每次折叠创建一个不同的状态,我建议将setState与从map函数获得的索引一起动态使用setState,您可能必须将index参数传递给handleClick函数并根据该状态更改状态>
<div className="threadlist__subreddit_threadlist">
<List>
{ props.threads.map((thread : any, index : any) =>
<div key={index} className="threadlist__subreddit_thread">
<Divider />
<ListItem button={true} onClick={props.handleClick(index)}/* component="a" href={thread.data.url}*/ >
<ListItemText primary={thread.data.title} secondary={<p><b>Author: </b>{thread.data.author}</p>} />
{props[index] ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse in={props[index]} timeout="auto" unmountOnExit={true}>
<p>POOP</p>
</Collapse>
<Divider />
</div>
) }
</List>
</div>
您的handleClick应该看起来像这样: 公开
public handleClick = (index : any) => {
this.setState({ [index]: true });
}
答案 1 :(得分:4)
我是以这种方式完成的:
function DrawerMenuItems() {
const [selectedIndex, setSelectedIndex] = React.useState("")
const handleClick = index => {
if (selectedIndex === index) {
setSelectedIndex("")
} else {
setSelectedIndex(index)
}
}
return (
<List
component="nav"
aria-labelledby="nested-list-subheader"
subheader={
<ListSubheader component="div" id="nested-list-subheader">
Nested List Items
</ListSubheader>
}
>
{drawerMenuItemData.map((item, index) => {
return (
<List>
<ListItem
key={index}
button
onClick={() => {
handleClick(index)
}}
>
<ListItemIcon>
<item.icon />
</ListItemIcon>
<ListItemText primary={item.title} />
{index === selectedIndex ? <ExpandLess /> : <ExpandMore />}
</ListItem>
<Collapse in={index === selectedIndex} timeout="auto" unmountOnExit>
<List component="div" disablePadding>
{item.submenu.map((sub, index) => {
return (
<ListItem button >
<ListItemText primary={sub.name} />
</ListItem>
)
})}
</List>
</Collapse>
</List>
)
})}
</List>
)
}