当前位置:首页 > VUE

vue分页组件的实现

2026-01-21 12:48:58VUE

Vue分页组件的实现

基本结构设计

分页组件通常需要接收总数据量(total)、每页显示数量(pageSize)、当前页码(currentPage)等props。组件内部通过计算属性生成页码列表,并触发页码变更事件。

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

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

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

核心逻辑实现

通过计算属性动态生成页码列表,处理边界情况。使用v-model实现双向绑定更便捷。

export default {
  props: {
    total: Number,
    pageSize: {
      type: Number,
      default: 10
    },
    currentPage: {
      type: Number,
      default: 1
    }
  },
  computed: {
    totalPage() {
      return Math.ceil(this.total / this.pageSize)
    },
    pageList() {
      const range = 2 // 显示前后页码数
      const list = []
      for (let i = this.currentPage - range; i <= this.currentPage + range; i++) {
        if (i > 0 && i <= this.totalPage) {
          list.push(i)
        }
      }
      return list
    }
  },
  methods: {
    changePage(page) {
      if (page < 1 || page > this.totalPage) return
      this.$emit('update:currentPage', page)
      this.$emit('page-change', page)
    }
  }
}

样式优化

添加基础样式增强交互体验,使用CSS变量方便主题定制。

.pagination {
  display: flex;
  gap: 8px;
}
.pagination button {
  padding: 6px 12px;
  border: 1px solid #ddd;
  background: #fff;
  cursor: pointer;
}
.pagination button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}
.pagination span {
  padding: 6px 12px;
  border: 1px solid #ddd;
  cursor: pointer;
}
.pagination span.active {
  background: var(--primary-color, #1890ff);
  color: white;
  border-color: transparent;
}

高级功能扩展

支持显示总数、快速跳转、每页条数切换等功能时,可增加对应模板和逻辑。

<div class="pagination-extra">
  <span>共 {{ total }} 条</span>
  <select v-model="innerPageSize" @change="handleSizeChange">
    <option value="10">10条/页</option>
    <option value="20">20条/页</option>
  </select>
  <input 
    type="number" 
    v-model.number="inputPage" 
    @keyup.enter="jumpPage"
  >
</div>
data() {
  return {
    inputPage: null,
    innerPageSize: this.pageSize
  }
},
methods: {
  handleSizeChange() {
    this.$emit('update:pageSize', this.innerPageSize)
    this.$emit('size-change', this.innerPageSize)
  },
  jumpPage() {
    if (!this.inputPage) return
    this.changePage(Math.min(Math.max(1, this.inputPage), this.totalPage))
  }
}

使用示例

在父组件中引入并配置分页组件,通过事件监听实现数据加载。

vue分页组件的实现

<pagination
  :total="100"
  :page-size="10"
  :current-page.sync="currentPage"
  @page-change="loadData"
/>
data() {
  return {
    currentPage: 1,
    listData: []
  }
},
methods: {
  async loadData(page) {
    const res = await api.getList({
      page, 
      size: 10
    })
    this.listData = res.data
  }
}

标签: 分页组件
分享给朋友:

相关文章

elementui组件

elementui组件

ElementUI 组件概述 ElementUI 是一套基于 Vue.js 的桌面端组件库,提供丰富的 UI 组件,适用于快速开发中后台系统。以下是其核心组件分类及典型用法。 基础组件 Button…

vue实现组件

vue实现组件

Vue 实现组件的方法 Vue 中实现组件可以通过多种方式,包括全局注册、局部注册、单文件组件(SFC)等。以下是常见的实现方法。 全局注册组件 全局注册的组件可以在任何 Vue 实例或组件中使用。…

vue实现分页条数

vue实现分页条数

Vue 实现分页条数控制 在 Vue 中实现分页条数控制通常需要结合分页组件和后端 API 支持。以下是几种常见的实现方式: 使用 Element UI 的分页组件 Element UI 提供了强大…

vue前端实现分页

vue前端实现分页

实现分页的基本思路 在Vue中实现分页通常需要结合后端API返回的数据和前端的分页组件。核心逻辑包括计算总页数、处理当前页码变化以及动态加载数据。 使用Element UI的分页组件 Element…

vue加载实现分页

vue加载实现分页

Vue 实现分页加载的方法 使用 Element UI 的分页组件 安装 Element UI 后,可以直接使用其分页组件。在模板中添加分页组件,并绑定相关事件和数据。 <template&g…

vue组件实现vmodel

vue组件实现vmodel

Vue 组件实现 v-model 在 Vue 中,v-model 是双向数据绑定的语法糖,默认情况下绑定 value 属性并监听 input 事件。在自定义组件中实现 v-model 需要正确配置 p…