You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

130 lines
3.1 KiB

<template>
<div class="pagination">
<button @click="click('first')" :disabled="cur_page === 1">首页</button>
<button @click="click('prev')" :disabled="cur_page === 1">上一页</button>
<span class="page-info"> {{ cur_page }} </span>
<button @click="click('next')" :disabled="!hasNext">下一页</button>
<button @click="click('last')" :disabled="!hasNext">尾页</button>
<input type="number" v-model.number="jumpPage" min="1" />
<button @click="click('jump')">跳转</button>
</div>
</template>
<script>
export default {
name: 'SimplePager',
props: {
curPage: {
type: Number,
required: true
},
hasNext: {
type: Boolean,
default: true
}
},
data() {
return {
jumpPage: null,
cur_page: this.curPage,
};
},
watch: {
curPage(newVal) {
this.jumpPage = newVal;
this.cur_page = newVal;
}
},
methods: {
click(type) {
let payload = {
first: 0,
prev: 0,
next: 0,
last: 0,
jump: 0,
cur_page: this.cur_page
};
switch (type) {
case 'first':
payload.first = 1;
payload.cur_page = 1;
break;
case 'prev':
payload.prev = 1;
payload.cur_page = Math.max(1, this.cur_page - 1);
break;
case 'next':
if (!this.hasNext) return;
payload.next = 1;
payload.cur_page = this.cur_page + 1;
break;
case 'last':
payload.last = 1;
payload.cur_page = this.cur_page;
break;
case 'jump':
if (this.jumpPage && this.jumpPage > 0) {
payload.jump = this.jumpPage;
payload.cur_page = this.jumpPage;
} else {
return;
}
break;
}
this.$emit('change', payload);
}
}
};
</script>
<style scoped>
.pagination {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
margin: 12px 0;
}
button {
padding: 6px 12px;
border: 1px solid #ccc;
background-color: #f8f8f8;
cursor: pointer;
border-radius: 4px;
font-size: 14px;
transition: all 0.2s;
}
button:hover:not(:disabled) {
background-color: #e6f7ff;
border-color: #91d5ff;
}
button:disabled {
cursor: not-allowed;
opacity: 0.5;
}
.page-info {
font-size: 14px;
margin: 0 6px;
}
input[type='number'] {
width: 70px;
padding: 8px 8px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 14px;
transition: border-color 0.2s, box-shadow 0.2s;
outline: none;
}
input[type='number']:focus {
border-color: #40a9ff;
box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2);
}
</style>