Skip to content

分页 Pagination ​

赞助

采用分页的形式分隔长列表,每次只加载一个页面

何时使用 ​

  • 当需要进行分页展示时

基本使用 ​

Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const page = ref(1)
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
</script>
<template>
  <Pagination v-model:page="page" :total="50" @change="onChange" />
</template>

自定义位置 ​

placement:
Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
import type { PaginationProps } from 'vue-amazing-ui'
const page = ref(1)
const total = ref(500)
const placementOptions = [
  {
    label: 'left',
    value: 'left'
  },
  {
    label: 'center',
    value: 'center'
  },
  {
    label: 'right',
    value: 'right'
  }
]
const placement = ref<PaginationProps['placement']>('left')
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
</script>
<template>
  <Flex vertical>
    <Space align="center">
      placement:
      <RadioGroup :options="placementOptions" v-model:value="placement" button button-style="solid" />
    </Space>
    <Pagination v-model:page="page" :total="total" :placement="placement" @change="onChange" />
  </Flex>
</template>

三种尺寸 ​

size:
Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
import type { PaginationProps } from 'vue-amazing-ui'
const page = ref(1)
const total = ref(500)
const sizeOptions = [
  {
    label: 'small',
    value: 'small'
  },
  {
    label: 'middle',
    value: 'middle'
  },
  {
    label: 'large',
    value: 'large'
  }
]
const size = ref<PaginationProps['size']>('middle')
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
</script>
<template>
  <Flex vertical>
    <Space align="center">
      size:
      <RadioGroup :options="sizeOptions" v-model:value="size" button button-style="solid" />
    </Space>
    <Pagination v-model:page="page" :size="size" :total="total" show-quick-jumper @change="onChange" />
  </Flex>
</template>

自定义页码数量 ​

pageAmount:
Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
import type { PaginationProps } from 'vue-amazing-ui'
const page = ref(1)
const total = ref(500)
const pageAmountOptions = [
  {
    label: '3',
    value: 3
  },
  {
    label: '5',
    value: 5
  },
  {
    label: '7',
    value: 7
  }
]
const pageAmount = ref(5)
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
</script>
<template>
  <Flex vertical>
    <Space align="center">
      pageAmount:
      <RadioGroup :options="pageAmountOptions" v-model:value="pageAmount" button button-style="solid" />
    </Space>
    <Pagination v-model:page="page" :total="total" :page-amount="pageAmount" @change="onChange" />
  </Flex>
</template>

无边框风格 ​

bordered:
Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const page = ref(1)
const total = ref(500)
const bordered = ref(false)
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
</script>
<template>
  <Flex vertical>
    <Space align="center">
      bordered:
      <Switch v-model:value="bordered" />
    </Space>
    <Pagination v-model:page="page" :total="total" :bordered="bordered" @change="onChange" />
    <Pagination v-model:page="page" :total="total" :bordered="bordered" disabled @change="onChange" />
  </Flex>
</template>

自定义 pageSize 切换选项 ​

Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const page = ref(1)
const pageSize = ref(10)
const total = ref(500)
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
function pageSizeChange(page: number, pageSize: number) { // 每页条数 pageSize 变化的回调
  console.log('pageSizeChange page', page)
  console.log('pageSizeChange pageSize', pageSize)
}
</script>
<template>
  <Pagination
    v-model:page="page"
    v-model:page-size="pageSize"
    :total="total"
    :page-size-options="[10, 20, 30, 40, 50]"
    @change="onChange"
    @pageSizeChange="pageSizeChange"
  />
</template>

隐藏 pageSize 切换器 ​

Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const page = ref(1)
const total = ref(500)
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
</script>
<template>
  <Pagination v-model:page="page" :total="total" :show-size-changer="false" @change="onChange" />
</template>

快速跳转 ​

跳转框只接受数字,回车或失焦即跳转;输入超出范围时落到首 / 末页


Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const page = ref(1)
const total = ref(500)
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
</script>
<template>
  <Pagination v-model:page="page" :total="total" show-quick-jumper @change="onChange" />
</template>

跳转确认按钮 ​

goButton 传 true 取默认文案「确定」,传字符串则作为自定义文案;有按钮时失焦不再自动跳转


Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const page = ref(1)
const total = ref(500)
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
</script>
<template>
  <Flex vertical>
    <Pagination v-model:page="page" :total="total" :show-quick-jumper="{ goButton: true }" @change="onChange" />
    <Pagination v-model:page="page" :total="total" :show-quick-jumper="{ goButton: '前往' }" @change="onChange" />
  </Flex>
</template>

数据总数 ​

Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const page = ref(1)
const total = ref(500)
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
</script>
<template>
  <Flex vertical>
    <Pagination v-model:page="page" :total="total" show-total @change="onChange" />
    <Pagination
      v-model:page="page"
      :total="total"
      :show-total="(total: number) => `Total ${total} items`"
      @change="onChange"
    />
    <Pagination
      v-model:page="page"
      :total="total"
      :show-total="(total: number, range: number[]) => `${range[0]}-${range[1]} of ${total} items`"
      @change="onChange"
    />
  </Flex>
</template>

禁用 ​

Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const page = ref(1)
const total = ref(500)
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
</script>
<template>
  <Pagination disabled v-model:page="page" :total="total" show-quick-jumper @change="onChange" />
</template>

自定义切换器与跳转框 ​

changerProps 透传给每页条数切换器(参考 Select Props),jumperProps 透传给跳转输入框(参考 Input Props)


Show Code
vue
<script setup lang="ts">
import { ref } from 'vue'
const page = ref(1)
const pageSize = ref(10)
const total = ref(500)
function onChange(page: number, pageSize: number) { // 页码 page 或每页条数 pageSize 改变的回调
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
function pageSizeChange(page: number, pageSize: number) { // 每页条数 pageSize 变化的回调
  console.log('pageSizeChange page', page)
  console.log('pageSizeChange pageSize', pageSize)
}
</script>
<template>
  <Pagination
    v-model:page="page"
    v-model:page-size="pageSize"
    :total="total"
    show-quick-jumper
    :changer-props="{ width: 120 }"
    :jumper-props="{ placeholder: '页码', width: 56 }"
    @change="onChange"
    @pageSizeChange="pageSizeChange"
  />
</template>

分页配置器 ​

size:
placement:
bordered:
pageAmount:
disabled:
hideOnSinglePage:
showTotal:
showQuickJumper:
showSizeChanger:
total:
showQuickJumper.goButton:

Show Code
vue
<script setup lang="ts">
import { reactive, ref } from 'vue'
import type { PaginationProps } from 'vue-amazing-ui'
const page = ref(1)
const pageSize = ref(10)
const sizeOptions = [
  {
    label: 'small',
    value: 'small'
  },
  {
    label: 'middle',
    value: 'middle'
  },
  {
    label: 'large',
    value: 'large'
  }
]
const placementOptions = [
  {
    label: 'left',
    value: 'left'
  },
  {
    label: 'center',
    value: 'center'
  },
  {
    label: 'right',
    value: 'right'
  }
]
const pageAmountOptions = [
  {
    label: '3',
    value: 3
  },
  {
    label: '5',
    value: 5
  },
  {
    label: '7',
    value: 7
  }
]
const totalOptions = [
  {
    label: '0',
    value: 0
  },
  {
    label: '5',
    value: 5
  },
  {
    label: '500',
    value: 500
  }
]
const goButton = ref(false)
// 配置器:一次覆盖全部展示型属性,初值一律取组件属性默认值;
// total 保留 500(组件默认为 0,但 total 为 0 时整块分页隐藏,配置器将无内容可看)
const config = reactive({
  bordered: true,
  size: 'large' as PaginationProps['size'],
  placement: 'center' as PaginationProps['placement'],
  pageAmount: 5,
  disabled: false,
  hideOnSinglePage: false,
  showTotal: false,
  showQuickJumper: false,
  // 组件默认 undefined,total 大于 50 时生效为 true;开关只能表达布尔值,故取当前实际默认
  showSizeChanger: true,
  total: 500
})
// 页码 page 或每页条数 pageSize 改变的回调
function onChange(page: number, pageSize: number) {
  console.log('change page', page)
  console.log('change pageSize', pageSize)
}
// 每页条数 pageSize 变化的回调
function pageSizeChange(page: number, pageSize: number) {
  console.log('pageSizeChange page', page)
  console.log('pageSizeChange pageSize', pageSize)
}
</script>
<template>
  <Row :gutter="[24, 12]">
    <Col :span="8">
      <Space gap="small" vertical>
        size:
        <RadioGroup :options="sizeOptions" v-model:value="config.size" button button-style="solid" />
      </Space>
    </Col>
    <Col :span="8">
      <Space gap="small" vertical>
        placement:
        <RadioGroup :options="placementOptions" v-model:value="config.placement" button button-style="solid" />
      </Space>
    </Col>
    <Col :span="8">
      <Space gap="small" vertical>
        bordered:
        <Switch v-model:value="config.bordered" />
      </Space>
    </Col>
    <Col :span="8">
      <Space gap="small" vertical>
        pageAmount:
        <RadioGroup :options="pageAmountOptions" v-model:value="config.pageAmount" button button-style="solid" />
      </Space>
    </Col>
    <Col :span="8">
      <Space gap="small" vertical>
        disabled:
        <Switch v-model:value="config.disabled" />
      </Space>
    </Col>
    <Col :span="8">
      <Space gap="small" vertical>
        hideOnSinglePage:
        <Switch v-model:value="config.hideOnSinglePage" />
      </Space>
    </Col>
    <Col :span="8">
      <Space gap="small" vertical>
        showTotal:
        <Switch v-model:value="config.showTotal" />
      </Space>
    </Col>
    <Col :span="8">
      <Space gap="small" vertical>
        showQuickJumper:
        <Switch v-model:value="config.showQuickJumper" />
      </Space>
    </Col>
    <Col :span="8">
      <Space gap="small" vertical>
        showSizeChanger:
        <Switch v-model:value="config.showSizeChanger" />
      </Space>
    </Col>
    <Col :span="8">
      <Space gap="small" vertical>
        total:
        <RadioGroup :options="totalOptions" v-model:value="config.total" button button-style="solid" />
      </Space>
    </Col>
    <Col :span="8">
      <Space gap="small" vertical>
        showQuickJumper.goButton:
        <Switch v-model:value="goButton" :disabled="!config.showQuickJumper" />
      </Space>
    </Col>
  </Row>
  <br/>
  <Pagination
    v-model:page="page"
    v-model:page-size="pageSize"
    v-bind="config"
    :show-quick-jumper="config.showQuickJumper ? { goButton } : false"
    @change="onChange"
    @pageSizeChange="pageSizeChange"
  />
</template>

APIs ​

受控 / 非受控:page / pageSize 传入即受控(值以父为准,组件只上报 update:page / update:pageSize);不传则由组件自持,交互照常生效,可用 defaultPage / defaultPageSize 指定初值。

Pagination Props ​

名称说明类型默认值
page v-model当前页数(不传时组件自持,可用 defaultPage 指定初值)numberundefined
defaultPage非受控时的初始页数,未绑 v-model:page 时生效;缺省为 1numberundefined
pageSize v-model每页条数(不传时组件自持,可用 defaultPageSize 指定初值)numberundefined
defaultPageSize非受控时的初始每页条数,未绑 v-model:page-size 时生效;缺省为 10numberundefined
total数据总数number0
disabled是否禁用booleanfalse
pageAmount显示的页码数number5
hideOnSinglePage只有一页时是否隐藏分页booleanfalse
showQuickJumper是否可以快速跳转至某页,对象形态可展示跳转确认按钮boolean | PaginationQuickJumperfalse
jumperProps快速跳转组件 props,参考 Input PropsInputProps{}
showSizeChanger是否展示 pageSize 切换器,当 total 大于 50 时默认为 truebooleanundefined
changerPropspageSize 切换器组件 props,参考 Select PropsSelectProps{}
pageSizeOptions设置每页可以显示多少条string[] | number[][10, 20, 50, 100]
showTotal用于显示数据总量和当前数据顺序boolean | ((total: number, range: number[]) => string)false
bordered页码是否显示边框,false 时为无边框风格booleantrue
placement分页展示位置'left' | 'center' | 'right''center'
size分页按钮大小'large' | 'middle' | 'small''large'

PaginationQuickJumper Type ​

名称说明类型
goButton?是否展示跳转确认按钮;传字符串时作为按钮文案,有按钮时失焦不再自动跳转boolean | string

Events ​

名称说明类型
change页码 page 或每页条数 pageSize 改变的回调(page: number, pageSize: number) => void
pageSizeChange每页条数 pageSize 变化的回调(page: number, pageSize: number) => void

Released under the MIT License.