DataTable
控制台的表格:36px 表头,40px 无分隔线的行,数字右对齐,支持排序、调整列宽、选择和虚拟化。
function Logs() {
const [open, setOpen] = useState<LogRow | null>(null);
const [n, setN] = useState(60);
const data = useMemo(() => logs.slice(0, n), [n]);
return (
<div className="h-480 w-full overflow-y-auto scrollbar-quiet">
<DataTable
aria-label="Request logs"
data={data}
columns={columns}
getRowId={(r) => r.id}
selectable
activeRowId={open?.id}
onRowClick={setOpen}
rowMenu={(r) => (
<>
<Menu.Item icon={icons.openExternal} onClick={() => setOpen(r)}>
Open request
</Menu.Item>
<Menu.Item icon={icons.copy}>Copy request id</Menu.Item>
<Menu.Item icon={icons.filter}>Filter by {r.model}</Menu.Item>
</>
)}
hasMore={n < logs.length}
onLoadMore={() => setN((x) => x + 60)}
/>
<Sheet
open={!!open}
onOpenChange={(o) => !o && setOpen(null)}
title={open ? `${open.method} ${open.endpoint}` : ""}
subtitle={open?.id}
size="md"
modal={false}
>
{open && (
<div className="flex flex-col gap-24">
<RequestTimeline ttfbMs={open.ttfbMs} totalMs={open.latencyMs} />
<KeyValue
items={[
{ label: "Status", value: <StatusCode code={open.status} showText /> },
{ label: "Model", value: open.model, mono: true },
{ label: "Key", value: open.key },
{ label: "Cost", value: `$${open.cost}` },
]}
/>
</div>
)}
</Sheet>
</div>
);
}import { DataTable, col } from "@logicplanes/kaeso-ui";属性
activeRowIdstring显示为当前项的行 ID(已在侧滑面板中打开)。
aria-labelstring表格的无障碍名称。
columnsColumnDef<T, any>[]列,使用 TanStack Table 列定义。
dataT[]行。
density"default" | "compact" | "comfortable"每行占用的空间。
emptyReactNode没有行时显示的内容,通常为
Empty。errorReactNode行数据加载失败:表格在行的位置说明情况并提供“重试”(
onRetry)。错误以 toast 显示,因此不会显示该值;请在请求失败处用 toast 显示消息。freshRowIdsReadonlySet<string>刚到达的行(实时列表):每行显示一个底色,并在一秒内淡出。
getRowId((row: T) => string)返回行的稳定 ID,用于选择和 key。
hasMoreboolean是否还能加载更多行。
loadingboolean首页加载时显示骨架行。
loadingMoreboolean显示正在加载更多行。
manualSortingboolean排序在服务器端完成:数据到达时已排序。
onLoadMore(() => void)调用以加载后续行。
onRetry(() => void)加载失败时显示“重试”按钮。
onRowClick((row: T) => void)点击行时调用;此时行会显示可打开的样式。
onSelectionChange((selection: RowSelectionState) => void)调用时传入所选行。
onSortingChange((sorting: SortingState) => void)调用时传入新的排序方式。
refRef<HTMLDivElement>指向外层元素的 ref。
rowMenu((row: T) => ReactNode)行的上下文菜单(右键)中的项目。
selectableboolean为每一行添加复选框。
selectionRowSelectionState受控时的所选行。
sortingSortingState受控时的排序方式。
stickyFirstColumnboolean横向滚动时保持第一列可见。
virtualizeAbovenumber行数超过此值时,只渲染可见行。