当前位置:首页 > VUE

vue实现分页页面

2026-01-23 11:31:53VUE

Vue实现分页页面

分页组件实现

创建一个独立的Pagination.vue组件,接收当前页码、总页数等参数,通过事件触发页码变化。

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

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

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

<script>
export default {
  props: {
    currentPage: Number,
    totalPages: Number,
    maxVisiblePages: {
      type: Number,
      default: 5
    }
  },
  computed: {
    pages() {
      const range = [];
      const half = Math.floor(this.maxVisiblePages / 2);
      let start = Math.max(1, this.currentPage - half);
      let end = Math.min(this.totalPages, start + this.maxVisiblePages - 1);

      if (end - start + 1 < this.maxVisiblePages) {
        start = Math.max(1, end - this.maxVisiblePages + 1);
      }

      for (let i = start; i <= end; i++) {
        range.push(i);
      }
      return range;
    }
  },
  methods: {
    changePage(page) {
      if (page >= 1 && page <= this.totalPages) {
        this.$emit('page-changed', page);
      }
    }
  }
};
</script>

<style>
.pagination {
  display: flex;
  gap: 5px;
  margin-top: 20px;
}
.active {
  background-color: #42b983;
  color: white;
}
</style>

数据分页处理

在父组件中处理数据分页逻辑,通常与API请求结合。

vue实现分页页面

<template>
  <div>
    <table>
      <tr v-for="item in paginatedData" :key="item.id">
        <td>{{ item.name }}</td>
      </tr>
    </table>

    <Pagination 
      :current-page="currentPage" 
      :total-pages="totalPages"
      @page-changed="handlePageChange"
    />
  </div>
</template>

<script>
import Pagination from './Pagination.vue';

export default {
  components: { Pagination },
  data() {
    return {
      allData: [],
      currentPage: 1,
      itemsPerPage: 10
    };
  },
  computed: {
    totalPages() {
      return Math.ceil(this.allData.length / this.itemsPerPage);
    },
    paginatedData() {
      const start = (this.currentPage - 1) * this.itemsPerPage;
      const end = start + this.itemsPerPage;
      return this.allData.slice(start, end);
    }
  },
  methods: {
    handlePageChange(page) {
      this.currentPage = page;
    },
    async fetchData() {
      try {
        const response = await api.get('/items');
        this.allData = response.data;
      } catch (error) {
        console.error(error);
      }
    }
  },
  created() {
    this.fetchData();
  }
};
</script>

服务器端分页

对于大数据量,建议使用服务器端分页,减少客户端压力。

vue实现分页页面

async fetchPaginatedData(page) {
  try {
    const response = await api.get('/items', {
      params: {
        page,
        limit: this.itemsPerPage
      }
    });
    this.paginatedData = response.data.items;
    this.totalItems = response.data.total;
  } catch (error) {
    console.error(error);
  }
}

分页样式优化

添加过渡效果和响应式设计提升用户体验。

.pagination button {
  padding: 5px 10px;
  border: 1px solid #ddd;
  background: white;
  cursor: pointer;
  transition: all 0.3s;
}

.pagination button:hover:not(:disabled) {
  background: #eee;
}

.pagination button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

@media (max-width: 600px) {
  .pagination {
    flex-wrap: wrap;
  }
}

分页功能扩展

添加每页显示数量选择器和跳转到指定页码功能。

<template>
  <div class="pagination-controls">
    <select v-model="itemsPerPage" @change="handleItemsPerPageChange">
      <option value="5">5条/页</option>
      <option value="10">10条/页</option>
      <option value="20">20条/页</option>
    </select>

    <input 
      type="number" 
      v-model="goToPage" 
      min="1" 
      :max="totalPages"
      @keyup.enter="handleGoToPage"
    >
    <button @click="handleGoToPage">跳转</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      goToPage: 1,
      itemsPerPage: 10
    };
  },
  methods: {
    handleItemsPerPageChange() {
      this.currentPage = 1;
      this.$emit('items-per-page-changed', this.itemsPerPage);
    },
    handleGoToPage() {
      if (this.goToPage >= 1 && this.goToPage <= this.totalPages) {
        this.$emit('page-changed', parseInt(this.goToPage));
      }
    }
  }
};
</script>

标签: 分页页面
分享给朋友:

相关文章

vue  实现分页

vue 实现分页

实现分页功能 在Vue中实现分页功能通常需要结合后端API或前端数据处理。以下是两种常见的实现方式: 前端分页实现 适用于数据量较小的情况,所有数据一次性加载到前端后进行分页处理: <…

vue页面实现流程

vue页面实现流程

Vue 页面实现流程 创建 Vue 项目 使用 Vue CLI 或 Vite 初始化项目。Vue CLI 适用于传统项目,Vite 适合现代轻量级应用。 安装依赖后,通过命令行工具运行项目初始化命令,…

vue实现页面签字

vue实现页面签字

实现页面签名的Vue方案 在Vue中实现页面签名功能,可以通过HTML5的Canvas元素结合手势或鼠标事件来捕获用户绘制轨迹。以下是具体实现方法: 安装签名库(可选) 使用现成的Vue签名…

Vue实现lagger页面

Vue实现lagger页面

Vue实现懒加载页面的方法 懒加载(Lazy Loading)是一种优化技术,用于延迟加载非关键资源,从而提升页面初始加载速度。在Vue中可以通过以下方式实现懒加载: 路由懒加载 使用Vue Rou…

react如何清除页面

react如何清除页面

清除页面内容的方法 在React中清除页面内容通常涉及重置组件状态或移除特定元素。以下是几种常见方法: 重置组件状态 通过将组件的状态重置为初始值来清除页面内容: const MyComponen…

vue实现页面导出

vue实现页面导出

Vue 实现页面导出为 PDF 或图片 使用 html2canvas 和 jsPDF 导出为 PDF 安装依赖库: npm install html2canvas jspdf --save 在 Vu…