我从报纸上抄了一个例子
Material-UI doco for Appbar
MenuShortcutBar
功能和
MenuShortcutItem
下课。
菜单快捷工具栏
相当简洁;但一旦材料界面样式进入它,我最终需要很多样板。我必须定义一个类,一个需要扩展的属性接口
WithStyles
还有一个构造器。
所以问题是:在使用materialui时,有没有一种简洁的方法来创建样式化的React组件?如何简化
?
import * as React from "react";
import {ReactNode, SyntheticEvent} from "react";
import {
AppBar,
Hidden,
IconButton,
Menu,
MenuItem,
SvgIcon,
Toolbar,
Typography,
withStyles,
WithStyles
} from "@material-ui/core";
import {SvgIconProps} from "@material-ui/core/SvgIcon";
import {SendMailSvg} from "component/svg-icon/SendMailSvg";
export interface MuiAppBarProps extends WithStyles<typeof styles> {
}
class MuiAppBar extends React.Component<
MuiAppBarProps,
{ anchorEl?: HTMLElement, }
>{
constructor(props: MuiAppBarProps, context?: any){
super(props, context);
this.state = {anchorEl: undefined}
}
handleMenu = (event:SyntheticEvent<HTMLElement>) => {
this.setState({ anchorEl: event.currentTarget });
};
handleClose = () => {
this.setState({ anchorEl: undefined });
};
render(){
const { classes } = this.props;
return <div className={classes.root}>
<AppBar position="static" color={"default"}>
<Toolbar variant={"dense"}>
<IconButton className={classes.menuButton} color="inherit">
<MenuIcon/>
</IconButton>
<IconButton className={classes.menuButton} color="inherit">
<SendMailSvg width={"2em"}/>
</IconButton>
<MenuShortcutBar>
<MenuShortcutItem classes={this.props.classes}>
Keywords
</MenuShortcutItem>
<MenuShortcutItem classes={this.props.classes}>
Forwarded
</MenuShortcutItem>
<MenuShortcutItem classes={this.props.classes}>
Rejected
</MenuShortcutItem>
</MenuShortcutBar>
</Toolbar>
</AppBar>
</div>
}
}
...
function MenuShortcutBar(props:{children: ReactNode}){
return <Hidden smDown>
{/* Avoid shortcuts wrapping which causes AppBar to grow in height */}
<span style={{
display: "flex", flexWrap: "nowrap", overflow: "hidden"
}}>
{props.children}
</span>
</Hidden>
}
interface MenuShortcutItemProps extends WithStyles<typeof styles> {
children: React.ReactNode
}
class MenuShortcutItem extends React.Component<
MenuShortcutItemProps,
any
>{
constructor(props: MenuShortcutItemProps, context?: any){
super(props, context);
}
render(){
return <IconButton color="inherit"
className={this.props.classes.menuButton}
>
{this.props.children}
</IconButton>
}
}
const styles = {
root: {
flexGrow: 1,
},
grow: {
flexGrow: 1,
},
menuButton: {
marginLeft: -12,
marginRight: 20,
},
};
export default withStyles(styles)(MuiAppBar);