【发布时间】:2018-10-06 08:24:25
【问题描述】:
我想找到一种使用 Material-UI 在我的应用中轻松定义便利组件的方法。
我从Material-UI doco for Appbar 中复制了一个示例,并尝试引入一些 React 组件以提高可读性。
我的问题是关于 MenuShortcutBar 函数和下面的 MenuShortcutItem 类之间的样板对比。
MenuShortcutBar 相当简洁;但是一旦 Material-UI 样式出现,我最终需要大量的样板文件。我必须定义一个类、一个需要扩展WithStyles 的属性接口和一个构造函数。
所以问题是:在使用 Material-UI 时,有没有一种简洁的方法来创建样式化的 React 组件?如何简化MenuShortcutItem?
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);
【问题讨论】:
标签: reactjs typescript material-ui