资源说明:前言
最近在做一个前后端分离的项目,前端使用 Vue+ Element UI,而后端则使用 Lumen 做接口开发,其中分页是必不可少的一部分,本文就介绍如何基于以上环境做一个简单、可复用的分页功能。
先说后端
后端做的事情不多,只需要接受几个参数,根据参数来获取数据即可。
需要获取的参数如下:
pageSize(一页数据的数量)
pageIndex(第几页的数据)
然后就可以根据这两个参数计算出偏移量,再从数据库中取出相应的数据。
假如现在给出的参数为:pageSize=10,pageIndex = 2,也就是说每一页要10条记录,要第二页。
计算偏移量的公式为:page
Vue+Element UI+Lumen 实现通用表格分页功能是一个常见的前后端分离应用场景,涉及到的主要知识点包括前端的Vue.js框架、Element UI组件库以及后端的Lumen微服务框架。
后端部分使用Lumen处理分页逻辑。在Lumen中,我们需要接收前端传来的两个关键参数:`pageSize`(每页显示数据的数量)和`pageIndex`(当前页码)。通过这两个参数,我们可以计算出从数据库中获取数据的偏移量。偏移量的计算公式为:`pageSize * (pageIndex - 1)`。这确保了我们能正确地跳过前一页的数据,获取到当前页的数据。例如,当`pageSize=10`且`pageIndex=2`时,偏移量为`10 * (2 - 1) = 10`,这意味着从第11个记录开始获取数据。
基础的后端代码可能如下:
```php
public function getUser(Request $request)
{
$pageSize = $request->input('pageSize');
$pageIndex = $request->input('pageIndex');
$offset = $pageSize * ($pageIndex - 1);
return User::offset($offset)->limit($pageSize)->get();
}
```
为了提高代码的复用性和健壮性,可以将分页逻辑封装到一个公用的函数中,并设置默认参数值,如下所示:
```php
private $default_page_size = 30;
private $default_page_index = 1;
// 公用分页
public function pagination($request, $list)
{
$pageSize = $request->input('pageSize', $this->default_page_size);
$pageIndex = $request->input('pageIndex', $this->default_page_index);
$offset = $pageSize * ($pageIndex - 1);
$total = $list->count();
$list = $list->offset($offset)->limit($pageSize);
return ['list' => $list->get(), 'total' => $total];
}
// 获取用户列表
public function getUser(Request $request)
{
$list = User::query();
// 这里可以添加其他查询操作
return $this->pagination($request, $list);
}
```
前端部分,主要使用Vue.js和Element UI构建用户界面。Element UI提供了丰富的表格组件,其中包括分页功能。在Vue.js中,我们可以利用Vuex来管理状态,实现分页数据的获取和持久化。
我们需要在Vuex的`store.js`中定义状态、mutation、action和getter。状态`user`包含了列表数据、总条数、当前页码和每页大小。每次获取数据时,使用action中的`getUser`方法,同时通过getter`requestData`将分页参数添加到请求中:
```javascript
export default new Vuex.Store({
state: {
user: {
list: [],
total: 0,
pageIndex: 1,
pageSize: 10,
},
},
mutations: {
updateUser(state, data) {
state.user = { ...state.user, ...data };
},
},
actions: {
async getUser({ commit, state, getters }) {
const res = await $axios.get('/user', getters.requestData(state.user));
commit('updateUser', res);
},
},
getters: {
requestData(state) {
const { pageIndex, pageSize } = state.user;
const data = { pageIndex, pageSize };
return data;
},
},
});
```
为了实现数据的持久化,可以使用`vuex-localstorage`插件。安装后,在store配置中引入并使用它来保存和恢复`user`状态:
```javascript
import createPersist from 'vuex-localstorage';
// 在store的配置中添加
plugins: [createPersist()]
```
前端页面上,我们可以使用Element UI的``组件,结合Vuex的getter来渲染分页控件,并监听其事件,更新状态:
```html
```
通过这种方式,前端能够根据用户交互和后端返回的信息动态调整分页,实现一个可复用的通用表格分页功能。同时,前端的分页状态会在页面刷新后得到恢复,确保用户体验的一致性。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。