分页请求策略
策略类型
use hook
在使用扩展 hooks 前,确保你已熟悉了 alova 的基本使用。
为分页场景下设计的 hook,它可以帮助你自动管理分页数据,数据预加载,减少不必要的数据刷新,流畅性提高 300%,编码难度降低 50%。你可以在下拉加载和页码翻页两种分页场景下使用它,此 hook 提供了丰富的特性,助你的应用打造性能更好,使用更便捷的分页功能。
示例
特性
- ✨ 丰富全面的分页状态;
- ✨ 丰富全面的分页事件;
- ✨ 更改 page、pageSize 自动获取指定分页数据;
- ✨ 数据缓存,无需重复请求相同参数的列表数据;
- ✨ 前后页预加载,翻页不再等待;
- ✨ 搜索条件监听自动重新获取页数;
- ✨ 支持列表数据的新增、编辑、删除;
- ✨ 支持刷新指定页的数据,无需重置;
- ✨ 请求级搜索防抖,无需自行维护;
安装
- vue composition
- react
- svelte
# npm
npm install @alova/scene-vue --save
# yarn
yarn add @alova/scene-vue
# npm
npm install @alova/scene-react --save
# yarn
yarn add @alova/scene-react
# npm
npm install @alova/scene-svelte --save
# yarn
yarn add @alova/scene-svelte
使用
展示列表数据
- vue composition
- react
- svelte
<template>
<div
v-for="item in data"
:key="item.id">
<span>{{ item.name }}</span>
</div>
<button @click="handlePrevPage">上一页</button>
<button @click="handleNextPage">下一页</button>
<button @click="handleSetPageSize">设置每页数量</button>
<span>共有{{ pageCount }}页</span>
<span>共有{{ total }}条数据</span>
</template>
<script setup>
import { queryStudents } from './api.js';
import { usePagination } from '@alova/scene-vue';
const {
// 加载状态
loading,
// 列表数据
data,
// 是否为最后一页
// 下拉加载时可通过此参数判断是否还需要加载
isLastPage,
// 当前页码,改变此页码将自动触发请求
page,
// 每页数据条数
pageSize,
// 分页页数
pageCount,
// 总数据量
total
} = usePagination(
// Method实例获取函数,它将接收page和pageSize,并返回一个Method实例
(page, pageSize) => queryStudents(page, pageSize),
{
// 请求前的初始数据(接口返回的数据格式)
initialData: {
total: 0,
data: []
},
initialPage: 1, // 初始页码,默认为1
initialPageSize: 10 // 初始每页数据条数,默认为10
}
);
// 翻到上一页,page值更改后将自动发送请求
const handlePrevPage = () => {
page.value--;
};
// 翻到下一页,page值更改后将自动发送请求
const handleNextPage = () => {
page.value++;
};
// 更改每页数量,pageSize值更改后将自动发送请求
const handleSetPageSize = () => {
pageSize.value = 20;
};
</script>
import { queryStudents } from './api.js';
import { usePagination } from '@alova/scene-react';
const App = () => {
const {
// 加载状态
loading,
// 列表数据
data,
// 是否为最后一页
// 下拉加载时可通过此参数判断是否还需要加载
isLastPage,
// 当前页码,改变此页码将自动触发请求
page: [page, setPage],
// 每页数据条数
pageSize: [page, setPageSize],
// 分页页数
pageCount,
// 总数据量
total
} = usePagination(
// Method实例获取函数,它将接收page和pageSize,并返回一个Method实例
(page, pageSize) => queryStudents(page, pageSize),
{
// 请求前的初始数据(接口返回的数据格式)
initialData: {
total: 0,
data: []
},
initialPage: 1, // 初始页码,默认为1
initialPageSize: 10 // 初始每页数据条数,默认为10
}
);
// 翻到上一页,page值更改后将自动发送请求
const handlePrevPage = () => {
setPage(value => value - 1);
};
// 翻到下一页,page值更改后将自动发送请求
const handleNextPage = () => {
setPage(value => value + 1);
};
// 更改每页数量,pageSize值更改后将自动发送请求
const handleSetPageSize = () => {
setPageSize(20);
};
return (
<div>
{data.map(item => (
<div key={item.id}>
<span>{item.name}</span>
</div>
))}
<button onClick={handlePrevPage}>上一页</button>
<button onClick={handleNextPage}>下一页</button>
<button onClick={handleSetPageSize}>设置每页数量</button>
<span>共有{pageCount}页</span>
<span>共有{total}条数据</span>
</div>
);
};
<script>
import { queryStudents } from './api.js';
import { usePagination } from '@alova/scene-svelte';
const {
// 加载状态
loading,
// 列表数据
data,
// 是否为最后一页
// 下拉加载时可通过此参数判断是否还需要加载
isLastPage,
// 当前页码,改变此页码将自动触发请求
page,
// 每页数据条数
pageSize,
// 分页页数
pageCount,
// 总数据量
total
} = usePagination(
// Method实例获取函数,它将接收page和pageSize,并返回一个Method实例
(page, pageSize) => queryStudents(page, pageSize),
{
// 请求前的初始数据(接口返回的数据格式)
initialData: {
total: 0,
data: []
},
initialPage: 1, // 初始页码,默认为1
initialPageSize: 10 // 初始每页数据条数,默认为10
}
);
// 翻到上一页,page值更改后将自动发送请求
const handlePrevPage = () => {
$page--;
};
// 翻到下一页,page值更改后将自动发送请求
const handleNextPage = () => {
$page++;
};
// 更改每页数量,pageSize值更改后将自动发送请求
const handleSetPageSize = () => {
$pageSize = 20;
};
</script>
{#each $data as item}
<div>
<span>{item.name}</span>
</div>
{/each}
<button on:click="{handlePrevPage}">上一页</button>
<button on:click="{handleNextPage}">下一页</button>
<button on:click="{handleSetPageSize}">设置每页数量</button>
<span>共有{pageCount}页</span>
<span>共有{total}条数据</span>
指定分页数据
每个分页数据接口返回的数据结构各不相同,因此我们需要分别告诉usePagination
列表数据与总条数,从而帮助我们管理分页数据。
假如你的分页接口返回的数据格式是这样的:
interface PaginationData {
totalNumber: number;
list: any[];
}
此时你需要通过函数的形式返回列表数据与总条数。
usePagination((page, pageSize) => queryStudents(page, pageSize), {
// ...
total: response => response.totalNumber,
data: response => response.list
});
如果不指定 total 和 data 回调函数,它们将默认通过以下方式获取数据。
const total = response => response.total;
const data = response => response.data;
注意
data 回调函数必须返回一个列表数据,表示分页中所使用的数据集合,而 total 主要用于计算当前页数,在 total 回调函数中如果未返回数字,将会通过请求的列表数量是否少于 pageSize 值来判断当前是否为最后一页,这一般用于下拉加载时使用。
开启追加模式
默认情况下,翻页时会替换原有的列表数据,而追加模式是在翻页时会将下一页的数据追加到当前列表底部,常见的使用场景是下拉加载更多。
usePagination((page, pageSize) => queryStudents(page, pageSize), {
// ...
append: true
});