当前位置:首页 > 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实现双向绑定更便捷。

vue分页组件的实现

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变量方便主题定制。

vue分页组件的实现

.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))
  }
}

使用示例

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

<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的<component :is="currentTab">动态加载不同组件,结合v-for循环渲染选项卡标题,点击时切换curr…

vue实现组件封装

vue实现组件封装

Vue 组件封装方法 封装组件的基本步骤 创建独立的 .vue 文件,包含 template、script 和 style 三个部分。通过 props 接收父组件传递的数据,使用 $emit 触发…

vue实现水印组件

vue实现水印组件

Vue 水印组件实现 基础水印组件实现 创建一个基础水印组件,通过 props 接收文本、颜色、大小等参数: <template> <div class="watermark…

vue实现分页功能

vue实现分页功能

Vue 分页功能实现 在 Vue 中实现分页功能通常需要结合后端 API 或前端数据分页逻辑。以下是两种常见的实现方式: 前端分页实现 适用于数据量较小的情况,直接在 Vue 组件中处理分页逻辑…

vue如何实现目录组件

vue如何实现目录组件

实现目录组件的基本思路 在Vue中实现目录组件通常需要结合页面内容的结构化数据(如标题层级),通过动态渲染生成可交互的目录。核心步骤包括提取标题、生成目录结构、实现滚动联动等。 提取标题信息 通过…

vue组件传值实现分页

vue组件传值实现分页

Vue组件传值实现分页的方法 在Vue中实现分页功能,通常需要父子组件之间的数据传递。以下是几种常见的传值方式: 使用props传递数据 父组件通过props向子组件传递当前页码和总页数等分页信息…