Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 1x 2x 2x 2x 1x 1x 1x 1x 1x 1x 1x 1x 1x | <script setup lang="ts">
import { type Ref, ref, onMounted, watch } from "vue";
import { usePaginationBar } from "./usePaginationBar.ts";
const props = defineProps<{
maxPage: number;
paddingSize?: number;
}>();
const paddingSize = props.paddingSize ?? 1;
const pageNum: Ref<number> = ref(1);
const pageItem: Ref<string[]> = ref([]);
const emits = defineEmits(["change"]);
const { setPaginationItems } = usePaginationBar();
const showByPageNum = (index: number) => {
pageNum.value = index;
emits("change", pageNum.value);
};
const showPreviousPage = () => {
pageNum.value = pageNum.value > 1 ? pageNum.value - 1 : 1;
emits("change", pageNum.value);
};
const showNextPage = () => {
pageNum.value =
pageNum.value < props.maxPage ? pageNum.value + 1 : props.maxPage;
emits("change", pageNum.value);
};
watch(pageNum, () =>
setPaginationItems(pageItem.value, pageNum.value, props.maxPage, paddingSize),
);
onMounted(() =>
setPaginationItems(pageItem.value, pageNum.value, props.maxPage, paddingSize),
);
</script>
<template>
<div :class="$style.pagination_bar_container">
<nav :class="$style.bar">
<ul :class="$style.pagination_buttons">
<li :class="$style.pagination_button">
<a @click="showPreviousPage" :class="$style.pagination_button_content">
<
</a>
</li>
<li v-for="num in pageItem" :key="num" :class="$style.pagination_button">
<a v-if="num==='...'" :class="$style.pagination_button_content">
...
</a>
<a v-else-if="num === String(pageNum)" @click="showByPageNum(Number(num))" :class="$style.selected_page_button">
{{ num }}
</a>
<a v-else @click="showByPageNum(Number(num))" :class="$style.pagination_button_content">
{{ num }}
</a>
</li>
<li :class="$style.pagination_button">
<a @click="showNextPage" :class="$style.pagination_button_content">
>
</a>
</li>
</ul>
</nav>
</div>
</template>
<style module>
.pagination_bar_container {
padding: 0 32px;
}
.bar {
display: flex;
flex: 1 1 0%;
justify-content: center;
}
.pagination_buttons {
display: inline-flex;
cursor: pointer;
}
.pagination_button {
width: 32px;
height: 32px;
font-size: 16px;
list-style: none;
border: 1px solid #333;
display: table;
vertical-align: middle;
}
.pagination_button_content {
padding: 8px;
line-height: 1.25;
display: table-cell;
text-align: center;
}
.selected_page_button {
padding: 8px;
line-height: 1.25;
background-color: #4a78ff;
display: table-cell;
text-align: center;
}
.selected_page_button:hover {
background-color: #1550ff;
}
</style>
|