Skip to content

Pagination 分页 - Vant 4

📄 Pagination 分页

🎯 介绍

Pagination 组件用于数据量过多时,采用分页的形式将数据分隔,每次只加载一个页面。让大量数据展示更加清晰有序!

📦 引入

通过以下方式来全局注册组件,更多注册方式请参考组件注册

js
import { createApp } from 'vue';
import { Pagination } from 'vant';

const app = createApp();
app.use(Pagination);

🎯 代码演示

🔧 基础用法

通过 v-model 来绑定当前页码,就像翻阅一本精彩的书籍 📖

html
<template>
  <div class="demo-pagination">
    <van-pagination 
      v-model="currentPage" 
      :total-items="24" 
      :items-per-page="5" 
      @change="onPageChange"
    />
    <p class="current-info">当前第 {{ currentPage }} 页</p>
  </div>
</template>

<script>
import { ref } from 'vue';
import { showToast } from 'vant';

export default {
  setup() {
    const currentPage = ref(1);
    
    const onPageChange = (page) => {
      showToast(`跳转到第 ${page} 页`);
    };
    
    return { 
      currentPage,
      onPageChange
    };
  },
};
</script>

<style>
.demo-pagination {
  padding: 20px;
}
.current-info {
  margin-top: 10px;
  text-align: center;
  color: #666;
}
</style>

🎨 简单模式

mode 设置为 simple 来切换到简单模式,此时分页器不会展示具体的页码按钮,就像一个简洁的导航指南针 🧭

html
<template>
  <div class="demo-simple">
    <van-pagination 
      v-model="currentPage" 
      mode="simple" 
      :page-count="12"
      @change="onSimpleChange"
    />
    <p class="page-info">简洁模式:{{ currentPage }}/12</p>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const currentPage = ref(1);
    
    const onSimpleChange = (page) => {
      console.log(`简单模式切换到第 ${page} 页`);
    };
    
    return { 
      currentPage,
      onSimpleChange
    };
  },
};
</script>

<style>
.demo-simple {
  padding: 20px;
}
.page-info {
  margin-top: 10px;
  text-align: center;
  font-weight: bold;
}
</style>

显示省略号

设置 force-ellipses 后会展示省略号按钮,点击后可以快速跳转,像是给分页器装上了传送门 ⚡

html
<template>
  <div class="demo-ellipses">
    <van-pagination 
      v-model="currentPage" 
      :total-items="125" 
      :show-page-size="5" 
      force-ellipses
      @change="onEllipsesChange"
    />
    <p class="ellipses-info">省略号模式,总共 {{ Math.ceil(125/10) }} 页</p>
  </div>
</template>

<script>
import { ref } from 'vue';
import { showToast } from 'vant';

export default {
  setup() {
    const currentPage = ref(1);
    
    const onEllipsesChange = (page) => {
      showToast(`快速跳转到第 ${page} 页 🚀`);
    };
    
    return { 
      currentPage,
      onEllipsesChange
    };
  },
};
</script>

<style>
.demo-ellipses {
  padding: 20px;
}
.ellipses-info {
  margin-top: 10px;
  text-align: center;
  color: #1989fa;
}
</style>

自定义按钮

通过 prev-textnext-text 等插槽来自定义分页按钮的内容,让分页器拥有独特的个性 ✨

html
<template>
  <div class="demo-custom">
    <van-pagination 
      v-model="currentPage" 
      :total-items="50" 
      :show-page-size="5"
      @change="onCustomChange"
    >
      <template #prev-text>
        <van-icon name="arrow-left" /> 上一页
      </template>
      <template #next-text>
        下一页 <van-icon name="arrow" />
      </template>
      <template #page="{ number, text, active }">
        <span :class="{ 'custom-page': true, 'active': active }">
          {{ text }}
        </span>
      </template>
    </van-pagination>
    <p class="custom-info">自定义样式分页器</p>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const currentPage = ref(1);
    
    const onCustomChange = (page) => {
      console.log(`自定义分页器切换到第 ${page} 页`);
    };
    
    return { 
      currentPage,
      onCustomChange
    };
  },
};
</script>

<style>
.demo-custom {
  padding: 20px;
}
.custom-page {
  padding: 8px 12px;
  border-radius: 4px;
  transition: all 0.3s;
}
.custom-page.active {
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  color: white;
}
.custom-info {
  margin-top: 10px;
  text-align: center;
  font-style: italic;
}
</style>

API

Props

参数说明类型默认值
v-model当前页码,控制分页器的当前位置 📍number-
mode显示模式,可选值为 simple,切换分页器的展示风格 🎨stringmulti
prev-text上一页按钮文字,自定义向前导航的文本 ⬅️string上一页
next-text下一页按钮文字,自定义向后导航的文本 ➡️string下一页
page-count总页数,定义分页器的总页面数量 📊number | string根据页数计算
total-items总记录数,数据的总条目数量 📋number | string0
items-per-page每页记录数,控制每页显示的数据条数 📄number | string10
show-page-size显示的页码个数,控制可见页码按钮的数量 🔢number | string5
force-ellipses是否显示省略号,启用快速跳转功能 ⚡booleanfalse
show-prev-button v4.2.1是否展示上一页按钮,控制向前导航按钮的显示 👈booleantrue
show-next-button v4.2.1是否展示下一页按钮,控制向后导航按钮的显示 👉booleantrue

Events

事件名说明回调参数
change页码改变时触发,监听用户的分页操作 🔄page: number

Slots

名称描述参数
page自定义页码,打造个性化的页码按钮 🎯{ number: number, text: string, active: boolean }
prev-text自定义上一页按钮文字,个性化向前导航 ⬅️-
next-text自定义下一页按钮文字,个性化向后导航 ➡️-

类型定义

组件导出以下类型定义:

ts
import type { PaginationMode, PaginationProps } from 'vant';

主题定制

样式变量

组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 ConfigProvider 组件

名称默认值描述
--van-pagination-height40px分页器高度 📏
--van-pagination-font-sizevar(--van-font-size-md)字体大小 ✏️
--van-pagination-item-width36px页码按钮宽度 📐
--van-pagination-item-default-colorvar(--van-primary-color)默认页码颜色 🎨
--van-pagination-item-disabled-colorvar(--van-gray-7)禁用状态颜色 🚫
--van-pagination-item-disabled-backgroundvar(--van-background)禁用状态背景色 🔒
--van-pagination-backgroundvar(--van-background-2)分页器背景色 🖼️
--van-pagination-desc-colorvar(--van-gray-7)描述文字颜色 📝
--van-pagination-disabled-opacityvar(--van-disabled-opacity)禁用状态透明度 👻

📚 相关文档

基於Vant構建的企業級移動端解決方案