|
@@ -903,6 +903,131 @@ function App() {
|
|
|
render(App);
|
|
|
```
|
|
|
|
|
|
+通过 `sticky` 属性可以将表头固定在页面顶部。v2.21 版本支持。传入 `top` 时可以控制距离滚动容器的距离。
|
|
|
+
|
|
|
+<StickyHeaderTable />
|
|
|
+
|
|
|
+```jsx live=false noInline=true dir="column"
|
|
|
+import React, { useState, useMemo } from 'react';
|
|
|
+import { Table, Avatar } from '@douyinfe/semi-ui';
|
|
|
+import { IconMore } from '@douyinfe/semi-icons';
|
|
|
+import * as dateFns from 'date-fns';
|
|
|
+
|
|
|
+const DAY = 24 * 60 * 60 * 1000;
|
|
|
+const figmaIconUrl = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/ptlz_zlp/ljhwZthlaukjlkulzlp/figma-icon.png';
|
|
|
+
|
|
|
+const columns = [
|
|
|
+ {
|
|
|
+ title: '标题',
|
|
|
+ dataIndex: 'name',
|
|
|
+ fixed: true,
|
|
|
+ width: 250,
|
|
|
+ render: (text, record, index) => {
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <Avatar size="small" shape="square" src={figmaIconUrl} style={{ marginRight: 12 }}></Avatar>
|
|
|
+ {text}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ },
|
|
|
+ filters: [
|
|
|
+ {
|
|
|
+ text: 'Semi Design 设计稿',
|
|
|
+ value: 'Semi Design 设计稿',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ text: 'Semi Pro 设计稿',
|
|
|
+ value: 'Semi Pro 设计稿',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ onFilter: (value, record) => record.name.includes(value),
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '大小',
|
|
|
+ dataIndex: 'size',
|
|
|
+ width: 200,
|
|
|
+ sorter: (a, b) => a.size - b.size > 0 ? 1 : -1,
|
|
|
+ render: (text) => `${text} KB`
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '所有者',
|
|
|
+ dataIndex: 'owner',
|
|
|
+ width: 200,
|
|
|
+ render: (text, record, index) => {
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <Avatar size="small" color={record.avatarBg} style={{ marginRight: 4 }}>{typeof text === 'string' && text.slice(0, 1)}</Avatar>
|
|
|
+ {text}
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '更新日期',
|
|
|
+ dataIndex: 'updateTime',
|
|
|
+ width: 200,
|
|
|
+ sorter: (a, b) => a.updateTime - b.updateTime > 0 ? 1 : -1,
|
|
|
+ render: (value) => {
|
|
|
+ return dateFns.format(new Date(value), 'yyyy-MM-dd');
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '',
|
|
|
+ dataIndex: 'operate',
|
|
|
+ fixed: 'right',
|
|
|
+ align: 'center',
|
|
|
+ width: 100,
|
|
|
+ render: () => {
|
|
|
+ return <IconMore />;
|
|
|
+ }
|
|
|
+ },
|
|
|
+];
|
|
|
+
|
|
|
+function App() {
|
|
|
+ const [dataSource, setData] = useState([]);
|
|
|
+
|
|
|
+ const scroll = useMemo(() => ({ y: 300, x: 1200 }), []);
|
|
|
+ const rowSelection = useMemo(() => ({
|
|
|
+ onChange: (selectedRowKeys, selectedRows) => {
|
|
|
+ console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
|
|
|
+ },
|
|
|
+ getCheckboxProps: record => ({
|
|
|
+ disabled: record.name === 'Michael James', // Column configuration not to be checked
|
|
|
+ name: record.name,
|
|
|
+ }),
|
|
|
+ fixed: true,
|
|
|
+ }), []);
|
|
|
+
|
|
|
+ const getData = () => {
|
|
|
+ const data = [];
|
|
|
+ for (let i = 0; i < 46; i++) {
|
|
|
+ const isSemiDesign = i % 2 === 0;
|
|
|
+ const randomNumber = (i * 1000) % 199;
|
|
|
+ data.push({
|
|
|
+ key: '' + i,
|
|
|
+ name: isSemiDesign ? `Semi Design 设计稿${i}.fig` : `Semi Pro 设计稿${i}.fig`,
|
|
|
+ owner: isSemiDesign ? '姜鹏志' : '郝宣',
|
|
|
+ size: randomNumber,
|
|
|
+ updateTime: new Date().valueOf() + randomNumber * DAY,
|
|
|
+ avatarBg: isSemiDesign ? 'grey' : 'red'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return data;
|
|
|
+ };
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ const data = getData();
|
|
|
+ setData(data);
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ return <Table sticky={{ top: 60 }} columns={columns} dataSource={dataSource} rowSelection={rowSelection} scroll={scroll} />;
|
|
|
+}
|
|
|
+
|
|
|
+render(App);
|
|
|
+```
|
|
|
+
|
|
|
+
|
|
|
### 带排序和过滤功能的表头
|
|
|
|
|
|
表格内部集成了过滤器和排序控件,用户可以通过在 Column 中传入 `filters` 以及 `onFilter` 开启表头的过滤器控件展示,传入 `sorter` 开启表头的排序控件的展示。
|
|
@@ -4408,6 +4533,7 @@ render(App);
|
|
|
| scroll | 表格是否可滚动,配置滚动区域的宽或高,详见 [scroll](#scroll) | object | - |
|
|
|
| showHeader | 是否显示表头 | boolean | true |
|
|
|
| size | 表格尺寸,影响表格行 `padding` | "default"\|"middle"\|"small" | "default" | **1.0.0** |
|
|
|
+| sticky | 固定表头 | boolean \| { top: number } | false | **2.21.0** |
|
|
|
| title | 表格标题 | ReactNode<br/>\|(pageData: RecordType[]) => ReactNode | |
|
|
|
| virtualized | 虚拟化配置 | Virtualized | false | **0.33.0** |
|
|
|
| virtualized.itemSize | 每行的高度 | number\|(index: number) => number | 56 | **0.33.0** |
|
|
@@ -4576,40 +4702,40 @@ type Filter = {
|
|
|
|
|
|
## rowSelection
|
|
|
|
|
|
-| 属性 | 说明 | 类型 | 默认值 | 版本 |
|
|
|
-| ---------------- | ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ------ | ---------- |
|
|
|
-| className | 所处列样式名 | string | | |
|
|
|
-| disabled | 表头的 `Checkbox` 是否禁用 | boolean | false | **0.32.0** |
|
|
|
-| fixed | 把选择框列固定在左边 | boolean | false | |
|
|
|
-| getCheckboxProps | 选择框的默认属性配置 | (record: RecordType) => object | | |
|
|
|
-| hidden | 是否隐藏选择列 | boolean | false | **0.34.0** |
|
|
|
-| selectedRowKeys | 指定选中项的 key 数组,需要和 onChange 进行配合 | string[] | | |
|
|
|
-| title | 自定义列表选择框标题 | string\|ReactNode | | |
|
|
|
-| width | 自定义列表选择框宽度 | string\|number | | |
|
|
|
-| onChange | 选中项发生变化时的回调。第一个参数会保存上次选中的 row keys,即使你做了分页受控或更新了 dataSource [FAQ](#faq) | (selectedRowKeys: number[]\|string[], selectedRows: RecordType[]) => void | | |
|
|
|
-| onSelect | 用户手动点击某行选择框的回调 | (record: RecordType, selected: boolean, selectedRows: RecordType[], nativeEvent: MouseEvent) => void | | |
|
|
|
-| onSelectAll | 用户手动点击表头选择框的回调,会选中/取消选中 dataSource 里的所有可选行 | (selected: boolean, selectedRows: RecordType[], changedRows: RecordType[]) => void | | |
|
|
|
+| 属性 | 说明 | 类型 | 默认值 | 版本 |
|
|
|
+|------------------|------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|--------|------------|
|
|
|
+| className | 所处列样式名 | string | | |
|
|
|
+| disabled | 表头的 `Checkbox` 是否禁用 | boolean | false | **0.32.0** |
|
|
|
+| fixed | 把选择框列固定在左边 | boolean | false | |
|
|
|
+| getCheckboxProps | 选择框的默认属性配置 | (record: RecordType) => object | | |
|
|
|
+| hidden | 是否隐藏选择列 | boolean | false | **0.34.0** |
|
|
|
+| selectedRowKeys | 指定选中项的 key 数组,需要和 onChange 进行配合 | string[] | | |
|
|
|
+| title | 自定义列表选择框标题 | string\|ReactNode | | |
|
|
|
+| width | 自定义列表选择框宽度 | string\|number | | |
|
|
|
+| onChange | 选中项发生变化时的回调。第一个参数会保存上次选中的 row keys,即使你做了分页受控或更新了 dataSource [FAQ](#faq) | (selectedRowKeys: number[]\|string[], selectedRows: RecordType[]) => void | | |
|
|
|
+| onSelect | 用户手动点击某行选择框的回调 | (record: RecordType, selected: boolean, selectedRows: RecordType[], nativeEvent: MouseEvent) => void | | |
|
|
|
+| onSelectAll | 用户手动点击表头选择框的回调,会选中/取消选中 dataSource 里的所有可选行 | (selected: boolean, selectedRows: RecordType[], changedRows: RecordType[]) => void | | |
|
|
|
|
|
|
## scroll
|
|
|
|
|
|
-| 属性 | 说明 | 类型 | 默认值 | 版本 |
|
|
|
-| ------------------------ | ---------------------------------------------------------- | -------------- | ------ | --------- |
|
|
|
+| 属性 | 说明 | 类型 | 默认值 | 版本 |
|
|
|
+|--------------------------|--------------------------------------------------------|----------------|--------|-----------|
|
|
|
| scrollToFirstRowOnChange | 当分页、排序、筛选变化后是否自动滚动到表格顶部 | boolean | false | **1.1.0** |
|
|
|
| x | 设置横向滚动区域的宽,可以为像素值、百分比或 'max-content' | string\|number | | |
|
|
|
-| y | 设置纵向滚动区域的高,可以为像素值 | number | | |
|
|
|
+| y | 设置纵向滚动区域的高,可以为像素值 | number | | |
|
|
|
|
|
|
## pagination
|
|
|
|
|
|
翻页组件配置。`pagination` 建议不要使用字面量写法。
|
|
|
|
|
|
-| 属性 | 说明 | 类型 | 默认值 | 版本 |
|
|
|
-| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -------- | ------------ |
|
|
|
-| currentPage | 当前页码 | number | - | |
|
|
|
-| defaultCurrentPage | 默认的当前页码 | number | 1 | **>=1.1.0** |
|
|
|
+| 属性 | 说明 | 类型 | 默认值 | 版本 |
|
|
|
+|--------------------|---------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------|----------|--------------|
|
|
|
+| currentPage | 当前页码 | number | - | |
|
|
|
+| defaultCurrentPage | 默认的当前页码 | number | 1 | **>=1.1.0** |
|
|
|
| formatPageText | 翻页区域文案自定义格式化,传 false 关闭文案显示;该项影响表格翻页区域左侧文案显示,不同于 `Pagination` 组件的 `showTotal` 参数,请注意甄别。 | boolean \| ({ currentStart: number, currentEnd: number, total: number }) => string\|ReactNode | true | **>=0.27.0** |
|
|
|
-| pageSize | 每页条数 | number | 10 | |
|
|
|
-| position | 位置 | 'bottom'\|'top'\|'both' | 'bottom' | |
|
|
|
-| total | 数据总数 | number | 0 | **>=0.25.0** |
|
|
|
+| pageSize | 每页条数 | number | 10 | |
|
|
|
+| position | 位置 | 'bottom'\|'top'\|'both' | 'bottom' | |
|
|
|
+| total | 数据总数 | number | 0 | **>=0.25.0** |
|
|
|
|
|
|
其他配置详见[Pagination](/zh-CN/navigation/pagination#API参考)
|
|
|
|
|
@@ -4618,7 +4744,7 @@ type Filter = {
|
|
|
`resizable` 对象型的参数,主要包括一些表格列伸缩时的事件方法。这些事件方法都可以返回一个对象,该对象会和最终的 column 合并。
|
|
|
|
|
|
| 属性 | 说明 | 类型 | 默认值 |
|
|
|
-| ------------- | ------------------------ | ------------------------------------------------ | ------ |
|
|
|
+|---------------|------------------------|--------------------------------------------------|--------|
|
|
|
| onResize | 表格列改变宽度时触发 | (column: [Column](#Column)) => [Column](#Column) | |
|
|
|
| onResizeStart | 表格列开始改变宽度时触发 | (column: [Column](#Column)) => [Column](#Column) | |
|
|
|
| onResizeStop | 表格列停止改变宽度时触发 | (column: [Column](#Column)) => [Column](#Column) | |
|
|
@@ -4656,8 +4782,8 @@ function Demo() {
|
|
|
}
|
|
|
```
|
|
|
|
|
|
-| 名称 | 描述 | 版本 |
|
|
|
-| -------------------- | ------------------------------------------------------------------------------------------------------------- | ------ |
|
|
|
+| 名称 | 描述 | 版本 |
|
|
|
+|----------------------|------------------------------------------------------------------------------------------------------------|--------|
|
|
|
| getCurrentPageData() | 返回当前页的数据对象:{ dataSource: RecordType[], groups: Map<{groupKey: string, recordKeys: Set<string\>}> } | 0.37.0 |
|
|
|
|
|
|
|