diff --git a/packages/casts-table/docs/table.en-US.md b/packages/casts-table/docs/table.en-US.md
index a85908964..75c3ab894 100644
--- a/packages/casts-table/docs/table.en-US.md
+++ b/packages/casts-table/docs/table.en-US.md
@@ -20,10 +20,14 @@ $ pnpm add @casts/table
## Manual pagination
-当 `manualPagination=true` 时,组件内部不会自动处理分页数据,适用于远程加载数据时的分页状态。
+When `manualPagination=true`, paging data is not automatically processed internally by the component, and applies to the paging state when data is loaded remotely.
+## Column pinning
+
+
+
## Selection
diff --git a/packages/casts-table/docs/table.zh-CN.md b/packages/casts-table/docs/table.zh-CN.md
index 6e7a1d186..a9de2b52c 100644
--- a/packages/casts-table/docs/table.zh-CN.md
+++ b/packages/casts-table/docs/table.zh-CN.md
@@ -24,6 +24,10 @@ $ pnpm add @casts/table
+## 固定列
+
+
+
## 可选择
diff --git a/packages/casts-table/examples/column-pinning.tsx b/packages/casts-table/examples/column-pinning.tsx
new file mode 100644
index 000000000..63a6de211
--- /dev/null
+++ b/packages/casts-table/examples/column-pinning.tsx
@@ -0,0 +1,88 @@
+// @ts-ignore example should import React
+import React, { useMemo } from 'react';
+import { Link } from '@casts/link';
+import { Table } from '@casts/table';
+
+const makeData = () => {
+ const names = ['Alice', 'Bob', 'Tom'];
+ const ages = [12, 18, 23, 55, 22];
+ const addresses = [
+ 'New York No. 1 Lake Park',
+ 'London No. 1 Lake Park',
+ 'Sydney No. 1 Lake Park',
+ '833 S Lark Ellen Ave',
+ 'Apt. 279 94808 Maryellen Run, Lake Josefinemouth, OR 24712-1214',
+ 'Apt. 639 17013 Lubowitz Isle, Robertschester, IN 93121-9896',
+ '267 Kemmer Mall, New Rickeyburgh, IN 34429',
+ ];
+
+ return [...Array(100)].map((_, idx) => {
+ return {
+ name: names[idx % names.length],
+ age: ages[idx % ages.length],
+ address1: addresses[idx % addresses.length],
+ address2: addresses[(idx + 1) % addresses.length],
+ address3: addresses[(idx + 2) % addresses.length],
+ address4: addresses[(idx + 3) % addresses.length],
+ address5: addresses[(idx + 4) % addresses.length],
+ address6: addresses[(idx + 4) % addresses.length],
+ };
+ });
+};
+
+const TableColumnPinningDemo = () => {
+ const data = useMemo(() => makeData(), []);
+ return (
+
{
+ if (element) {
+ thRefs.current[header.column.id] = element;
+ } else {
+ delete thRefs.current[header.column.id];
+ }
+ }}
+ className={clsx(
+ thClasses,
+ getColumnPinningClasses({
+ key: header.column.id,
+ fixed: (header.column.columnDef.meta as any)?.fixed,
+ }),
+ )}
style={{
+ ...getColumnPinningStyles({
+ key: header.column.id,
+ fixed: (header.column.columnDef.meta as any)?.fixed,
+ }),
width: some(
pick(header.column.columnDef.meta, [
'size',
@@ -90,7 +126,21 @@ export const Table = forwardRef((props: TableProps, ref: Ref
+ |
{flexRender(
cell.column.columnDef.cell,
cell.getContext(),
diff --git a/packages/casts-table/src/components/types/table.ts b/packages/casts-table/src/components/types/table.ts
index 2b81bc5a2..2dc69d9cb 100644
--- a/packages/casts-table/src/components/types/table.ts
+++ b/packages/casts-table/src/components/types/table.ts
@@ -85,7 +85,7 @@ export type Column | |
---|