当前位置:首页 > VUE

vue自己实现分页功能

2026-02-24 10:41:54VUE

Vue 实现分页功能

分页组件设计

创建一个独立的 Pagination.vue 组件,接收当前页码、总页数等参数,通过事件触发页码变更。以下是一个基础实现模板:

<template>
  <div class="pagination">
    <button 
      @click="changePage(currentPage - 1)" 
      :disabled="currentPage === 1"
    >上一页</button>

    <span v-for="page in pages" :key="page">
      <button 
        @click="changePage(page)"
        :class="{ active: page === currentPage }"
      >{{ page }}</button>
    </span>

    <button 
      @click="changePage(currentPage + 1)" 
      :disabled="currentPage === totalPages"
    >下一页</button>
  </div>
</template>

<script>
export default {
  props: {
    currentPage: { type: Number, required: true },
    totalPages: { type: Number, required: true },
    maxVisiblePages: { type: Number, default: 5 }
  },
  computed: {
    pages() {
      const range = [];
      const half = Math.floor(this.maxVisiblePages / 2);
      let start = Math.max(1, this.currentPage - half);
      let end = Math.min(this.totalPages, start + this.maxVisiblePages - 1);

      if (end - start + 1 < this.maxVisiblePages) {
        start = Math.max(1, end - this.maxVisiblePages + 1);
      }

      for (let i = start; i <= end; i++) {
        range.push(i);
      }
      return range;
    }
  },
  methods: {
    changePage(page) {
      if (page >= 1 && page <= this.totalPages) {
        this.$emit('page-change', page);
      }
    }
  }
};
</script>

<style scoped>
.pagination { display: flex; gap: 5px; }
.active { background-color: #42b983; color: white; }
button:disabled { opacity: 0.5; cursor: not-allowed; }
</style>

数据分页处理

在父组件中处理数据分页逻辑,通常结合 slice 方法实现:

<template>
  <div>
    <ul>
      <li v-for="item in paginatedData" :key="item.id">{{ item.name }}</li>
    </ul>
    <Pagination 
      :current-page="currentPage" 
      :total-pages="totalPages"
      @page-change="onPageChange"
    />
  </div>
</template>

<script>
import Pagination from './Pagination.vue';

export default {
  components: { Pagination },
  data() {
    return {
      allData: [], // 从API获取的完整数据
      currentPage: 1,
      itemsPerPage: 10
    };
  },
  computed: {
    totalPages() {
      return Math.ceil(this.allData.length / this.itemsPerPage);
    },
    paginatedData() {
      const start = (this.currentPage - 1) * this.itemsPerPage;
      const end = start + this.itemsPerPage;
      return this.allData.slice(start, end);
    }
  },
  methods: {
    onPageChange(page) {
      this.currentPage = page;
    },
    async fetchData() {
      this.allData = await api.getItems(); // 替换为实际API调用
    }
  },
  mounted() {
    this.fetchData();
  }
};
</script>

后端分页集成

若数据量较大,建议采用后端分页(API支持分页参数):

async fetchPaginatedData(page) {
  const response = await axios.get('/api/items', {
    params: {
      page,
      per_page: this.itemsPerPage
    }
  });
  this.paginatedData = response.data.items;
  this.totalPages = response.data.total_pages;
}

高级功能扩展

  • 每页条数选择器:添加 select 元素动态修改 itemsPerPage
  • 跳转输入框:添加输入框支持直接跳转到指定页码
  • 省略号显示:当页码过多时用 ... 表示省略部分页码
  • 移动端适配:简化分页控件在移动端的显示
<template>
  <div class="pagination-advanced">
    <select v-model="itemsPerPage" @change="resetPage">
      <option value="5">5条/页</option>
      <option value="10">10条/页</option>
      <option value="20">20条/页</option>
    </select>

    <input 
      type="number" 
      v-model.number="inputPage" 
      @keyup.enter="jumpPage"
      min="1" 
      :max="totalPages"
    >
    <button @click="jumpPage">跳转</button>
  </div>
</template>

<script>
export default {
  methods: {
    resetPage() {
      this.currentPage = 1;
      this.$emit('per-page-change', this.itemsPerPage);
    },
    jumpPage() {
      const page = Math.max(1, Math.min(this.inputPage, this.totalPages));
      this.changePage(page);
    }
  }
};
</script>

性能优化建议

  • 对于大数据量优先使用后端分页
  • 使用 v-show 替代 v-if 保持分页组件DOM存在
  • 添加防抖处理频繁页码切换
  • 对分页按钮添加 key 提升Diff效率

通过以上实现可以构建出灵活的分页功能,根据实际项目需求选择前端分页或后端分页方案。

vue自己实现分页功能

标签: 分页功能
分享给朋友:

相关文章

vue实现名字查找功能

vue实现名字查找功能

实现名字查找功能 在Vue中实现名字查找功能,可以通过多种方式完成。以下是几种常见的实现方法: 使用v-model和computed属性 创建一个输入框,使用v-model绑定输入的值,通过com…

h5实现左右分页

h5实现左右分页

实现左右分页的HTML5方法 在HTML5中实现左右分页效果可以通过多种方式完成,以下是几种常见的方法: 使用CSS Flexbox布局 Flexbox是一种现代的布局方式,可以轻松实现左右分页效果…

vue实现论坛功能

vue实现论坛功能

实现论坛功能的核心模块 论坛功能通常包含用户发帖、回帖、分类浏览、搜索等核心模块。Vue.js 作为前端框架,需配合后端 API 实现数据交互。 基础项目结构搭建 使用 Vue CLI 或 Vite…

vue功能实现难点

vue功能实现难点

Vue 功能实现的常见难点 响应式系统深度监听 Vue 的响应式系统基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3),但对嵌套对象或数组的深层属性变化需要额外…

react如何实现分页

react如何实现分页

实现分页的基本思路 在React中实现分页通常需要以下几个核心步骤:管理当前页码状态、计算分页数据、渲染分页控件。以下是一个典型的分页实现方法。 管理分页状态 使用React的useState钩子来…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…