当前位置:首页 > VUE

vue分页条怎么实现

2026-02-22 03:40:10VUE

使用 Element UI 的分页组件

Element UI 提供了 el-pagination 组件,可以快速实现分页功能。

<template>
  <div>
    <el-table :data="currentPageData" border>
      <!-- 表格列定义 -->
      <el-table-column prop="name" label="姓名"></el-table-column>
      <el-table-column prop="age" label="年龄"></el-table-column>
    </el-table>
    <el-pagination
      @current-change="handleCurrentChange"
      :current-page="currentPage"
      :page-size="pageSize"
      :total="total"
      layout="prev, pager, next"
    ></el-pagination>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tableData: [], // 全部数据
      currentPage: 1, // 当前页码
      pageSize: 10, // 每页显示条数
      total: 0, // 总数据量
    };
  },
  computed: {
    currentPageData() {
      const start = (this.currentPage - 1) * this.pageSize;
      const end = start + this.pageSize;
      return this.tableData.slice(start, end);
    },
  },
  methods: {
    handleCurrentChange(page) {
      this.currentPage = page;
    },
    fetchData() {
      // 模拟 API 请求
      this.tableData = Array.from({ length: 50 }, (_, i) => ({
        name: `用户 ${i + 1}`,
        age: Math.floor(Math.random() * 30) + 18,
      }));
      this.total = this.tableData.length;
    },
  },
  mounted() {
    this.fetchData();
  },
};
</script>

使用 Vue 3 + Composition API 实现

如果使用 Vue 3 的 Composition API,可以更灵活地管理分页逻辑。

<template>
  <div>
    <table>
      <tr v-for="item in paginatedData" :key="item.id">
        <td>{{ item.name }}</td>
        <td>{{ item.age }}</td>
      </tr>
    </table>
    <div>
      <button @click="prevPage" :disabled="currentPage === 1">上一页</button>
      <span>当前页: {{ currentPage }}</span>
      <button @click="nextPage" :disabled="currentPage === totalPages">下一页</button>
    </div>
  </div>
</template>

<script setup>
import { ref, computed } from "vue";

const data = ref(Array.from({ length: 50 }, (_, i) => ({
  id: i + 1,
  name: `用户 ${i + 1}`,
  age: Math.floor(Math.random() * 30) + 18,
})));

const currentPage = ref(1);
const pageSize = ref(10);

const totalPages = computed(() => Math.ceil(data.value.length / pageSize.value));
const paginatedData = computed(() => {
  const start = (currentPage.value - 1) * pageSize.value;
  const end = start + pageSize.value;
  return data.value.slice(start, end);
});

const prevPage = () => {
  if (currentPage.value > 1) currentPage.value--;
};

const nextPage = () => {
  if (currentPage.value < totalPages.value) currentPage.value++;
};
</script>

后端分页实现(结合 API)

通常分页数据由后端返回,前端只需传递页码和每页大小。

<template>
  <div>
    <el-table :data="tableData" border>
      <el-table-column prop="name" label="姓名"></el-table-column>
      <el-table-column prop="age" label="年龄"></el-table-column>
    </el-table>
    <el-pagination
      @current-change="fetchData"
      :current-page="currentPage"
      :page-size="pageSize"
      :total="total"
      layout="prev, pager, next"
    ></el-pagination>
  </div>
</template>

<script>
import axios from "axios";

export default {
  data() {
    return {
      tableData: [],
      currentPage: 1,
      pageSize: 10,
      total: 0,
    };
  },
  methods: {
    async fetchData(page = 1) {
      this.currentPage = page;
      const response = await axios.get("/api/users", {
        params: {
          page: this.currentPage,
          pageSize: this.pageSize,
        },
      });
      this.tableData = response.data.list;
      this.total = response.data.total;
    },
  },
  mounted() {
    this.fetchData();
  },
};
</script>

自定义分页样式

如果需要自定义分页样式,可以基于 CSS 调整。

<template>
  <div class="pagination-container">
    <button @click="prevPage" :disabled="currentPage === 1">上一页</button>
    <span v-for="page in visiblePages" :key="page" 
          @click="goToPage(page)"
          :class="{ active: currentPage === page }">
      {{ page }}
    </span>
    <button @click="nextPage" :disabled="currentPage === totalPages">下一页</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      currentPage: 1,
      totalPages: 10,
      maxVisiblePages: 5,
    };
  },
  computed: {
    visiblePages() {
      const range = [];
      const start = Math.max(1, this.currentPage - 2);
      const end = Math.min(this.totalPages, start + this.maxVisiblePages - 1);
      for (let i = start; i <= end; i++) {
        range.push(i);
      }
      return range;
    },
  },
  methods: {
    prevPage() {
      if (this.currentPage > 1) this.currentPage--;
    },
    nextPage() {
      if (this.currentPage < this.totalPages) this.currentPage++;
    },
    goToPage(page) {
      this.currentPage = page;
    },
  },
};
</script>

<style>
.pagination-container {
  display: flex;
  gap: 5px;
  align-items: center;
}
.pagination-container span {
  cursor: pointer;
  padding: 5px 10px;
  border: 1px solid #ddd;
}
.pagination-container span.active {
  background-color: #409EFF;
  color: white;
}
</style>

vue分页条怎么实现

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

相关文章

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tabl…

利用vue 实现

利用vue 实现

以下是利用 Vue 实现常见功能的几种方法,分为不同场景和技术要点: 数据绑定与响应式更新 Vue 的核心特性是数据绑定,通过 v-model 实现双向绑定: <template>…

vue实现Siri

vue实现Siri

Vue 实现 Siri 风格语音交互 实现类似 Siri 的语音交互功能需要结合语音识别、语音合成和前端交互逻辑。Vue 作为前端框架,可以很好地管理这些功能的交互状态。 语音识别集成 使用 Web…

vue实现选人

vue实现选人

实现选人功能的基本思路 在Vue中实现选人功能通常涉及以下核心环节:数据绑定、用户交互处理、状态管理以及界面渲染。以下是具体实现方法: 数据准备与组件结构 创建包含人员信息的数组,通常从API获取或…

vue scrolltop 实现

vue scrolltop 实现

实现 Vue 中的 scrollTop 在 Vue 中实现滚动到顶部功能可以通过多种方式完成,包括使用原生 JavaScript、Vue 指令或第三方库。以下是几种常见的实现方法: 使用原生 Ja…

vue app 实现

vue app 实现

Vue App 实现步骤 创建Vue项目 使用Vue CLI或Vite初始化项目。Vue CLI适合传统项目,Vite适合现代轻量级应用。 npm create vue@latest my-v…