当前位置:首页 > 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
  }
}

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

相关文章

vue实现组件

vue实现组件

Vue 组件实现基础 Vue 组件是可复用的 Vue 实例,用于封装 UI 和逻辑。通过 .vue 文件或直接注册组件实现。 单文件组件 (SFC) 示例 <template>…

vue实现组件循环

vue实现组件循环

Vue 实现组件循环的方法 在 Vue 中,可以通过 v-for 指令实现组件的循环渲染。以下是几种常见的实现方式: 使用 v-for 渲染数组 通过 v-for 遍历数组数据,动态生成组件列表:…

vue 分页 实现

vue 分页 实现

Vue 分页实现方法 使用 Element UI 分页组件 Element UI 提供了现成的分页组件 el-pagination,适合快速集成。需要先安装 Element UI 库。 安装 Ele…

php分页代码简单实现

php分页代码简单实现

基本分页实现 在PHP中实现分页功能通常需要结合MySQL的LIMIT子句。以下是一个基础实现示例: <?php // 数据库连接 $conn = mysqli_connect("localh…

uniapp 分页组件

uniapp 分页组件

uniapp 分页组件实现方法 在uniapp中实现分页功能,可以通过自定义组件或使用第三方组件库完成。以下是几种常见实现方式: 自定义分页组件 创建一个名为uni-pagination的组件,模板…

php分页功能的实现

php分页功能的实现

分页功能的基本原理 分页功能的核心是通过SQL的LIMIT子句实现数据分段查询。LIMIT接受两个参数:起始位置偏移量和每页记录数。例如查询第2页(每页10条)的SQL语句为: SELECT * F…