如何使 React Material-UI 中的 GridList 组件具有响应性
Posted
技术标签:
【中文标题】如何使 React Material-UI 中的 GridList 组件具有响应性【英文标题】:How to make the GridList component in React Material-UI responsive 【发布时间】:2018-08-01 22:48:31 【问题描述】:我正在使用 Material-UI 版本 1 在我的 React 应用程序中制作网格 UI。我想让网格响应。 GridList 组件 API 有 cols 属性,默认为 2。
例如,它可能如下所示。
<GridList cols=1 spacing=32 className="list"></GridList>
我可以动态更改道具吗?或者有没有其他方法让它响应?
【问题讨论】:
【参考方案1】:你可以使用 MUI 提供的layout breakpoints 来切换 GridList 或 GridListTile cols 属性。 代码将如下所示:
...
import withWidth, isWidthUp from '@material-ui/core/withWidth';
...
const MyComponent = props =>
const getGridListCols = () =>
if (isWidthUp('xl', props.width))
return 4;
if (isWidthUp('lg', props.width))
return 3;
if (isWidthUp('md', props.width))
return 2;
return 1;
return(
...
<GridList spacing=15 cellHeight=400 cols=getGridListCols()>
myItemsArray.map(item => (
<GridListTile key=item cols=1>
<FooBar />
</GridListTile>
))
</GridList>
...
);
;
...
export default withWidth()(MyComponent);
【讨论】:
这会在调整屏幕大小时更新列数吗? 是的,这将在调整屏幕大小时更新列数,因为 HOC(高阶组件)withWidth
将在浏览器宽度更改时请求重新渲染。注意:您现在可以按照此处的建议使用 useWidth
React 挂钩。【参考方案2】:
您可以根据宽度 (xs, sm, md, lg, xl
) 选择 cols
值,请查看此示例,其中为较小的屏幕设置了 1 列。
import React from "react";
import connect from 'react-redux';
import PropTypes from 'prop-types';
import compose from 'recompose/compose';
// @material-ui/core components
import withStyles from "@material-ui/core/styles/withStyles";
import withWidth from '@material-ui/core/withWidth';
import GridList from '@material-ui/core/GridList';
import GridListTile from '@material-ui/core/GridListTile';
import GridListTileBar from '@material-ui/core/GridListTileBar';
const styles = theme => ( );
class MyComponent extends React.Component
render()
const classes, currentUser, images, width = this.props;
let columns = width === 'xs' || width === 'sm' ? 1 : 2;
return (
<div className=classes.root>
<GridList cellHeight=180 cols=columns className=classes.gridList>
images.map(image => (
<GridListTile key=image.id>
<img src= image.path />
<GridListTileBar
title= image.name
/>
</GridListTile>
))
</GridList>
</div>
);
MyComponent.propTypes =
currentUser: PropTypes.object,
images: PropTypes.array.isRequired
;
function mapStateToProps(state)
return
currentUser: state.user.currentUser
;
export default compose(
withStyles(styles,
name: 'MyComponent',
),
withWidth(),
connect(mapStateToProps),
)(MyComponent);
【讨论】:
【参考方案3】:从 Material-UI v4.4 开始,您可以将 use useMediaQuery
React hook 与 theme.breakpoints.up
结合使用:
import useMediaQuery from '@material-ui/core/useMediaQuery';
function MyComponent()
const matches = useMediaQuery(theme => theme.breakpoints.up('sm'));
return <span>`theme.breakpoints.up('sm') matches: $matches`</span>;
⚠️ 没有默认主题支持,您必须将其注入到父主题提供程序中。
【讨论】:
【参考方案4】:我刚遇到这个问题,在使用@morlo 的答案时,我犯了一个错误,它开始显示一个 js 错误,但奇怪的是它也让它响应了!所谓响应式,我的意思是它显示了移动设备中常见的水平滚动。
所以我删除了该代码并使用了不同的值,cols=0 起作用了!
也许它没有记录,但它确实有效。
还值得一提的是我使用的其他一些设置:
<GridList style=
width: '100%',
maxHeight: 320,
flexWrap: 'nowrap'
cols=0 cellHeight='auto'>
...
</GridList>
【讨论】:
这并不能解决问题。无论屏幕大小如何,都会“部分”显示一列。【参考方案5】:当你说你想让网格响应时,你的意思是动态添加更多项目吗?如果没有,默认情况下Material-UI
是响应式的(这意味着您的视口会根据您查看的设备动态调整大小),并且根据您的GridList
属性(如列、行、间距等),您可以确定样式。如果您查看https://material-ui-next.com/demos/grid-list/,这里有一些示例可以帮助您入门。
【讨论】:
@sflow 您觉得以上内容对解决您的问题有帮助吗? 这没有帮助,因为它没有回答他的要求。他在问如何动态更改cols
属性:)以上是关于如何使 React Material-UI 中的 GridList 组件具有响应性的主要内容,如果未能解决你的问题,请参考以下文章
如何使 Material-UI Dialog 在 React 中工作
如何覆盖(覆盖)material-ui(React)中的类和样式
如何使用 react-testing-library 测试包装在 withStyles 中的样式化 Material-UI 组件?
如何在 typescript 环境中的 material-ui 按钮内渲染 react-router-dom NavLink 的 activeClassName 样式?