material-ui 布局,容器上的断点
material-ui layout, breakpoints on containers
我正在开始一个新项目并学习 React。
我以前有使用 Twitter bootstrap 的经验,但选择了 material-ui。
我也选择了 material-ui@next,因为它包含布局系统 (https://material-ui-1dab0.firebaseapp.com/layout/responsive-ui)
至此我已经成功使用Layout的container和item根据不同的断点重新排列容器中的item
但我也希望能够使容器响应,这意味着根据相同的断点为 'align'、'direction' 和 'justify 赋予不同的值。
<Layout
container
>
<Layout item md={2} sm={12}>
<Layout
container
align={"stretch"}
direction={"row"}
justify={"center"}
// more Layout items here
</Layout>
</Layout>
<Layout item md={10} sm={12}>
<Layout
container
direction={"column"}
justify={"space-around"}
align={"flex-start"}
>
// more Layout items here
</Layout>
</Layout>
</Layout>
在这个例子中,布局项目会根据断点md和sm适当调整大小,但容器没有这样的规则(例如我想在断点为md时对齐为'flex-start' , 和 'center' 当断点是 sm.
所以我的问题是:'breakpoints' (xs, sm, md, lg, xl) 可用于修改项目在一行中的分布方式。那么是否可以使用相同的断点来修改容器如何分发它们的项目?
非常感谢。
您可以通过 jss-theme-reactor 使用媒体查询来处理此问题:
const styleSheet = createStyleSheet('test', theme => ({
gridItem: {
alignItems: 'center',
},
[theme.breakpoints.up('md')]: {
gridItem: {
alignItems: 'flex-start',
},
},
}));
const testComponent = (props, { styleManager }) => {
const classes = styleManager.render(styleSheet);
return (
<Grid container>
<Grid item md={2} sm={12} className={classes.gridItem}>
<div>Hi, I'm in an item.</div>
</Grid>
<Grid item md={10} sm={12} className={classes.gridItem}>
<div>Yeah, me too.</div>
</Grid>
</Grid>
);
};
或者,您可以使用 withWidth HOC 来处理这个问题(它用宽度 属性 装饰组件):
import withWidth, { isWidthUp } from 'material-ui/utils/withWidth';
const styleSheet = createStyleSheet('AppDrawer', theme => ({
gridItemSmall: {
alignItems: 'center',
},
gridItemMedium: {
alignItems: 'flex-start',
},
}));
const testComponent = ({ width }, { styleManager }) => {
const classes = styleManager.render(styleSheet);
const itemClass = isWidthUp('md', width) ? classes.gridItemMedium : classes.gridItemSmall;
return (
<Grid container>
<Grid item md={2} sm={12} className={itemClass}>
<div>Hi, I'm in an item.</div>
</Grid>
<Grid item md={10} sm={12} className={itemClass}>
<div>Yeah, me too.</div>
</Grid>
</Grid>
);
};
export default withWidth()(testComponent);
我正在开始一个新项目并学习 React。
我以前有使用 Twitter bootstrap 的经验,但选择了 material-ui。
我也选择了 material-ui@next,因为它包含布局系统 (https://material-ui-1dab0.firebaseapp.com/layout/responsive-ui)
至此我已经成功使用Layout的container和item根据不同的断点重新排列容器中的item
但我也希望能够使容器响应,这意味着根据相同的断点为 'align'、'direction' 和 'justify 赋予不同的值。
<Layout
container
>
<Layout item md={2} sm={12}>
<Layout
container
align={"stretch"}
direction={"row"}
justify={"center"}
// more Layout items here
</Layout>
</Layout>
<Layout item md={10} sm={12}>
<Layout
container
direction={"column"}
justify={"space-around"}
align={"flex-start"}
>
// more Layout items here
</Layout>
</Layout>
</Layout>
在这个例子中,布局项目会根据断点md和sm适当调整大小,但容器没有这样的规则(例如我想在断点为md时对齐为'flex-start' , 和 'center' 当断点是 sm.
所以我的问题是:'breakpoints' (xs, sm, md, lg, xl) 可用于修改项目在一行中的分布方式。那么是否可以使用相同的断点来修改容器如何分发它们的项目?
非常感谢。
您可以通过 jss-theme-reactor 使用媒体查询来处理此问题:
const styleSheet = createStyleSheet('test', theme => ({
gridItem: {
alignItems: 'center',
},
[theme.breakpoints.up('md')]: {
gridItem: {
alignItems: 'flex-start',
},
},
}));
const testComponent = (props, { styleManager }) => {
const classes = styleManager.render(styleSheet);
return (
<Grid container>
<Grid item md={2} sm={12} className={classes.gridItem}>
<div>Hi, I'm in an item.</div>
</Grid>
<Grid item md={10} sm={12} className={classes.gridItem}>
<div>Yeah, me too.</div>
</Grid>
</Grid>
);
};
或者,您可以使用 withWidth HOC 来处理这个问题(它用宽度 属性 装饰组件):
import withWidth, { isWidthUp } from 'material-ui/utils/withWidth';
const styleSheet = createStyleSheet('AppDrawer', theme => ({
gridItemSmall: {
alignItems: 'center',
},
gridItemMedium: {
alignItems: 'flex-start',
},
}));
const testComponent = ({ width }, { styleManager }) => {
const classes = styleManager.render(styleSheet);
const itemClass = isWidthUp('md', width) ? classes.gridItemMedium : classes.gridItemSmall;
return (
<Grid container>
<Grid item md={2} sm={12} className={itemClass}>
<div>Hi, I'm in an item.</div>
</Grid>
<Grid item md={10} sm={12} className={itemClass}>
<div>Yeah, me too.</div>
</Grid>
</Grid>
);
};
export default withWidth()(testComponent);