Skip to content

Commit 63de960

Browse files
committed
fix(Table): improve page size change handling and ensure current page stays within bounds
1 parent b546c09 commit 63de960

File tree

2 files changed

+40
-34
lines changed

2 files changed

+40
-34
lines changed

packages/components/pagination/pagination.tsx

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -183,34 +183,28 @@ export default defineComponent({
183183
};
184184

185185
const onSelectorChange: (e: string) => void = (e) => {
186-
if (props.disabled) {
187-
return;
188-
}
189-
const pageSize: number = parseInt(e, 10);
190-
let pageCount = 1;
191-
if (pageSize > 0) {
192-
pageCount = Math.max(Math.ceil(props.total / pageSize), 1);
193-
}
186+
if (props.disabled) return;
194187

195-
let isIndexChange = false;
188+
const pageSize: number = parseInt(e, 10);
189+
const newPageCount = pageSize > 0 ? Math.max(Math.ceil(props.total / pageSize), 1) : 1;
196190

197-
if (innerCurrent.value > pageCount) {
198-
isIndexChange = true;
199-
}
191+
// 当前页在变更 pageSize 之后是否会超出新的页码范围
192+
const prevCurrent = innerCurrent.value;
193+
const willExceed = prevCurrent > newPageCount;
200194

201-
/**
202-
* 分页大小变化事件
203-
* @param {Number} pageSize 分页大小
204-
* @param {Number} index 当前页
205-
*/
206195
const pageInfo = {
207-
current: isIndexChange ? pageCount : innerCurrent.value,
208-
previous: innerCurrent.value,
196+
current: willExceed ? newPageCount : prevCurrent,
197+
previous: prevCurrent,
209198
pageSize,
210199
};
200+
201+
// 先设置 pageSize(会触发 onPageSizeChange/onChange 等回调),让外部有机会同步受控 current
211202
setInnerPageSize(pageSize, pageInfo);
212-
if (isIndexChange) {
213-
toPage(pageCount, pageInfo);
203+
204+
if (willExceed) {
205+
// 当前页超出新页码范围时,跳转到最后一页(保持原始同步行为),
206+
// Table 层将优先使用外部受控的 pagination.current 来避免覆盖外部设置(方案 A)。
207+
toPage(newPageCount, pageInfo);
214208
} else {
215209
props.onChange?.(pageInfo);
216210
}

packages/components/table/hooks/usePagination.tsx

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Ref, ref, SetupContext, toRefs, watch } from 'vue';
1+
import { Ref, ref, SetupContext, toRefs, watch, nextTick } from 'vue';
22
import { useConfig } from '@tdesign/shared-hooks';
33
import Pagination, { PageInfo, PaginationProps } from '../../pagination';
44
import { TdBaseTableProps, TableRowData } from '../type';
@@ -72,20 +72,32 @@ export default function usePagination(
7272
size={props.size === 'large' ? null : props.size}
7373
{...paginationProps}
7474
onChange={(pageInfo: PageInfo) => {
75+
// 先触发外部 pagination.onChange/onPageSizeChange 回调
7576
props.pagination?.onChange?.(pageInfo);
76-
innerPagination.value = pageInfo;
77-
updateDataSourceAndPaginate(pageInfo.current, pageInfo.pageSize);
78-
props.onPageChange?.(pageInfo, dataSource.value);
7977

80-
// 当切换分页时,内容区域滚动到顶部
81-
const ref = tableContentRef.value;
82-
if (ref.scrollTo) {
83-
ref.scrollTo({ top: 0, left: 0 });
84-
} else {
85-
// 兼容测试环境或旧浏览器
86-
ref.scrollTop = 0;
87-
ref.scrollLeft = 0;
88-
}
78+
// 延迟到下一个 tick 再读取受控的 pagination.value,这样如果外部在
79+
// onPageSizeChange 中同步设置了 pagination.current(例如重置为 1),
80+
// 我们可以优先使用外部受控值,避免竞态覆盖。
81+
nextTick(() => {
82+
const finalPageInfo = {
83+
...pageInfo,
84+
current: pagination.value?.current ?? pageInfo.current,
85+
pageSize: pagination.value?.pageSize ?? pageInfo.pageSize,
86+
};
87+
innerPagination.value = finalPageInfo;
88+
updateDataSourceAndPaginate(finalPageInfo.current, finalPageInfo.pageSize);
89+
props.onPageChange?.(finalPageInfo, dataSource.value);
90+
91+
// 当切换分页时,内容区域滚动到顶部
92+
const ref = tableContentRef.value;
93+
if (ref.scrollTo) {
94+
ref.scrollTo({ top: 0, left: 0 });
95+
} else {
96+
// 兼容测试环境或旧浏览器
97+
ref.scrollTop = 0;
98+
ref.scrollLeft = 0;
99+
}
100+
});
89101
}}
90102
v-slots={{ totalContent: context.slots.totalContent }}
91103
/>

0 commit comments

Comments
 (0)