Skip to content

Commit 815b175

Browse files
authored
fix(pagination): 切换页码后下拉不自动收起等问题 (DevCloudFE#1718)
1 parent 9e88ef3 commit 815b175

File tree

8 files changed

+44
-50
lines changed

8 files changed

+44
-50
lines changed

packages/devui-vue/devui/pagination/src/components/config-menu.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { defineComponent, onMounted, onUnmounted, PropType, ref } from 'vue';
22
import { on, off } from '../../../shared/devui-directive/utils';
33
import clickoutsideDirective from '../../../shared/devui-directive/clickoutside';
4-
import { useNamespace } from '../../../shared/hooks/use-namespace';
4+
import { useNamespace } from '@devui/shared/utils';
55

66
export default defineComponent({
77
directives: {

packages/devui-vue/devui/pagination/src/components/jump-page.tsx

+9-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { defineComponent, PropType, ref, watch, toRefs, ExtractPropTypes } from 'vue';
2-
import { useNamespace } from '../../../shared/hooks/use-namespace';
2+
import { useNamespace } from '@devui/shared/utils';
33

44
const jumpPageProps = {
55
goToText: String,
@@ -42,9 +42,16 @@ export default defineComponent({
4242
};
4343
// 跳转指定页码
4444
const jump = (e: KeyboardEvent | 'btn') => {
45+
if (isNaN(curPage)) {
46+
curPage = 1;
47+
}
4548
if (curPage > totalPages?.value) {
46-
return;
49+
curPage = totalPages?.value;
50+
}
51+
if (curPage < 1) {
52+
curPage = 1;
4753
}
54+
4855
if ((e === 'btn' || e.key === 'Enter') && cursor?.value !== curPage) {
4956
emit('changeCursorEmit', curPage);
5057
}

packages/devui-vue/devui/pagination/src/components/page-nums.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { defineComponent, PropType, computed, ExtractPropTypes } from 'vue';
22
import { handlePages } from '../utils';
3-
import { useNamespace } from '../../../shared/hooks/use-namespace';
3+
import { useNamespace } from '@devui/shared/utils';
44
import { PreLinkIcon, NextLinkIcon } from '../components/page-link-icons';
55

66
const pageNumBtnProps = {

packages/devui-vue/devui/pagination/src/components/page-size.tsx

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
import { defineComponent, inject, withModifiers, ref } from 'vue';
2-
import { Icon } from '../../../icon';
2+
import { Icon } from '@devui/shared/components/icon';
33
import { Dropdown } from '../../../dropdown';
4-
import { useNamespace } from '../../../shared/hooks/use-namespace';
4+
import { useNamespace } from '@devui/shared/utils';
55
import { paginationInjectionKey, IPagination } from '../pagination-types';
66

77
export default defineComponent({
88
setup() {
99
const ns = useNamespace('pagination');
1010
const paginationContext = inject(paginationInjectionKey) as IPagination;
1111
const iconRotate = ref(0);
12-
const { size, currentPageSize, pageSizeOptions, pageSizeChange, t } = paginationContext;
12+
const { size, currentPageSize, pageSizeOptions, pageSizeDirection, pageSizeChange, t } = paginationContext;
1313
const onDropdownToggle = (e: boolean) => {
1414
iconRotate.value = e ? 180 : 0;
1515
};
1616

1717
return () => (
1818
<>
19-
<Dropdown position={['bottom', 'top']} class={ns.e('size-list')} onToggle={onDropdownToggle}>
19+
<Dropdown position={pageSizeDirection.value} class={ns.e('size-list')} onToggle={onDropdownToggle}>
2020
{{
2121
default: () => (
2222
<div tabindex="0" class={[ns.e('size'), size.value ? ns.em('size', size.value) : '']}>
@@ -28,8 +28,11 @@ export default defineComponent({
2828
menu: () => (
2929
<ul>
3030
{pageSizeOptions.value.map((item, index) => (
31-
<li class={{ active: item === currentPageSize.value }}
32-
onClick={withModifiers(pageSizeChange.bind(null, { value: item }), ['stop'])}
31+
<li
32+
class={{ active: item === currentPageSize.value }}
33+
onClick={() => {
34+
pageSizeChange(item);
35+
}}
3336
key={index}>
3437
{item}
3538
</li>

packages/devui-vue/devui/pagination/src/pagination-types.ts

+5-17
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,6 @@
11
import type { PropType, ExtractPropTypes, InjectionKey, Ref, WritableComputedRef } from 'vue';
22

3-
type AppendToBodyDirection = 'rightDown' | 'rightUp' | 'leftUp' | 'leftDown' | 'centerDown' | 'centerUp';
4-
5-
interface ConnectedPosition {
6-
originX: 'start' | 'center' | 'end';
7-
originY: 'top' | 'center' | 'bottom';
8-
9-
overlayX: 'start' | 'center' | 'end';
10-
overlayY: 'top' | 'center' | 'bottom';
11-
12-
weight?: number;
13-
offsetX?: number;
14-
offsetY?: number;
15-
panelClass?: string | string[];
16-
}
3+
export type PageSizeDirection = 'bottom' | 'top' | 'left' | 'right';
174

185
type Size = 'lg' | '' | 'sm';
196

@@ -31,8 +18,8 @@ export const paginationProps = {
3118
default: () => [5, 10, 20, 50],
3219
},
3320
pageSizeDirection: {
34-
type: Array as PropType<Array<AppendToBodyDirection | ConnectedPosition>>,
35-
default: () => ['centerDown', 'centerUp'],
21+
type: Array as PropType<Array<PageSizeDirection>>,
22+
default: () => ['bottom', 'top'],
3623
},
3724
pageIndex: {
3825
type: Number,
@@ -121,7 +108,8 @@ export interface IPagination {
121108
size: Ref<Size>;
122109
currentPageSize: WritableComputedRef<number>;
123110
pageSizeOptions: Ref<number[]>;
124-
pageSizeChange: (val: Record<string, string | number>) => void;
111+
pageSizeDirection: Ref<PageSizeDirection[]>;
112+
pageSizeChange: (val: number) => void;
125113
t: (path: string) => void;
126114
}
127115

packages/devui-vue/devui/pagination/src/pagination.scss

+7-1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@
4141
&.#{$devui-prefix}-pagination__size--lg {
4242
height: 46px;
4343
}
44+
45+
& > .#{$devui-prefix}-icon__container {
46+
display: flex;
47+
align-items: center;
48+
}
4449
}
4550

4651
.#{$devui-prefix}-pagination__total-size {
@@ -384,7 +389,8 @@
384389
text-overflow: ellipsis;
385390
white-space: nowrap;
386391
cursor: pointer;
387-
transition: color $devui-animation-duration-fast $devui-animation-ease-in-out-smooth,
392+
transition:
393+
color $devui-animation-duration-fast $devui-animation-ease-in-out-smooth,
388394
background-color $devui-animation-duration-fast $devui-animation-ease-in-out-smooth;
389395

390396
&:hover:not(.active) {

packages/devui-vue/devui/pagination/src/pagination.tsx

+7-6
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import ConfigMenu from './components/config-menu';
66
import JumpPage from './components/jump-page';
77
import PageNumBtn from './components/page-nums';
88
import PageSize from './components/page-size';
9-
import { useNamespace } from '../../shared/hooks/use-namespace';
10-
import { createI18nTranslate } from '../../locale/create';
9+
import { useNamespace } from '@devui/shared/utils';
10+
import { createI18nTranslate } from '@devui/shared/components/locale/create';
1111
import './pagination.scss';
1212

1313
export default defineComponent({
@@ -26,6 +26,7 @@ export default defineComponent({
2626
const {
2727
autoHide,
2828
pageSizeOptions,
29+
pageSizeDirection,
2930
total,
3031
canChangePageSize,
3132
lite,
@@ -82,8 +83,8 @@ export default defineComponent({
8283
};
8384

8485
// 每页条数改变
85-
const pageSizeChange = (val: Record<string, string | number>) => {
86-
currentPageSize.value = val.value as number;
86+
const pageSizeChange = (val: number) => {
87+
currentPageSize.value = val as number;
8788
// 页数改变后,如果当前页码超出最大页码时修正
8889
if (props.autoFixPageIndex) {
8990
nextTick(() => {
@@ -92,15 +93,15 @@ export default defineComponent({
9293
}
9394
});
9495
}
95-
emit('pageSizeChange', val.value as number);
96+
emit('pageSizeChange', val);
9697
};
9798

9899
// 极简模式下的跳转页码
99100
const litePageIndexChange = (page: { name: string; value: number }) => {
100101
changeCursorEmit(page.value);
101102
};
102103

103-
provide(paginationInjectionKey, { size, currentPageSize, pageSizeOptions, pageSizeChange, t });
104+
provide(paginationInjectionKey, { size, currentPageSize, pageSizeOptions, pageSizeDirection, pageSizeChange, t });
104105

105106
return () =>
106107
// autoHide 为 true,并且 pageSizeOptions 最小值大于 total,则不展示分页

packages/devui-vue/docs/components/pagination/index.md

+5-16
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ export default defineComponent({
243243
@page-index-change="pageIndexChangeWithoutFix"
244244
@page-size-change="pageSizeChangeWithoutFix"
245245
:page-size-options="pager.pageSizeOptions"
246-
:page-size-direction="['centerUp']"
246+
:page-size-direction="['right']"
247247
/>
248248
</template>
249249
<script>
@@ -423,8 +423,8 @@ export default defineComponent({
423423
| :------------------- | :---------------------------------------------------------------------------------------------------- | :------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------- | :-------------------- |
424424
| page-size | `number` | 10 | 可选,每页显示最大条目数量 | [基本用法](#基本用法) |
425425
| total | `number` | 0 | 可选,显示的总条目数 | [基本用法](#基本用法) |
426-
| page-size-options | `number[] ` | 10 | 可选,分页每页最大条目数量的下拉框的数据源,<br>默认有四种选择 5, 10, 20, 50 | [多种配置](#多种配置) |
427-
| page-size-direction | [AppendToBodyDirection](#appendtobodydirection)\[\]<br>\| [ConnectedPosition](#connectedposition)\[\] | [<br>&nbsp;&nbsp;'centerDown', <br>&nbsp;&nbsp;'centerUp'<br>] | 可选,设置分页每页条目的下拉框展示的方向 | [多种配置](#多种配置) |
426+
| page-size-options | `number[]` | 10 | 可选,分页每页最大条目数量的下拉框的数据源,<br>默认有四种选择 5, 10, 20, 50 | [多种配置](#多种配置) |
427+
| page-size-direction | [PageSizeDirection](#pagesizedirection) | ['bottom', 'top'] | 可选,设置分页每页条目的下拉框展示的方向 | [多种配置](#多种配置) |
428428
| page-index | `number` | 1 | 可选,初始化页码 | [基本用法](#基本用法) |
429429
| max-items | `number` | 10 | 可选,分页最多显示几个按钮 | [基本用法](#基本用法) |
430430
| pre-link | `string` | -- | 可选,上一页按钮显示图标,<br>默认设置为左箭头图标 | [基本用法](#基本用法) |
@@ -458,19 +458,8 @@ export default defineComponent({
458458
type AppendToBodyDirection = 'rightDown' | 'rightUp' | 'leftUp' | 'leftDown' | 'centerDown' | 'centerUp';
459459
```
460460

461-
#### ConnectedPosition
461+
#### PageSizeDirection
462462

463463
```ts
464-
interface ConnectedPosition {
465-
originX: 'start' | 'center' | 'end';
466-
originY: 'top' | 'center' | 'bottom';
467-
468-
overlayX: 'start' | 'center' | 'end';
469-
overlayY: 'top' | 'center' | 'bottom';
470-
471-
weight?: number;
472-
offsetX?: number;
473-
offsetY?: number;
474-
panelClass?: string | string[];
475-
}
464+
type PageSizeDirection = 'bottom' | 'top' | 'left' | 'right';
476465
```

0 commit comments

Comments
 (0)