From 4086c0081af05c902ac354f0f55286594b0488d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=8F=9C=20Cai?= Date: Wed, 5 Nov 2025 03:59:32 +0800 Subject: [PATCH 1/5] fix(Pagination): improve page size change handling and ensure current page consistency+ --- packages/components/pagination/pagination.tsx | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/packages/components/pagination/pagination.tsx b/packages/components/pagination/pagination.tsx index 969db62a75..7a742c2034 100755 --- a/packages/components/pagination/pagination.tsx +++ b/packages/components/pagination/pagination.tsx @@ -1,4 +1,4 @@ -import { defineComponent, computed, ref, watch, toRefs, getCurrentInstance } from 'vue'; +import { defineComponent, computed, ref, watch, toRefs, getCurrentInstance, nextTick } from 'vue'; import { isNaN, isObject } from 'lodash-es'; import { PageFirstIcon as TdPageFirstIcon, @@ -182,38 +182,35 @@ export default defineComponent({ pageChangeMap[type](); }; - const onSelectorChange: (e: string) => void = (e) => { - if (props.disabled) { - return; - } - const pageSize: number = parseInt(e, 10); - let pageCount = 1; - if (pageSize > 0) { - pageCount = Math.max(Math.ceil(props.total / pageSize), 1); - } + const onSelectorChange = (val: string | number) => { + if (props.disabled) return; - let isIndexChange = false; + const pageSize = Number(val); + const newPageCount = pageSize > 0 ? Math.max(Math.ceil(props.total / pageSize), 1) : 1; + const indexExceeds = innerCurrent.value > newPageCount; - if (innerCurrent.value > pageCount) { - isIndexChange = true; - } - - /** - * 分页大小变化事件 - * @param {Number} pageSize 分页大小 - * @param {Number} index 当前页 - */ const pageInfo = { - current: isIndexChange ? pageCount : innerCurrent.value, + current: indexExceeds ? newPageCount : innerCurrent.value, previous: innerCurrent.value, pageSize, }; + setInnerPageSize(pageSize, pageInfo); - if (isIndexChange) { - toPage(pageCount, pageInfo); - } else { - props.onChange?.(pageInfo); - } + + nextTick(() => { + if (indexExceeds) { + // 如果组件为受控(外部传入 current),优先使用受控值(且小于 newPageCount) + const controlledCurrent = current?.value; + + if (controlledCurrent != null && controlledCurrent < newPageCount) { + toPage(controlledCurrent, pageInfo); + } else { + toPage(newPageCount, pageInfo); + } + } else { + props.onChange?.(pageInfo); + } + }); }; const onJumperChange = (val: number) => { From 47de0a382abc4f177fac5956b247165b098bf1d3 Mon Sep 17 00:00:00 2001 From: RSS1102 Date: Wed, 5 Nov 2025 10:47:26 +0800 Subject: [PATCH 2/5] fix(Pagination): ensure controlled current value updates and emit currentChange event --- packages/components/pagination/pagination.tsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/components/pagination/pagination.tsx b/packages/components/pagination/pagination.tsx index 7a742c2034..436c8c9339 100755 --- a/packages/components/pagination/pagination.tsx +++ b/packages/components/pagination/pagination.tsx @@ -199,16 +199,23 @@ export default defineComponent({ nextTick(() => { if (indexExceeds) { - // 如果组件为受控(外部传入 current),优先使用受控值(且小于 newPageCount) - const controlledCurrent = current?.value; - - if (controlledCurrent != null && controlledCurrent < newPageCount) { - toPage(controlledCurrent, pageInfo); + if (current.value != null && current.value < newPageCount) { + toPage(current.value, pageInfo); + setInnerCurrent(current.value, pageInfo); } else { toPage(newPageCount, pageInfo); } } else { props.onChange?.(pageInfo); + // 如果在 setInnerPageSize 后 current 被外部受控修改,则触发 currentChange 事件 + if (innerCurrent.value !== pageInfo.previous) { + const newPageInfo = { + current: innerCurrent.value, + previous: pageInfo.previous, + pageSize, + }; + emit('currentChange', innerCurrent.value, newPageInfo); + } } }); }; From 2f2dc270aeeca19065a467b12f8300f4998c9d42 Mon Sep 17 00:00:00 2001 From: RSS1102 Date: Wed, 5 Nov 2025 11:49:43 +0800 Subject: [PATCH 3/5] fix(Pagination): enhance page size handling and improve current page navigation logic --- packages/components/pagination/pagination.tsx | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/packages/components/pagination/pagination.tsx b/packages/components/pagination/pagination.tsx index 436c8c9339..b35723f0ce 100755 --- a/packages/components/pagination/pagination.tsx +++ b/packages/components/pagination/pagination.tsx @@ -188,34 +188,40 @@ export default defineComponent({ const pageSize = Number(val); const newPageCount = pageSize > 0 ? Math.max(Math.ceil(props.total / pageSize), 1) : 1; const indexExceeds = innerCurrent.value > newPageCount; + // 用户自主控制 + const userControlled = current.value != null && current.value < newPageCount; - const pageInfo = { + // 初始 pageInfo(用于 setInnerPageSize 时传参) + const initialPageInfo = { current: indexExceeds ? newPageCount : innerCurrent.value, previous: innerCurrent.value, pageSize, }; - setInnerPageSize(pageSize, pageInfo); + setInnerPageSize(pageSize, initialPageInfo); nextTick(() => { if (indexExceeds) { - if (current.value != null && current.value < newPageCount) { - toPage(current.value, pageInfo); - setInnerCurrent(current.value, pageInfo); - } else { - toPage(newPageCount, pageInfo); - } - } else { + // 当当前页索引超过新页数时,需要跳转到合适页 + const pageCurrent = userControlled ? newPageCount : innerCurrent.value; + const pageInfo = { + current: pageCurrent, + previous: initialPageInfo.current, + pageSize, + }; + toPage(pageCurrent, pageInfo); props.onChange?.(pageInfo); + } else { + const pageInfo = { + current: innerCurrent.value, + previous: initialPageInfo.current, + pageSize, + }; // 如果在 setInnerPageSize 后 current 被外部受控修改,则触发 currentChange 事件 if (innerCurrent.value !== pageInfo.previous) { - const newPageInfo = { - current: innerCurrent.value, - previous: pageInfo.previous, - pageSize, - }; - emit('currentChange', innerCurrent.value, newPageInfo); + emit('currentChange', innerCurrent.value, pageInfo); } + props.onChange?.(pageInfo); } }); }; From 95a63603caf9ca061ae19ff8787a7b75068fbf47 Mon Sep 17 00:00:00 2001 From: RSS1102 Date: Fri, 14 Nov 2025 10:05:44 +0800 Subject: [PATCH 4/5] fix(Pagination): remove redundant onChange event emission in page change handler --- packages/components/pagination/pagination.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/components/pagination/pagination.tsx b/packages/components/pagination/pagination.tsx index b35723f0ce..d43c01f03a 100755 --- a/packages/components/pagination/pagination.tsx +++ b/packages/components/pagination/pagination.tsx @@ -210,7 +210,6 @@ export default defineComponent({ pageSize, }; toPage(pageCurrent, pageInfo); - props.onChange?.(pageInfo); } else { const pageInfo = { current: innerCurrent.value, From 304ef3ba2bf24f0dc65577a27e12bfbd568ad64f Mon Sep 17 00:00:00 2001 From: tdesign-bot Date: Fri, 14 Nov 2025 03:29:36 +0000 Subject: [PATCH 5/5] chore: stash changelog [ci skip] --- packages/tdesign-vue-next/.changelog/pr-6127.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 packages/tdesign-vue-next/.changelog/pr-6127.md diff --git a/packages/tdesign-vue-next/.changelog/pr-6127.md b/packages/tdesign-vue-next/.changelog/pr-6127.md new file mode 100644 index 0000000000..92cde0be82 --- /dev/null +++ b/packages/tdesign-vue-next/.changelog/pr-6127.md @@ -0,0 +1,6 @@ +--- +pr_number: 6127 +contributor: RSS1102 +--- + +- fix(Table): 修改在 pageSize 改变时无法自定义当前页的问题 @RSS1102 ([#6127](https://github.com/Tencent/tdesign-vue-next/pull/6127))