123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- <template>
- <ul @click="onPagerClick" class="el-pager">
- <li
- :class="{ active: currentPage === 1, disabled }"
- v-if="pageCount > 0"
- class="number">1</li>
- <li
- class="el-icon more btn-quickprev"
- :class="[quickprevIconClass, { disabled }]"
- v-if="showPrevMore"
- @mouseenter="onMouseenter('left')"
- @mouseleave="quickprevIconClass = 'el-icon-more'">
- </li>
- <li
- v-for="pager in pagers"
- :key="pager"
- :class="{ active: currentPage === pager, disabled }"
- class="number">{{ pager }}</li>
- <li
- class="el-icon more btn-quicknext"
- :class="[quicknextIconClass, { disabled }]"
- v-if="showNextMore"
- @mouseenter="onMouseenter('right')"
- @mouseleave="quicknextIconClass = 'el-icon-more'">
- </li>
- <li
- :class="{ active: currentPage === pageCount, disabled }"
- class="number"
- v-if="pageCount > 1">{{ pageCount }}</li>
- </ul>
- </template>
- <script type="text/babel">
- export default {
- name: 'ElPager',
- props: {
- currentPage: Number,
- pageCount: Number,
- pagerCount: Number,
- disabled: Boolean
- },
- watch: {
- showPrevMore(val) {
- if (!val) this.quickprevIconClass = 'el-icon-more';
- },
- showNextMore(val) {
- if (!val) this.quicknextIconClass = 'el-icon-more';
- }
- },
- methods: {
- onPagerClick(event) {
- const target = event.target;
- if (target.tagName === 'UL' || this.disabled) {
- return;
- }
- let newPage = Number(event.target.textContent);
- const pageCount = this.pageCount;
- const currentPage = this.currentPage;
- const pagerCountOffset = this.pagerCount - 2;
- if (target.className.indexOf('more') !== -1) {
- if (target.className.indexOf('quickprev') !== -1) {
- newPage = currentPage - pagerCountOffset;
- } else if (target.className.indexOf('quicknext') !== -1) {
- newPage = currentPage + pagerCountOffset;
- }
- }
- /* istanbul ignore if */
- if (!isNaN(newPage)) {
- if (newPage < 1) {
- newPage = 1;
- }
- if (newPage > pageCount) {
- newPage = pageCount;
- }
- }
- if (newPage !== currentPage) {
- this.$emit('change', newPage);
- }
- },
- onMouseenter(direction) {
- if (this.disabled) return;
- if (direction === 'left') {
- this.quickprevIconClass = 'el-icon-d-arrow-left';
- } else {
- this.quicknextIconClass = 'el-icon-d-arrow-right';
- }
- }
- },
- computed: {
- pagers() {
- const pagerCount = this.pagerCount;
- const halfPagerCount = (pagerCount - 1) / 2;
- const currentPage = Number(this.currentPage);
- const pageCount = Number(this.pageCount);
- let showPrevMore = false;
- let showNextMore = false;
- if (pageCount > pagerCount) {
- if (currentPage > pagerCount - halfPagerCount) {
- showPrevMore = true;
- }
- if (currentPage < pageCount - halfPagerCount) {
- showNextMore = true;
- }
- }
- const array = [];
- if (showPrevMore && !showNextMore) {
- const startPage = pageCount - (pagerCount - 2);
- for (let i = startPage; i < pageCount; i++) {
- array.push(i);
- }
- } else if (!showPrevMore && showNextMore) {
- for (let i = 2; i < pagerCount; i++) {
- array.push(i);
- }
- } else if (showPrevMore && showNextMore) {
- const offset = Math.floor(pagerCount / 2) - 1;
- for (let i = currentPage - offset ; i <= currentPage + offset; i++) {
- array.push(i);
- }
- } else {
- for (let i = 2; i < pageCount; i++) {
- array.push(i);
- }
- }
- this.showPrevMore = showPrevMore;
- this.showNextMore = showNextMore;
- return array;
- }
- },
- data() {
- return {
- current: null,
- showPrevMore: false,
- showNextMore: false,
- quicknextIconClass: 'el-icon-more',
- quickprevIconClass: 'el-icon-more'
- };
- }
- };
- </script>
|