CNCEC_APP/uni_modules/uview-pro/components/u-pagination/u-pagination.vue

94 lines
2.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="u-pagination" :style="$u.toStyle(customStyle)" :class="customClass">
<u-button
custom-class="custom-class"
shape="circle"
type="info"
size="medium"
:throttle-time="0"
:disabled="current <= 1"
@click="handleChange('prev')"
>
<u-icon v-if="showIcon" :name="prevIcon"></u-icon>
<text v-else>{{ prevText }}</text>
</u-button>
<view class="u-pagination-text">
<slot>
<u-text type="primary" :text="current"></u-text>
<text> / </text>
<text>{{ totalPages }}</text>
</slot>
</view>
<u-button
custom-class="custom-class"
shape="circle"
type="info"
size="medium"
:throttle-time="0"
:disabled="current >= totalPages"
@click="handleChange('next')"
>
<u-icon v-if="showIcon" :name="nextIcon"></u-icon>
<text v-else>{{ nextText }}</text>
</u-button>
</view>
</template>
<script lang="ts">
export default {
name: 'u-pagination',
options: {
addGlobalClass: true,
// #ifndef MP-TOUTIAO
virtualHost: true,
// #endif
styleIsolation: 'shared'
}
};
</script>
<script setup lang="ts">
import { computed } from 'vue';
import { type PaginationEmits, PaginationProps } from './types';
import type { PaginationDirection } from '../../types/global';
import { $u } from '../../';
const props = defineProps(PaginationProps);
const emit = defineEmits<PaginationEmits>();
const current = defineModel({ type: Number, default: 1 });
// 自动计算总页数
const totalPages = computed(() => {
const size = props.pageSize || 10;
return Math.ceil((props.total || 0) / size);
});
// 切换分页
function handleChange(type: PaginationDirection) {
// 先计算新值,确保获取到的是更新后的值
const newCurrent = type === 'prev' ? current.value - 1 : current.value + 1;
// 更新 current 值
current.value = newCurrent;
// current为当前页type值为next/prev表示点击的是上一页还是下一页
// 使用计算后的新值,而不是 current.value避免异步更新导致的值不同步问题
emit('change', { type, current: newCurrent });
}
</script>
<style scoped lang="scss">
.u-pagination {
display: flex;
justify-content: space-between;
align-items: center;
:deep(.custom-class) {
margin: 0;
padding: 0 30rpx;
min-width: 120rpx;
}
}
</style>