布局
传统表格布局的问题
传统表格因为响应式适配能力差而名声不佳。在移动端,在水平方向上渲染较长内容时,只有有限的灵活性:
- 允许用户水平滚动查看表格内容
- 在较小的设备上隐藏不重要的列字段
这两者在 Filament 上都能实现。表格会在内容溢出时自动水平滚动,而且你可以基于浏览器的响应式临界点显示或隐藏字段。要实现该功能,请使用 visibleFrom()
或 hiddenFrom()
方法:
use Filament\Tables\Columns\TextColumn;
TextColumn::make('slug')
->visibleFrom('md')
这很好,但仍然存在一个明显的问题 - 在移动设备上,用户在不滚动的情况下无法同时看到表行中的许多信息。
值得庆幸的是,Filament 可以让您在不接触 HTML 或 CSS 的情况下构建响应式的类表接口。通过这些布局,您可以在每个响应断点处准确定义内容在表行中的显示位置。
![Table with responsive layout](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/demo.jpg?raw=true)
![Table with responsive layout on mobile](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/demo/mobile.jpg?raw=true)
移动端上允许列堆叠
让我们来了解一个组件 - Split
:
use Filament\Support\Enums\FontWeight;
use Filament\Tables\Columns\Layout\Split;
use Filament\Tables\Columns\TextColumn;
Split::make([
ImageColumn::make('avatar')
->circular(),
TextColumn::make('name')
->weight(FontWeight::Bold)
->searchable()
->sortable(),
TextColumn::make('email'),
])
![Table with a split layout](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/split.jpg?raw=true)
![Table with a split layout on mobile](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/split/mobile.jpg?raw=true)
Split
组件用于包裹列字段,并允许他们在移动端堆叠。
默认情况下,Split 中的列会始终显示在彼此旁边。不过,你可以使用 from()
选择一个该行为开始的响应式临界点。在此临界点之前,列字段将会彼此堆叠在一起:
use Filament\Support\Enums\FontWeight;
use Filament\Tables\Columns\Layout\Split;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn;
Split::make([
ImageColumn::make('avatar')
->circular(),
TextColumn::make('name')
->weight(FontWeight::Bold)
->searchable()
->sortable(),
TextColumn::make('email'),
])->from('md')
本例中,这些列只会在 md
临界点以上的设备中水平展开显示:
![Table with a split layout on desktop](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/split-desktop.jpg?raw=true)
![Table with a stacked layout on mobile](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/split-desktop/mobile.jpg?raw=true)
防止列中创建空格
像表格列字段一样,Split 会自动调整空格以确保每个列能适当分开。你可以使用 grow(false)
防止该行为。本例中,我们将确保头像紧贴着名称字段:
use Filament\Support\Enums\FontWeight;
use Filament\Tables\Columns\Layout\Split;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn;
Split::make([
ImageColumn::make('avatar')
->circular()
->grow(false),
TextColumn::make('name')
->weight(FontWeight::Bold)
->searchable()
->sortable(),
TextColumn::make('email'),
])
其他允许 grow()
的列字段将进行调整,以消耗最新释放的空格:
![Table with a column that doesn't grow](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/grow-disabled.jpg?raw=true)
![Table with a column that doesn't grow on mobile](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/grow-disabled/mobile.jpg?raw=true)
Split 内堆叠
在 Split 内,你可以将多个列字段在垂直方向上堆叠(Stack)。这就让你可以在桌面端的少数列字段中展示更多数据:
use Filament\Support\Enums\FontWeight;
use Filament\Tables\Columns\Layout\Split;
use Filament\Tables\Columns\Layout\Stack;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn;
Split::make([
ImageColumn::make('avatar')
->circular(),
TextColumn::make('name')
->weight(FontWeight::Bold)
->searchable()
->sortable(),
Stack::make([
TextColumn::make('phone')
->icon('heroicon-m-phone'),
TextColumn::make('email')
->icon('heroicon-m-envelope'),
]),
])
![Table with a stack](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/stack.jpg?raw=true)
![Table with a stack on mobile](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/stack/mobile.jpg?raw=true)
在移动端隐藏 Stack
类似于单独的列,您可以根据浏览器的响应式临界点选择隐藏 Stack。为此,可以使用 visibleFrom()
方法:
use Filament\Support\Enums\FontWeight;
use Filament\Tables\Columns\Layout\Split;
use Filament\Tables\Columns\Layout\Stack;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn;
Split::make([
ImageColumn::make('avatar')
->circular(),
TextColumn::make('name')
->weight(FontWeight::Bold)
->searchable()
->sortable(),
Stack::make([
TextColumn::make('phone')
->icon('heroicon-m-phone'),
TextColumn::make('email')
->icon('heroicon-m-envelope'),
])->visibleFrom('md'),
])
![Table with a stack](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/stack-hidden-on-mobile.jpg?raw=true)
![Table with no stack on mobile](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/stack-hidden-on-mobile/mobile.jpg?raw=true)
对齐堆叠内容
默认情况下,Stack 内的列字段在开始处对齐。你可以将 Stack 内的列字段的对齐方式设置为 Alignment::Center
或 Alignment::End
:
use Filament\Support\Enums\Alignment;
use Filament\Support\Enums\FontWeight;
use Filament\Tables\Columns\Layout\Split;
use Filament\Tables\Columns\Layout\Stack;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn;
Split::make([
ImageColumn::make('avatar')
->circular(),
TextColumn::make('name')
->weight(FontWeight::Bold)
->searchable()
->sortable(),
Stack::make([
TextColumn::make('phone')
->icon('heroicon-m-phone')
->grow(false),
TextColumn::make('email')
->icon('heroicon-m-envelope')
->grow(false),
])
->alignment(Alignment::End)
->visibleFrom('md'),
])
请确保将 Stack 内的列字段设置为 grow(false)
,否则它们会伸展至填满 Stack 的整个宽度并遵循它们自己的对齐配置而非 Stack 的对齐方式。
![Table with a stack aligned right](https://github.com/filamentphp/filament/blob/3.x/docs-assets/screenshots/images/light/tables/layout/stack-aligned-right.jpg?raw=true)