分页显示优化问题,求大佬解答

75 阅读2分钟
<template>
  <div class="content content_top">
    <div class="index_ajax">
      <!-- 文章列表 -->
      <article class="index_list" v-for="article in paginatedArticles" :key="article.id">
        <h2 class="index_list_name">
          <a :href="article.link">{{ article.title }}</a>
        </h2>
        <div class="index_list_excerpt">{{ article.excerpt }}</div>
        <div class="index_list_foot">
          <div class="author-meta">
            <svg xmlns="http://www.w3.org/2000/svg" width="16.5px" height="16.5px" viewBox="0 0 24 24" fill="none"
              stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
              class="feather feather-user">
              <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path>
              <circle cx="12" cy="7" r="4"></circle>
            </svg>
            <span>{{ article.author }}</span><i class="text-primary"></i>
          </div>
          <span><a :href="article.categoryLink">{{ article.category }}</a></span><i class="text-primary"></i>
          <time :datetime="article.date">{{ article.formattedDate }}</time>
        </div>
      </article>

      <!-- 分页组件 -->
      <div v-if="totalPages > 1" class="page-navigator">
        <ul>
          <li class="prev" v-if="currentPage > 1">
            <router-link :to="getLink(currentPage - 1)">
              <i class="iconfont icon-icon-test"></i>
            </router-link>
          </li>

          <li v-for="page in visiblePages" :key="page.number" :class="{ 'current': page.current }">
            <router-link :to="getLink(page.number)">{{ page.number }}</router-link>
          </li>

          <!-- 显示省略号和最后一页 -->
          <li v-if="shouldShowEllipsisAfter">
            <span>...</span>
          </li>
          <li v-if="shouldShowLastPage">
            <router-link :to="getLink(totalPages)">{{ totalPages }}</router-link>
          </li>

          <!-- 输入框 -->
          <li v-if="totalPages > 3">
            <input type="text" class="jump-input" @keyup.enter="jumpToPage" />
          </li>

          <!-- 跳转按钮 -->
          <li v-if="totalPages > 3">
            <button @click="jumpToPage" class="jump-button">跳转</button>
          </li>

          <li class="next" v-if="currentPage < totalPages">
            <router-link :to="getLink(currentPage + 1)">
              <i class="iconfont icon-icon-test1"></i>
            </router-link>
          </li>
        </ul>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, computed, onMounted, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { format } from 'date-fns'

const route = useRoute()
const router = useRouter()

// 接收路由传递的 page 参数
const currentPage = ref(Number(route.params.page) || Number(route.query.page) || 1)
const articles = ref([])

// 文章每页显示数量
const articlesPerPage = 5

// 获取文章数据
const fetchArticles = async () => {
  try {
    const response = await fetch('http://localhost:3000/api/articles')
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }
    const data = await response.json()
    articles.value = data
  } catch (error) {
    console.error('Failed to fetch articles:', error)
  }
}

onMounted(() => {
  fetchArticles()
})

// 计算总页数
const totalPages = computed(() => Math.ceil(articles.value.length / articlesPerPage))

// 计算当前页的文章
const paginatedArticles = computed(() => {
  const start = (currentPage.value - 1) * articlesPerPage
  return articles.value.slice(start, start + articlesPerPage).map(article => ({
    ...article,
    formattedDate: format(new Date(article.date), 'yyyy-MM-dd')
  }))
})

// 生成分页链接
const getLink = (pageNumber) => {
  if (route.name === 'search' || route.name === 'searchPage') {
    return { name: 'searchPage', params: { query: route.params.query || route.query.q, page: pageNumber } }
  } else {
    return pageNumber === 1 ? { name: 'index' } : { name: 'page', params: { page: pageNumber } }
  }
}

// 计算可见的分页按钮
const visiblePages = computed(() => {
  const pages = Array.from({ length: totalPages.value }, (_, i) => ({
    number: i + 1,
    current: i + 1 === currentPage.value
  }))

  // 如果页数少于或等于 3,则直接返回所有页码
  if (totalPages.value <= 3) return pages;

  // 前两页时显示前3页
  if (currentPage.value <= 2) return pages.slice(0, 3);

  // 最后两页时显示最后3页
  if (currentPage.value >= totalPages.value - 1) return pages.slice(totalPages.value - 3);

  // 显示当前页和相邻页的范围
  return pages.slice(currentPage.value - 2, currentPage.value + 1);
})

// 计算是否应该显示省略号和最后一页
const shouldShowEllipsisAfter = computed(() => {
  return totalPages.value > 3 && visiblePages.value[visiblePages.value.length - 1].number < totalPages.value - 1;
})

const shouldShowLastPage = computed(() => {
  return totalPages.value > 3 && visiblePages.value[visiblePages.value.length - 1].number < totalPages.value;
})

// 监听路由变化以更新当前页
watch(
  () => route.params.page || route.query.page,
  (newPage) => {
    currentPage.value = Number(newPage) || 1
  }
)

// 跳转到指定页码
const jumpToPage = () => {
  const input = document.querySelector('.jump-input')
  const page = parseInt(input.value, 10)
  if (page > 0 && page <= totalPages.value) {
    router.push(getLink(page))
    input.value = '' // 清空输入框
  }
}
</script>

<style scoped>
/* 保持原有的样式 */
</style>

先看代码,这个代码中有个问题如果我有15页的文章,然后保证前面是上一页的情况下,我在第12页显示11 12 13 ... 15符合逻辑,但是我想让这个页面更完整我想显示成11 12 13 14 15。就最后几页这样显示其中11是上一页,以此类推然后按照这个逻辑我有100页,我要在97页的时候显示为 96 97 98 99 100,再以此类推我有10000页的时候我在第9997页的时候应该显示9996 9997 9998 9999 10000。我该怎么修改我的代码,求大佬解答

注:本人水平有限代码基本是都是ai写的只会拿来用,和写一些htmlcss和一些些js。所以求解答后给出完整代码和解题思路