Fra*_*inc 7 html-table css-tables material-ui
我有一种独特的情况,由于列溢出,在向下滚动和/或向右滚动时,我不仅需要标题,而且还需要第一行和前三列保持不变。
Material-UI Table允许我在向下滚动时使标题保持粘性,而不会对溢出产生负面影响,例如以下示例:https : //codesandbox.io/s/209r3p0l3y
在我的表中,标题确实粘贴,但第一行在向下滚动时必须粘贴,而在向左滚动时则必须粘贴(相同的行为)。这是为了使值的溢出保持与标头标签一致。向下和向右滚动时,第一行(尽管不是标题)将与其余几行数据进行比较。同样,前3列也是如此。其他列必须与标题标签和第一行内容保持匹配,但是在完成此操作后,前3列将保持固定在左侧。
重叠多个MUI表是否确实是最佳和/或唯一可行的解决方案?我想不出一个更简单的解决方案,想知道是否有人在局限于MUI表或开发独特的表行为时遇到过这种情况。
小智 6
你可以在没有任何库的情况下制作它。您所要做的就是覆盖它,并根据需要制作它。
我给你这个例子。
import React from "react";
import {
makeStyles,
TableContainer,
TableBody,
TableCell,
TableHead,
TableRow,
Table,
withStyles
} from "@material-ui/core";
const useStyles = makeStyles((theme) => ({
root: {
width: "100%",
marginTop: theme.spacing(3)
},
head: {
backgroundColor: "#fff",
minWidth: "50px"
},
tableContainer: {
maxHeight: "400px"
},
cell: {
minWidth: "100px"
}
}));
const StickyTableCell = withStyles((theme) => ({
head: {
backgroundColor: theme.palette.common.black,
color: theme.palette.common.white,
left: 0,
position: "sticky",
zIndex: theme.zIndex.appBar + 2
},
body: {
backgroundColor: "#ddd",
minWidth: "50px",
left: 0,
position: "sticky",
zIndex: theme.zIndex.appBar + 1
}
}))(TableCell);
const StyledTableCell = withStyles((theme) => ({
head: {
backgroundColor: theme.palette.common.black,
color: theme.palette.common.white
},
body: {
fontSize: 14
}
}))(TableCell);
const StyledTableRow = withStyles((theme) => ({
root: {
"&:nth-of-type(odd)": {
backgroundColor: theme.palette.action.hover
}
}
}))(TableRow);
const App = () => {
let id = 0;
function createData(name, calories, fat, carbs, protein) {
id += 1;
return { id, name, calories, fat, carbs, protein };
}
const data = [
createData("Frozen yoghurt", 159, 6.0, 24, 4.0),
createData("Ice cream sandwich", 237, 9.0, 37, 4.3),
createData("Eclair", 262, 16.0, 24, 6.0),
createData("Cupcake", 305, 3.7, 67, 4.3),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Frozen yoghurt", 159, 6.0, 24, 4.0),
createData("Ice cream sandwich", 237, 9.0, 37, 4.3),
createData("Eclair", 262, 16.0, 24, 6.0),
createData("Cupcake", 305, 3.7, 67, 4.3),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Frozen yoghurt", 159, 6.0, 24, 4.0),
createData("Ice cream sandwich", 237, 9.0, 37, 4.3),
createData("Eclair", 262, 16.0, 24, 6.0),
createData("Cupcake", 305, 3.7, 67, 4.3),
createData("Gingerbread", 356, 16.0, 49, 3.9),
createData("Frozen yoghurt", 159, 6.0, 24, 4.0),
createData("Ice cream sandwich", 237, 9.0, 37, 4.3),
createData("Eclair", 262, 16.0, 24, 6.0),
createData("Cupcake", 305, 3.7, 67, 4.3),
createData("Gingerbread", 356, 16.0, 49, 3.9)
];
const classes = useStyles();
return (
<div>
Sticky Header + Column
<TableContainer className={classes.tableContainer}>
<Table stickyHeader aria-label="sticky table">
<TableHead>
<TableRow>
<StickyTableCell className={classes.head}>
<StyledTableCell className={classes.head} numeric>
Dessert (100g serving)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Calories
</StyledTableCell>
</StickyTableCell>
<StyledTableCell className={classes.head} numeric>
Calories
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Fat (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Carbs (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
<StyledTableCell className={classes.head} numeric>
Protein (g)
</StyledTableCell>
</TableRow>
</TableHead>
<TableBody>
{data.map((n) => {
return (
<StyledTableRow key={n.id}>
<StickyTableCell>
<StyledTableCell
numeric
align="right"
className={classes.cell}
>
{n.name}
</StyledTableCell>
<StyledTableCell
numeric
align="right"
className={classes.cell}
>
{n.calories}
</StyledTableCell>
</StickyTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.fat}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.carbs}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.protein}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.calories}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.fat}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.carbs}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.protein}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.calories}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.fat}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.carbs}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.protein}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.carbs}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.protein}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.calories}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.fat}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.carbs}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.protein}
</StyledTableCell>
<StyledTableCell
numeric
align="center"
className={classes.cell}
>
{n.protein}
</StyledTableCell>
</StyledTableRow>
);
})}
</TableBody>
</Table>
</TableContainer>
</div>
);
};
export default App;
Run Code Online (Sandbox Code Playgroud)
这是codesandbox链接:Codesanbox React + Material-UI Sticky Header and Column
我一直在使用: 我一直在使用:
<TableContainer sx={{ maxHeight: 600 }}>
<Table stickyHeader>
Run Code Online (Sandbox Code Playgroud)
对于标题:
<TableHead>
<TableRow>
<TableCell align="left" style={{ zIndex: 900 }}>Image</TableCell>
<TableCell align="left">Product</TableCell>
<TableCell align="left">User Name</TableCell>
</TableRow>
</TableHead>
Run Code Online (Sandbox Code Playgroud)
对于身体
<TableBody>
<TableRow style={{ background: 'white' }}>
<TableCell
align="left"
style={{
position: 'sticky',
left: 0,
background: 'white',
zIndex: 800,
}}>
Sticky
</TableCell>
<TableCell align="left">test0</TableCell>
<TableCell align="left"test</TableCell>
</TableRow>
</TableBody>
Run Code Online (Sandbox Code Playgroud)
和
</Table>
</TableContainer>
Run Code Online (Sandbox Code Playgroud)
随着时间的推移,Material-UI版本从v1升级到v4,这个问题仍然很好解决。MUI table sticky both row and columns我现在想给出一个解决方案。
我们可以选择使用dx-react-grid-material-ui
Material-UI 的数据网格,具有分页、排序、过滤、分组和编辑功能
该插件使您能够将列固定在网格的左侧和右侧。
用法:
import { Grid as GridTable, TableFixedColumns } from '@devexpress/dx-react-grid-material-ui';
<GridTable
rows={rows}
columns={columns}
>
...
<TableFixedColumns
leftColumns={['colNameA', 'colNameB', 'colNameC']}
/>
</GridTable>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4074 次 |
| 最近记录: |