当前位置:首页 > VUE

vue 分页如何实现

2026-03-10 06:51:46VUE

分页实现的基本思路

在Vue中实现分页功能通常需要结合后端API返回的分页数据(如当前页码、每页条数、总条数等)和前端UI组件。核心逻辑包括处理页码切换、数据请求和列表渲染。

后端API数据格式

典型的分页接口响应格式如下:

{
  "data": [...],       // 当前页数据列表
  "current_page": 1,   // 当前页码
  "per_page": 10,      // 每页条数
  "total": 100         // 总条数
}

前端实现步骤

定义分页状态

data() {
  return {
    list: [],          // 数据列表
    pagination: {
      currentPage: 1,  // 当前页
      pageSize: 10,    // 每页条数
      total: 0         // 总条数
    }
  }
}

请求分页数据方法

methods: {
  async fetchData() {
    const { currentPage, pageSize } = this.pagination
    const res = await api.getList({
      page: currentPage,
      size: pageSize
    })
    this.list = res.data
    this.pagination.total = res.total
  }
}

Element UI分页组件示例

<el-pagination
  :current-page="pagination.currentPage"
  :page-size="pagination.pageSize"
  :total="pagination.total"
  @current-change="handlePageChange"
  layout="total, prev, pager, next">
</el-pagination>

处理页码变更

methods: {
  handlePageChange(page) {
    this.pagination.currentPage = page
    this.fetchData()
  }
}

自定义分页组件实现

如果需要自定义分页UI,可以这样实现:

模板部分

<div class="pagination">
  <button 
    @click="prevPage" 
    :disabled="currentPage === 1">
    上一页
  </button>

  <span v-for="page in pageRange" 
        @click="goToPage(page)"
        :class="{ active: page === currentPage }">
    {{ page }}
  </span>

  <button 
    @click="nextPage" 
    :disabled="currentPage === totalPages">
    下一页
  </button>
</div>

逻辑部分

computed: {
  totalPages() {
    return Math.ceil(this.total / this.pageSize)
  },
  pageRange() {
    // 生成可见页码范围逻辑
    const range = []
    for (let i = 1; i <= this.totalPages; i++) {
      range.push(i)
    }
    return range
  }
},
methods: {
  goToPage(page) {
    this.currentPage = page
    this.$emit('page-change', page)
  }
}

性能优化建议

  • 添加加载状态避免重复请求
    
    data() {
    return {
      loading: false
    }
    }

methods: { async fetchData() { if (this.loading) return this.loading = true try { // ...请求逻辑 } finally { this.loading = false } } }

vue 分页如何实现


- 使用防抖处理快速翻页
```javascript
import { debounce } from 'lodash'

methods: {
  handlePageChange: debounce(function(page) {
    this.pagination.currentPage = page
    this.fetchData()
  }, 300)
}

完整示例代码

<template>
  <div>
    <ul>
      <li v-for="item in list" :key="item.id">{{ item.name }}</li>
    </ul>

    <el-pagination
      v-model:current-page="pagination.currentPage"
      :page-size="pagination.pageSize"
      :total="pagination.total"
      @current-change="fetchData"
      layout="prev, pager, next">
    </el-pagination>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [],
      pagination: {
        currentPage: 1,
        pageSize: 10,
        total: 0
      }
    }
  },
  mounted() {
    this.fetchData()
  },
  methods: {
    async fetchData() {
      const res = await api.getList({
        page: this.pagination.currentPage,
        size: this.pagination.pageSize
      })
      this.list = res.data
      this.pagination.total = res.total
    }
  }
}
</script>

分享给朋友:

相关文章

vue如何实现重新实现主题

vue如何实现重新实现主题

动态主题切换的实现 在Vue中实现动态主题切换,通常需要结合CSS变量和状态管理。通过修改根元素的CSS变量值,可以全局改变应用的主题样式。 定义主题相关的CSS变量在根元素中: :root {…

vue如何实现两栏布局

vue如何实现两栏布局

使用Flexbox实现两栏布局 Flexbox是CSS3中强大的布局方式,可以轻松实现两栏布局。在Vue中可以直接在组件的style标签中使用。 <template> <div…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

vue如何实现

vue如何实现

Vue 实现方法 Vue 提供了多种方式来实现功能,具体取决于需求。以下是一些常见场景的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。在组件中可以通过 pro…

js双击事件如何实现

js双击事件如何实现

实现双击事件的方法 在JavaScript中,可以通过监听dblclick事件或手动检测两次点击的时间间隔来实现双击事件。以下是几种常见的方法: 使用原生dblclick事件 element.add…

vue如何实现滤镜

vue如何实现滤镜

Vue 实现滤镜的方法 在 Vue 中实现滤镜效果可以通过多种方式,以下是常见的几种方法: 使用 CSS filter 属性 通过 CSS 的 filter 属性可以直接为元素添加滤镜效果。在 Vu…