我使用material-ui列表构建了用户仪表板。对于每个listItem,我有一个组件。我想要的是,当我单击列表元素时,有一个专门用于切换组件的部分。我无法实现这个。这是我的代码。我不知道在哪里放onClick
处理程序。我会感激任何领导。甚至在单击特定listItem时登录。然后我可以继续使用反应条件渲染。
在下图中,当用户单击“所有事件”时,将在右侧呈现该组件。单击MyEvents
时,将呈现其组件。
代码:
UserTileData.js
export const profileFolderListItems = (
<div>
<ListItem button>
<ListItemIcon>
<SendIcon />
</ListItemIcon>
<Badge badgeContent={3} color='primary'>
<ListItemText primary='Events attending' />
</Badge>
</ListItem>
<ListItem button>
<ListItemIcon>
<CreateIcon />
</ListItemIcon>
<ListItemText primary='New Event' />
</ListItem>
</div>
)
UserProfilePage.js
class UserProfile extends Component {
constructor (props) {
super(props)
this.state = {
componentTodisplay: null
}
}
render () {
const { classes } = this.props
return (
<div>
<div className={classes.root}>
<Drawer
variant='permanent'
classes={{
paper: classes.drawerPaper
}}
>
<div className={classes.toolbar} />
<List >{eventsFolderListItems}</List>
<Divider />
<List>{profileFolderListItems}</List>
</Drawer>
<main className={classes.content}>
<div className={classes.toolbar} />
{/* componentToDisplay goes here */}
</main>
</div>
</div>
)
}
}
UserProfile.propTypes = {
classes: PropTypes.object.isRequired
}
export default withStyles(styles)(UserProfile)
答案 0 :(得分:2)
为您的代码添加了一些更改。现在它看起来像这样 -
UserTileData.js
export class profileFolderListItems {
constructor(props){
super(props);
}
render() {
return (
<div>
<ListItem button>
<ListItemIcon>
<SendIcon />
</ListItemIcon>
<Badge badgeContent={3} color='primary'>
{/* notice the onClick handler here */}
<ListItemText primary='Events attending' onClick={() => this.props.onSelectChange('events')}
</Badge>
</ListItem>
<ListItem button>
<ListItemIcon>
<CreateIcon />
</ListItemIcon>
<ListItemText primary='New Event' />
</ListItem>
</div>
)
}
}
UserProfile.js
import { profileFolderListItems, eventsFolderListItems} from './UserTitleData';
class UserProfile extends Component {
constructor (props) {
super(props)
this.state = {
value: null
};
this.handleSelectOption = this.handleSelectOption.bind(this);
}
handleSelectOption(value) {
this.setState({
value: value
});
}
render () {
const { classes } = this.props;
return (
<div>
<div className={classes.root}>
<Drawer
variant='permanent'
classes={{
paper: classes.drawerPaper
}}
>
<div className={classes.toolbar} />
</Drawer>
<main className={classes.content}>
<div className={classes.toolbar} />
{/* notice the conditional rendering here */}
{this.state.value === 'events' ?
(<List>
<profileFolderListItems
onSelectChange={this.handleSelectOption}
/>
</List>) :
this.state.value === 'profile' ?
(
<List>
<profileFolderListItems
onSelectChange={this.handleSelectOption}
/>
</List>
) : null}
</main>
</div>
</div>
)
}
基本上我在这里做的是 -
ListItemText
传递给onClick处理程序。 (对于每个选项,它应该是唯一的。我只在这里传递events
)将值提升到父组件 - UserProfilePage
。 (React的唯一事实来源,除非您使用的是Redux)
基于传递值的条件渲染。
希望你明白了。
答案 1 :(得分:1)
您应该使用React Router(或任何类似的路由库)。
https://github.com/ReactTraining/react-router
https://reacttraining.com/react-router/web/example/basic
在下图中,当用户单击“所有事件”时,将显示一个组件 在右边呈现。单击MyEvents时,组件 为它,渲染。
如果用户可以浏览到/my-events
和/all-events
,或者将其添加为书签,则可能也会有所帮助。当用户在浏览器中按下后退/前进按钮时怎么办?
使用路由库解决了所有这些问题(以及更多!) 。