react实现平铺组件
实现平铺组件的核心思路
平铺组件通常指以网格或瀑布流形式展示的布局,常见于图片墙、商品列表等场景。React中可通过CSS Grid、Flexbox或第三方库实现。
使用CSS Grid实现
CSS Grid适合规则网格布局,通过display: grid定义容器,子项自动平铺:
import React from "react";
import "./GridLayout.css";
const GridLayout = ({ items }) => {
return (
<div className="grid-container">
{items.map((item) => (
<div key={item.id} className="grid-item">
{item.content}
</div>
))}
</div>
);
};
export default GridLayout;
配套CSS文件示例:
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 16px;
padding: 16px;
}
.grid-item {
background: #f0f0f0;
border-radius: 8px;
padding: 16px;
}
使用Flexbox实现
Flexbox适合更灵活的流动布局,通过flex-wrap实现换行:
const FlexLayout = ({ items }) => {
return (
<div style={{
display: 'flex',
flexWrap: 'wrap',
gap: '16px',
padding: '16px'
}}>
{items.map((item) => (
<div key={item.id} style={{
flex: '1 1 200px',
background: '#f0f0f0',
borderRadius: '8px',
padding: '16px'
}}>
{item.content}
</div>
))}
</div>
);
};
使用Masonry瀑布流布局
不规则高度项目可使用瀑布流库如react-masonry-css:
npm install react-masonry-css
实现代码:
import Masonry from "react-masonry-css";
const breakpointColumnsObj = {
default: 4,
1100: 3,
700: 2,
500: 1
};
const MasonryLayout = ({ items }) => {
return (
<Masonry
breakpointCols={breakpointColumnsObj}
className="masonry-grid"
columnClassName="masonry-grid_column"
>
{items.map((item) => (
<div key={item.id} style={{ marginBottom: "16px" }}>
{item.content}
</div>
))}
</Masonry>
);
};
响应式设计要点
-
使用相对单位(如
fr、%)而非固定像素 -
通过媒体查询调整列数:
@media (max-width: 768px) { .grid-container { grid-template-columns: repeat(2, 1fr); } } -
考虑使用CSS变量动态控制间距:
:root { --grid-gap: 16px; }
.grid-container { gap: var(--grid-gap); }
### 性能优化建议
大数据量场景下建议使用虚拟滚动库如`react-window`:
```bash
npm install react-window
示例实现:
import { FixedSizeGrid as Grid } from 'react-window';
const VirtualGrid = ({ data }) => {
const Cell = ({ columnIndex, rowIndex, style }) => (
<div style={style}>
{data[rowIndex * 4 + columnIndex].content}
</div>
);
return (
<Grid
columnCount={4}
columnWidth={200}
height={600}
rowCount={Math.ceil(data.length / 4)}
rowHeight={200}
width={800}
>
{Cell}
</Grid>
);
};






