反应物料表自动页面大小

时间:2019-09-04 11:14:14

标签: material-design material-ui material-table

我正在使用React +材质表。

我有问题

  • 是否可以根据页面上的可用空间动态设置 pageSize
  • 如果没有API可以这样做-如何从组件设计的角度更好地解决此问题?

我要实现什么目标?

“材料表”中显示的行数应取决于屏幕尺寸。根据您的屏幕尺寸,该页面的外观看起来并不相似(例如,在笔记本电脑上看起来可能不错,但在25英寸显示屏上,会有很多空间可以被行填充)。

我已经做了什么?

  • 我搜索了official documentation,但找不到解决方法。
  • 我还在寻找开发人员帖子和其他SO主题-仍然没有结果。

当然可以构建一个脚本,该脚本根据容器大小和行大小进行一些简单的计算,以填充尽可能多的行,但是我想避免这种解决方案并使用一些现成的方法如果可能的话。

2 个答案:

答案 0 :(得分:2)

我也有同样的要求。因此,我通过使用“ react-virtualized-auto-sizer”软件包中的 AutoSizer 找到了解决方案。与“材料表”软件包配合得很好。

示例代码:

    import AutoSizer from 'react-virtualized-auto-sizer';  

    export default function Monitor() {
    const columns = [...];
    const data = [..];
    return (
        <AutoSizer>
        {({ height, width }) => {
            console.log(`Height: ${height} | Width: ${width}`);
            const pageSize = Math.floor((height - 192) / 48);
            console.log(`Page Size: ${pageSize}`);

            return (
            <div style={{ height: `${height}px`, width: `${width}px`, overflowY: 'auto' }}>
                <MaterialTable
                columns={columns}
                data={data}
                options={{
                    pageSize: pageSize,
                    pageSizeOptions: [],
                    toolbar: true,
                    paging: true
                }}
                icons={tableIcons}
                ></MaterialTable>
            </div>
            );
        }}
        </AutoSizer>
    );
    }

答案 1 :(得分:1)

最适合我的解决方案是跟踪(material-table docs):

 <MaterialTable minRows={10}

    localization={{
    toolbar: {
        searchPlaceholder: "Buscar",
        searchTooltip: "Buscar "
    },
    pagination:{
        labelRowsSelect:"Registros",
        labelRowsPerPage:"Filas por pagina"
    },
    body: {
        deleteTooltip: "Eliminar",
        emptyDataSourceMessage: "No existen registros"
    }
    }}
    title="Listado de registros"
    columns={state.columns}
    data={state.data}
    actions={[
        {
        icon: 'add',
        tooltip: 'Agregar',
        isFreeAction: true,
        onClick: props.addRegister
        }
    ]}

    options={{
        pageSize: 10,
        pageSizeOptions: [5, 10, 20, 30 ,50, 75, 100 ],
        toolbar: true,
        paging: true
    }}

    components={{
        Pagination: props => (
          <TablePagination
            {...props}
            labelRowsPerPage={<div style={{fontSize: 14}}>{props.labelRowsPerPage}</div>}
            labelDisplayedRows={row => <div style={{fontSize: 14}}>{props.labelDisplayedRows(row)}</div>}
            SelectProps={{
              style:{
                fontSize: 14
              }
            }}                    
          />
        )
      }}
    >

    </MaterialTable>