当前位置:首页 > 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实现广告组件

vue实现广告组件

Vue 实现广告组件的核心方法 数据驱动的广告内容渲染 通过 props 接收广告数据(如图片URL、跳转链接等),使用 v-bind 动态绑定属性。典型结构包含 <a> 标签嵌套 <…

vue 分页的实现

vue 分页的实现

Vue 分页的实现方法 使用 Element UI 的分页组件 安装 Element UI: npm install element-ui 在 Vue 项目中引入 Element UI 的分页组件…

vue动态组件实现

vue动态组件实现

Vue 动态组件实现方法 使用 component 标签与 is 属性 通过 Vue 内置的 <component> 标签和 is 属性实现动态组件切换。is 的值可以是已注册的组件名或导…

vue实现分页

vue实现分页

Vue 实现分页的方法 使用 Element UI 的分页组件 Element UI 提供了现成的分页组件 el-pagination,适合快速集成到 Vue 项目中。 安装 Element UI:…

vue哪个组件实现动画

vue哪个组件实现动画

在Vue中实现动画效果,可以通过以下组件和方法实现: Vue内置动画组件 Vue提供了<transition>和<transition-group>两个内置组件,用于处理进…