Skip to content

usePagination

A small reactive container for pagination state. Returns refs for the current page, page size, total item count and a list of available page-size options, plus imperative setters.

The defaults are conservative — page 1, 25 items per page and [5, 10, 25, 50, 100] as options. useDataTable builds on top of this composable.

Importing

ts
import { usePagination } from '@basmilius/common';

Usage

vue
<script setup lang="ts">
    import { usePagination } from '@basmilius/common';

    const {
        limits,
        page,
        perPage,
        total,
        setPage,
        setPerPage,
        setTotal
    } = usePagination();
</script>

<template>
    <select :value="perPage" @change="setPerPage(Number(($event.target as HTMLSelectElement).value))">
        <option v-for="limit in limits" :key="limit" :value="limit">
            {{ limit }}
        </option>
    </select>

    <button :disabled="page === 1" @click="setPage(page - 1)">Previous</button>
    <button :disabled="page * perPage >= total" @click="setPage(page + 1)">Next</button>
</template>

Returned bindings

PropertyTypeDescription
limitsRef<number[]>Available page-size options
pageRef<number>One-based current page (default 1)
perPageRef<number>Active page size (default 25)
totalRef<number>Total number of items
setPage(num)(num: number) => voidSet the current page
setPerPage(num)(num: number) => voidSet the page size
setTotal(num)(num: number) => voidSet the total count

Type signature

ts
declare function usePagination(): {
    readonly limits: Ref<number[]>;
    readonly page: Ref<number>;
    readonly perPage: Ref<number>;
    readonly total: Ref<number>;
    setPage(num: number): void;
    setPerPage(num: number): void;
    setTotal(num: number): void;
};

See also