分页请求策略
策略类型
use hook
在使用扩展 hooks 前,确保你已熟悉了 alova 的基本使用。
为分页场景下设计的 hook,它可以帮助你自动管理分页数据,数据预加载,减少不必要的数据刷新,流畅性提高 300%,编码难度降低 50%。你可以在下拉加载和页码翻页两种分页场景 下使用它,此 hook 提供了丰富的特性,助你的应用打造性能更好,使用更便捷的分页功能。
特性
- 丰富全面的分页状态;
- 丰富全面的分页事件;
- 更改 page、pageSize 自动获取指定分页数据;
- 数据缓存,无需重复请求相同参数的列表数据;
- 前后页预加载,翻页不再等待;
- 搜索条件监听自动重新获取页数;
- 支持列表数据的新增、编辑、删除;
- 支持刷新指定页的数据,无需重置;
- 请求级搜索防抖,无需自行维护;
使用
渲染列表数据
- vue
- react
- svelte
- solid
<template>
<div
v-for="(item, i) in data"
:key="item.id">
<span>{{ item.name }}</span>
<button
:loading="removing.includes(i)"
@click="remove(item)">
删除
</button>
</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/client';
const {
// 加载状态
loading,
// 列表数据
data,
// 是否为最后一页
// 下拉加载时可通过此参数判断是否还需要加载
isLastPage,
// 当前页码,改变此页码将自动触发请求
page,
// 每页数据条数
pageSize,
// 分页页数
pageCount,
// 总数据量
total,
// [3.3.0+]
// action状态,当对应的action触发时才会更改此状态,具体的值如下:
// empty string: 默认状态
// loading: 列表数据请求中
// removing: 列表数据删除中
// inserting: 列表数据插入中
// replacing: 列表数据替换中
status,
// [3.3.0+]
// 移除列表项
remove,
// [3.3.0+]
// 正在移除的row index数组,用于控制对应列的删除按钮状态
removing,
// [3.3.0+]
// 替换列表项
replace,
// [3.3.0+]
// 正在替换的row index,用于控制对应列的替换按钮状态
replacing
} = usePagination(
// Method实例获取函数,它将接收page和pageSize,并返回一个Method实例
(page, pageSize) => queryStudents(page, pageSize),
{
// 请求前的初始数据(接口返回的数据格式)
initialData: {
total: 0,
data: []
},
initialPage: 1, // 初始页码,默认为1
initialPageSize: 10, // 初始每页数据条数,默认为10
// [3.3.0+]
actions: {
// 当remove函数被调用时,此action将被触发,并接收remove函数的参数
remove: async row => {
// fetch移除接口...
}
}
}
);
// 翻到上一页,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/client';
const App = () => {
const {
// 加载状态
loading,
// 列表数据
data,
// 是否为最后一页
// 下拉加载时可通过此参数判断是否还需要加载
isLastPage,
// 当前页码,改变此页码将自动触发请求
page,
// 每页数据条数
pageSize,
// 分页页数
pageCount,
// 总数据量
total,
// [3.3.0+]
// action状态,当对应的action触发时才会更改此状态,具体的值如下:
// empty string: 默认状态
// loading: 列表数据请求中
// removing: 列表数据删除中
// inserting: 列表数据插入中
// replacing: 列表数据替换中
status,
// [3.3.0+]
// 移除列表项
remove,
// [3.3.0+]
// 正在移除的row index数组,用于控制对应列的删除按钮状态
removing,
// [3.3.0+]
// 替换列表项
replace,
// [3.3.0+]
// 正在替换的row index,用于控制对应列的替换按钮状态
replacing,
// 更新状态
update
} = usePagination(
// Method实例获取函数,它将接收page和pageSize,并返回一个Method实例
(page, pageSize) => queryStudents(page, pageSize),
{
// 请求前的初始数据(接口返回的数据格式)
initialData: {
total: 0,
data: []
},
initialPage: 1, // 初始页码,默认为1
initialPageSize: 10, // 初始每页数据条数,默认为10
// [3.3.0+]
actions: {
// 当remove函数被调用时,此action将被触发,并接收remove函数的参数
remove: async row => {
// fetch移除接口...
}
}
}
);
// 翻到上一页,page值更改后将自动发送请求
const handlePrevPage = () => {
update({
page: page - 1
});
};
// 翻到下一页,page值更改后将自动发送请求
const handleNextPage = () => {
update({
page: page + 1
});
};
// 更改每页数量,pageSize值更改后将自动发送请求
const handleSetPageSize = () => {
update({
pageSize: 20
});
};
return (
<div>
{data.map((item, i) => (
<div key={item.id}>
<span>{item.name}</span>
<button
loading={removing.includes(i)}
onClick={() => remove(item)}>
删除
</button>
</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/client';
const {
// 加载状态
loading,
// 列表数据
data,
// 是否为最后一页
// 下拉加载时可通过此参数判断是否还需要加载
isLastPage,
// 当前页码,改变此页码将自动触发请求
page,
// 每页数据条数
pageSize,
// 分页页数
pageCount,
// 总数据量
total,
// [3.3.0+]
// action状态,当对应的action触发时才会更改此状态,具体的值如下:
// empty string: 默认状态
// loading: 列表数据请求中
// removing: 列表数据删除中
// inserting: 列表数据插入中
// replacing: 列表数据替换中
status,
// [3.3.0+]
// 移除列表项
remove,
// [3.3.0+]
// 正在移除的row index数组,用于控制对应列的删除按钮状态
removing,
// [3.3.0+]
// 替换列表项
replace,
// [3.3.0+]
// 正在替换的row index,用于控制对应列的替换按钮状态
replacing
} = usePagination(
// Method实例获取函数,它将接收page和pageSize,并返回一个Method实例
(page, pageSize) => queryStudents(page, pageSize),
{
// 请求前的初始数据(接口返回的数据格式)
initialData: {
total: 0,
data: []
},
initialPage: 1, // 初始页码,默认为1
initialPageSize: 10, // 初始每页数据条数,默认为10
// [3.3.0+]
actions: {
// 当remove函数被调用时,此action将被触发,并接收remove函数的参数
remove: async row => {
// fetch移除接口...
}
}
}
);
// 翻到上一页,page值更改后将自动发送请求
const handlePrevPage = () => {
$page--;
};
// 翻到下一页,page值更改后将自动发送请求
const handleNextPage = () => {
$page++;
};
// 更改每页数量,pageSize值更改后将自动发送请求
const handleSetPageSize = () => {
$pageSize = 20;
};
</script>
{#each $data as item, i}
<div>
<span>{item.name}</span>
<button
loading="{removing.includes(i)}"
on:click="() => remove(item)">
删除
</button>
</div>
{/each}
<button on:click="{handlePrevPage}">上一页</button>
<button on:click="{handleNextPage}">下一页</button>
<button on:click="{handleSetPageSize}">设置每页数量</button>
<span>共有{pageCount}页</span>
<span>共有{total}条数据</span>
import { queryStudents } from './api.js';
import { usePagination } from 'alova/client';
const App = () => {
const {
// 加载状态
loading,
// 列表数据
data,
// 是否为最后一页
// 下拉加载时可通过此参数判断是否还需要加载
isLastPage,
// 当前页码,改变此页码将自动触发请求
page,
// 每页数据条数
pageSize,
// 分页页数
pageCount,
// 总数据量
total,
// [3.3.0+]
// action状态,当对应的action触发时才会更改此状态,具体的值如下:
// empty string: 默认状态
// loading: 列表数据请求中
// removing: 列表数据删除中
// inserting: 列表数据插入中
// replacing: 列表数据替换中
status,
// [3.3.0+]
// 移除列表项
remove,
// [3.3.0+]
// 正在移除的row index数组,用于控制对应列的删除按钮状态
removing,
// [3.3.0+]
// 替换列表项
replace,
// [3.3.0+]
// 正在替换的row index,用于控制对应列的替换按钮状态
replacing,
// 更新状态
update
} = usePagination(
// Method实例获取函数,它将接收page和pageSize,并返回一个Method实例
(page, pageSize) => queryStudents(page, pageSize),
{
// 请求前的初始数据(接口返回的数据格式)
initialData: {
total: 0,
data: []
},
initialPage: 1, // 初始页码,默认为1
initialPageSize: 10, // 初始每页数据条数,默认为10
// [3.3.0+]
actions: {
// 当remove函数被 调用时,此action将被触发,并接收remove函数的参数
remove: async row => {
// fetch移除接口...
}
}
}
);
// 翻到上一页,page值更改后将自动发送请求
const handlePrevPage = () => {
update({
page: page() - 1
});
};
// 翻到下一页,page值更改后将自动发送请求
const handleNextPage = () => {
update({
page: page() + 1
});
};
// 更改每页数量,pageSize值更改后将自动发送请求
const handleSetPageSize = () => {
update({
pageSize: 20
});
};
return (
<div>
{data().map((item, i) => (
<div key={item.id}>
<span>{item.name}</span>
<button
loading={removing.includes(i)}
onClick={() => remove(item)}>
删除
</button>
</div>
))}
<button onClick={handlePrevPage}>上一页</button>
<button onClick={handleNextPage}>下一页</button>
<button onClick={handleSetPageSize}>设置每页数量</button>
<span>共有{pageCount()}页</span>
<span>共有{total()}条数据</span>
</div>
);
};