| import React from 'react'; |
| import PropTypes from 'prop-types'; |
| import { createStyles, withStyles, WithStyles } from '@material-ui/core/styles'; |
| import AppBar from '@material-ui/core/AppBar'; |
| import Toolbar from '@material-ui/core/Toolbar'; |
| import Typography from '@material-ui/core/Typography'; |
| import IconButton from '@material-ui/core/IconButton'; |
| import MenuIcon from '@material-ui/icons/Menu'; |
| import AccountCircle from '@material-ui/icons/AccountCircle'; |
| import Switch from '@material-ui/core/Switch'; |
| import FormControlLabel from '@material-ui/core/FormControlLabel'; |
| import FormGroup from '@material-ui/core/FormGroup'; |
| import MenuItem from '@material-ui/core/MenuItem'; |
| import Menu from '@material-ui/core/Menu'; |
| |
| const styles = createStyles({ |
| root: { |
| flexGrow: 1, |
| }, |
| grow: { |
| flexGrow: 1, |
| }, |
| menuButton: { |
| marginLeft: -12, |
| marginRight: 20, |
| }, |
| }); |
| |
| export interface Props extends WithStyles<typeof styles> {} |
| |
| export interface State { |
| auth: boolean; |
| anchorEl: null | HTMLElement; |
| } |
| |
| class MenuAppBar extends React.Component<Props, State> { |
| state: State = { |
| auth: true, |
| anchorEl: null, |
| }; |
| |
| handleChange = (event: React.ChangeEvent<HTMLInputElement>) => { |
| this.setState({ auth: event.target.checked }); |
| }; |
| |
| handleMenu = (event: React.MouseEvent<HTMLElement>) => { |
| this.setState({ anchorEl: event.currentTarget }); |
| }; |
| |
| handleClose = () => { |
| this.setState({ anchorEl: null }); |
| }; |
| |
| render() { |
| const { classes } = this.props; |
| const { auth, anchorEl } = this.state; |
| const open = Boolean(anchorEl); |
| |
| return ( |
| <div className={classes.root}> |
| <FormGroup> |
| <FormControlLabel |
| control={ |
| <Switch checked={auth} onChange={this.handleChange} aria-label="LoginSwitch" /> |
| } |
| label={auth ? 'Logout' : 'Login'} |
| /> |
| </FormGroup> |
| <AppBar position="static"> |
| <Toolbar> |
| <IconButton className={classes.menuButton} color="inherit" aria-label="Menu"> |
| <MenuIcon /> |
| </IconButton> |
| <Typography variant="h6" color="inherit" className={classes.grow}> |
| Photos |
| </Typography> |
| {auth && ( |
| <div> |
| <IconButton |
| aria-owns={open ? 'menu-appbar' : undefined} |
| aria-haspopup="true" |
| onClick={this.handleMenu} |
| color="inherit" |
| > |
| <AccountCircle /> |
| </IconButton> |
| <Menu |
| id="menu-appbar" |
| anchorEl={anchorEl} |
| anchorOrigin={{ |
| vertical: 'top', |
| horizontal: 'right', |
| }} |
| transformOrigin={{ |
| vertical: 'top', |
| horizontal: 'right', |
| }} |
| open={open} |
| onClose={this.handleClose} |
| > |
| <MenuItem onClick={this.handleClose}>Profile</MenuItem> |
| <MenuItem onClick={this.handleClose}>My account</MenuItem> |
| </Menu> |
| </div> |
| )} |
| </Toolbar> |
| </AppBar> |
| </div> |
| ); |
| } |
| } |
| |
| (MenuAppBar as React.ComponentClass<Props>).propTypes = { |
| classes: PropTypes.object.isRequired, |
| } as any; |
| |
| export default withStyles(styles)(MenuAppBar); |
运行结果
| import React from 'react'; |
| import PropTypes from 'prop-types'; |
| import { createStyles, withStyles, WithStyles } from '@material-ui/core/styles'; |
| import AppBar from '@material-ui/core/AppBar'; |
| import Toolbar from '@material-ui/core/Toolbar'; |
| import Typography from '@material-ui/core/Typography'; |
| import IconButton from '@material-ui/core/IconButton'; |
| import MenuIcon from '@material-ui/icons/Menu'; |
| import AccountCircle from '@material-ui/icons/AccountCircle'; |
| import Switch from '@material-ui/core/Switch'; |
| import FormControlLabel from '@material-ui/core/FormControlLabel'; |
| import FormGroup from '@material-ui/core/FormGroup'; |
| import MenuItem from '@material-ui/core/MenuItem'; |
| import Menu from '@material-ui/core/Menu'; |
| |
| const styles = createStyles({ |
| root: { |
| flexGrow: 1, |
| }, |
| grow: { |
| flexGrow: 1, |
| }, |
| menuButton: { |
| marginLeft: -12, |
| marginRight: 20, |
| }, |
| }); |
| |
| export interface Props extends WithStyles<typeof styles> {} |
| |
| export interface State { |
| auth: boolean; |
| anchorEl: null | HTMLElement; |
| } |
| |
| class MenuAppBar extends React.Component<Props, State> { |
| state: State = { |
| auth: true, |
| anchorEl: null, |
| }; |
| |
| handleChange = (event: React.ChangeEvent<HTMLInputElement>) => { |
| this.setState({ auth: event.target.checked }); |
| }; |
| |
| handleMenu = (event: React.MouseEvent<HTMLElement>) => { |
| this.setState({ anchorEl: event.currentTarget }); |
| }; |
| |
| handleClose = () => { |
| this.setState({ anchorEl: null }); |
| }; |
| |
| render() { |
| const { classes } = this.props; |
| const { auth, anchorEl } = this.state; |
| const open = Boolean(anchorEl); |
| |
| return ( |
| <div className={classes.root}> |
| <FormGroup> |
| <FormControlLabel |
| control={ |
| <Switch checked={auth} onChange={this.handleChange} aria-label="LoginSwitch" /> |
| } |
| label={auth ? 'Logout' : 'Login'} |
| /> |
| </FormGroup> |
| <AppBar position="static"> |
| <Toolbar> |
| <IconButton className={classes.menuButton} color="inherit" aria-label="Menu"> |
| <MenuIcon /> |
| </IconButton> |
| <Typography variant="h6" color="inherit" className={classes.grow}> |
| Photos |
| </Typography> |
| {auth && ( |
| <div> |
| <IconButton |
| aria-owns={open ? 'menu-appbar' : undefined} |
| aria-haspopup="true" |
| onClick={this.handleMenu} |
| color="inherit" |
| > |
| <AccountCircle /> |
| </IconButton> |
| <Menu |
| id="menu-appbar" |
| anchorEl={anchorEl} |
| anchorOrigin={{ |
| vertical: 'top', |
| horizontal: 'right', |
| }} |
| transformOrigin={{ |
| vertical: 'top', |
| horizontal: 'right', |
| }} |
| open={open} |
| onClose={this.handleClose} |
| > |
| <MenuItem onClick={this.handleClose}>Profile</MenuItem> |
| <MenuItem onClick={this.handleClose}>My account</MenuItem> |
| </Menu> |
| </div> |
| )} |
| </Toolbar> |
| </AppBar> |
| </div> |
| ); |
| } |
| } |
| |
| (MenuAppBar as React.ComponentClass<Props>).propTypes = { |
| classes: PropTypes.object.isRequired, |
| } as any; |
| |
| export default withStyles(styles)(MenuAppBar); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南