diff --git a/examples/sites/demos/apis/pager.js b/examples/sites/demos/apis/pager.js
index 2ce70be6a5..3f360488b0 100644
--- a/examples/sites/demos/apis/pager.js
+++ b/examples/sites/demos/apis/pager.js
@@ -237,7 +237,7 @@ export default {
},
{
name: 'size',
- type: "'mini'",
+ type: '"mini"',
defaultValue: '',
desc: {
'zh-CN': '定义分页尺寸',
diff --git a/packages/renderless/src/pager/vue.ts b/packages/renderless/src/pager/vue.ts
index 98a8b58c1a..aea8340ec7 100644
--- a/packages/renderless/src/pager/vue.ts
+++ b/packages/renderless/src/pager/vue.ts
@@ -93,7 +93,7 @@ export const renderless = (
totalText: computed(() => api.computedTotalText()),
internalPageCount: computed(() => api.computedInternalPageCount()),
showJumperSuffix: designConfig?.state?.showJumperSuffix ?? true,
- align: props.align || designConfig?.state?.align || 'right',
+ align: computed(() => props.align || designConfig?.state?.align || 'right'),
totalI18n: designConfig?.state?.totalI18n || 'totals',
totalFixedLeft: computed(
() => props.totalFixedLeft ?? designConfig?.state?.totalFixedLeft ?? props.mode !== 'simplest' ?? true
diff --git a/packages/vue/src/pager/__test__/pager.test.tsx b/packages/vue/src/pager/__test__/pager.test.tsx
deleted file mode 100644
index bc5c4f82c5..0000000000
--- a/packages/vue/src/pager/__test__/pager.test.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { mountPcMode } from '@opentiny-internal/vue-test-utils'
-import { describe, expect, test, vi } from 'vitest'
-import Pager from '@opentiny/vue-pager'
-
-describe('PC Mode', () => {
- const mount = mountPcMode
-
- test('base 基本用法', () => {
- const wrapper = mount(() => )
- expect(wrapper.find('.tiny-pager__btn-prev').exists()).toBe(true)
- expect(wrapper.find('.tiny-pager__group').exists()).toBe(true)
- expect(wrapper.find('.tiny-pager__btn-next').exists()).toBe(true)
- })
-
- test('current-change 当前页码发生改变时,触发current-change事件', async () => {
- const currentChange = vi.fn()
- const wrapper = mount(() => )
- const nextBtn = wrapper.find('.tiny-pager__btn-next')
- await nextBtn.trigger('click')
- expect(currentChange).toHaveBeenCalled()
- })
-
- test('layout 自定义分页布局', () => {
- const SlotContent = () => 默认插槽
- const wrapper = mount(() => (
-
-
-
- ))
- expect(wrapper.findComponent(SlotContent).exists()).toBe(true)
- })
-
- test.todo('number 设置分页组件为number渲染模式')
- test.todo('fixed 设置分页组件为fixed渲染模式')
- test.todo('simple 设置分页组件为simple渲染模式')
- test.todo('complete 设置分页组件为complete渲染模式')
- test.todo('page-count 设置分页组件的总页数')
- test.todo('size-change 每页条数改变时触发size-change事件')
- test.todo('prev-click 切换至前一页时触发prev-click事件')
- test.todo('next-click 切换至后一页时触发next-click事件')
- test.todo('before-page-change 切换分页前事件')
- test.todo('popper-append-to-body 分页下拉框元素是否追加到body元素节点下')
- test.todo('popper-class 自定义分页下拉框的类名')
- test.todo('pager-count 设置页码数量')
- test.todo('page-size 设置每页显示数量')
- test.todo('hide-on-single-page 只有一页时隐藏分页')
- test.todo('prev-text、next-text 自定义上下页按钮文本')
- test.todo('Grid 表格分页,服务需要自行实现')
- test.todo('size 定义分页尺寸大小,可选值有 mini')
- test.todo('disabled 禁用分页所有功能')
-})
diff --git a/packages/vue/src/pager/__tests__/pager.test.tsx b/packages/vue/src/pager/__tests__/pager.test.tsx
new file mode 100644
index 0000000000..8ebd8b7c8b
--- /dev/null
+++ b/packages/vue/src/pager/__tests__/pager.test.tsx
@@ -0,0 +1,148 @@
+import { mountPcMode } from '@opentiny-internal/vue-test-utils'
+import { describe, expect, test, vi } from 'vitest'
+import Pager from '@opentiny/vue-pager'
+import { ref, nextTick } from 'vue'
+
+describe('PC Mode', () => {
+ const mount = mountPcMode
+
+ test('base 基本用法', () => {
+ const wrapper = mount(() => )
+ expect(wrapper.find('.tiny-pager__btn-prev').exists()).toBe(true)
+ expect(wrapper.find('.tiny-pager__group').exists()).toBe(true)
+ expect(wrapper.find('.tiny-pager__btn-next').exists()).toBe(true)
+ })
+
+ test('current-change 当前页码发生改变时,触发current-change事件', async () => {
+ const currentChange = vi.fn()
+ const wrapper = mount(() => )
+ const nextBtn = wrapper.find('.tiny-pager__btn-next')
+ await nextBtn.trigger('click')
+ expect(currentChange).toHaveBeenCalled()
+ })
+
+ test('layout 自定义分页布局', () => {
+ const SlotContent = () => 默认插槽
+ const wrapper = mount(() => (
+
+
+
+ ))
+ expect(wrapper.findComponent(SlotContent).exists()).toBe(true)
+ })
+
+ describe('align 设置分页组件对齐方式', () => {
+ ;['left', 'center', 'right'].forEach((align) => {
+ test(`对齐方式为${align}`, () => {
+ const wrapper = mount(() => )
+ expect(wrapper.find('.tiny-pager').attributes('style')).toContain(`text-align: ${align}`)
+ })
+ })
+
+ test('align 为响应式属性', async () => {
+ const align = ref('left')
+ const wrapper = mount(() => )
+ expect(wrapper.find('.tiny-pager').attributes('style')).toContain(`text-align: left`)
+ align.value = 'center'
+ await nextTick()
+
+ expect(wrapper.find('.tiny-pager').attributes('style')).toContain(`text-align: center`)
+
+ align.value = 'right'
+ await nextTick()
+
+ expect(wrapper.find('.tiny-pager').attributes('style')).toContain(`text-align: right`)
+ })
+ })
+
+ test.todo('number 设置分页组件为number渲染模式')
+ test.todo('fixed 设置分页组件为fixed渲染模式')
+ test.todo('simple 设置分页组件为simple渲染模式')
+ test.todo('complete 设置分页组件为complete渲染模式')
+ test.todo('page-count 设置分页组件的总页数')
+ test.skip('size-change 每页条数改变时触发size-change事件', async () => {
+ const sizeChange = vi.fn()
+ const wrapper = mount(() => )
+ wrapper.find('.tiny-pager__page-size-btn').trigger('click')
+ await nextTick()
+ const selected = document.querySelector('.is-selected')
+ selected?.nextElementSibling?.click()
+ await nextTick()
+ expect(sizeChange).toHaveBeenCalledWith(20)
+ })
+
+ test.skip('prev-click 切换至前一页时触发prev-click事件', () => {
+ const prevClick = vi.fn()
+ const currentPage = ref(2)
+ const wrapper = mount(() => )
+ wrapper.find('.tiny-pager__btn-prev').trigger('click')
+ expect(prevClick).toHaveBeenCalledWith(1)
+ })
+
+ test('next-click 切换至后一页时触发next-click事件', () => {
+ const nextClick = vi.fn()
+ const wrapper = mount(() => )
+ wrapper.find('.tiny-pager__btn-next').trigger('click')
+ expect(nextClick).toHaveBeenCalledWith(2)
+ })
+
+ describe('before-page-change 切换分页前事件', () => {
+ test('开启事件', () => {
+ const beforePageChange = vi.fn()
+ const wrapper = mount(() => )
+ wrapper.find('.tiny-pager__btn-next').trigger('click')
+ expect(beforePageChange).toHaveBeenCalled()
+ })
+
+ test('默认禁用', () => {
+ const beforePageChange = vi.fn()
+ const wrapper = mount(() => )
+ wrapper.find('.tiny-pager__btn-next').trigger('click')
+ expect(beforePageChange).not.toHaveBeenCalled()
+ })
+ })
+
+ test('popper-append-to-body 分页下拉框元素是否追加到body元素节点下', () => {
+ const wrapper = mount(() => )
+ wrapper.find('.tiny-pager__page-size-btn').trigger('click')
+ expect(wrapper.find('.tiny-pager__selector-body').exists()).toBe(true)
+ })
+
+ test('popper-class 自定义分页下拉框的类名', () => {
+ mount(() => )
+ expect(document.querySelector('.custom-pager')).toBeDefined()
+ })
+
+ test('pager-count 设置页码数量', () => {
+ const wrapper = mount(() => )
+ expect(wrapper.findAll('.tiny-pager__pages > li:not(.quicknext)')).toHaveLength(10)
+ })
+
+ test('page-size 设置每页显示数量', () => {
+ const wrapper = mount(() => )
+ expect(wrapper.find('.tiny-pager__page-size').text()).toBe('100')
+ })
+
+ test('hide-on-single-page 只有一页时隐藏分页', () => {
+ const wrapper = mount(() => )
+ expect(wrapper.find('.tiny-pager').exists()).toBe(false)
+ })
+
+ test('prev-text、next-text 自定义上下页按钮文本', () => {
+ const wrapper = mount(() => )
+ expect(wrapper.find('.tiny-pager__btn-prev').text()).toBe('上一页')
+ expect(wrapper.find('.tiny-pager__btn-next').text()).toBe('下一页')
+ })
+
+ test.todo('Grid 表格分页,服务需要自行实现')
+
+ test('size 定义分页尺寸大小,可选值有 mini', () => {
+ const wrapper = mount(() => )
+ expect(wrapper.find('.tiny-pager').classes()).toContain('tiny-pager--mini')
+ })
+
+ test('disabled 禁用分页所有功能', () => {
+ const wrapper = mount(() => )
+ expect(wrapper.find('.tiny-pager').classes()).toContain('is-disabled')
+ })
+})
diff --git a/packages/vue/src/pager/src/index.ts b/packages/vue/src/pager/src/index.ts
index 56ffcf974b..145825d191 100644
--- a/packages/vue/src/pager/src/index.ts
+++ b/packages/vue/src/pager/src/index.ts
@@ -59,11 +59,12 @@ export const pagerProps = {
total: Number,
size: {
type: String,
- default: ''
+ default: '',
+ validator: (value: string) => ['mini', ''].includes(value)
},
align: {
type: String,
- validator: (value) => ['left', 'center', 'right'].includes(value)
+ validator: (value: string) => ['left', 'center', 'right'].includes(value)
},
totalFixedLeft: {
type: Boolean,