
5 changed files with 234 additions and 68 deletions
@ -0,0 +1,130 @@ |
|||||
|
<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> |
Loading…
Reference in new issue