Vue+Element UI+Lumen实现通用表格分页功能


Posted in Javascript onFebruary 02, 2019

前言

最近在做一个前后端分离的项目,前端使用 Vue+ Element UI,而后端则使用 Lumen 做接口开发,其中分页是必不可少的一部分,本文就介绍如何基于以上环境做一个简单、可复用的分页功能。

先说后端

后端做的事情不多,只需要接受几个参数,根据参数来获取数据即可。

需要获取的参数如下:

  • pageSize(一页数据的数量)
  • pageIndex(第几页的数据)

然后就可以根据这两个参数计算出偏移量,再从数据库中取出相应的数据。

假如现在给出的参数为:pageSize=10pageIndex = 2,也就是说每一页要10条记录,要第二页。

计算偏移量的公式为:pageSize * (pageIndex - 1)

基本代码如下:

public function getUser(Request $request){
 $pageSize = $request->input('pageSize');
 $pageIndex = $request->input('pageIndex');
 $offset = $pageSize * ($pageIndex - 1);
 return User::offset($offset)
    ->limit($pageSize)
    ->get();
}

后端基本上只需要做这么多,就可以完成一个分页的功能了,但还是有几处地方需要改进一下:

  • 给参数一个默认值
  • 前端还需要知道整个表的数据的总数
  • 把分页做成一个公用的函数

改进后的代码如下:

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);
}

再说前端

前端相对于需要做的事情就比较多了,需要考虑几点:

  • 获取数据时需要带上分页的参数
  • 分页参数需要进行本地持久化,以免刷新页面回到第一页(后端设置的默认值)
  • 同样要抽象出一个通用的分页组件

获取数据

这里我们用 vuex来管理状态,然后在请求时带上分页数据:

store.js:

注意:

  • 这里为了方便展示代码,并没有使用模块化,项目中,最好将使用模块化方便管理。
  • 这里默认读者清楚 ES6 的语法
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}) {
   // $axios 只是我自己封装的一个函数 这里并不重要
   const res = await $axios.get('/user',getters.requestData(state.user))
   commit('updateUser',res);
  },
 },
 getters:{
  requestData(state) {
   return (origin) => {
    const {
     pageIndex,
     pageSize,
    } = origin;
    const data = {
     pageIndex,
     pageSize,
    };
    return data;
   }
  },
 }
})

数据持久化

现在如何获取数据已经搞定了,数据持久化我使用 vuex-localstorage,安装后,只需要在上面代码的基础上添加:

import createPersist from 'vuex-localstorage'
export default new vuex.Store({
 // 接着上面的
 plugins: [createPersist({
  namespace: 'studio-user',
  initialState: {},
  // ONE_WEEK
  expires: 7 * 24 * 60 * 60 * 1e3
 })]
})

公用分页组件

<template>
 <el-Pagination
 background
 layout="total, sizes, prev, pager, next, jumper"
 :total="module.total"
 :current-page.sync="module.pageIndex"
 :page-sizes="module.pageSizes"
 :page-size.sync="module.pageSize"
 @current-change="handleCurrentChange"
 @size-change="handleSizeChange"
 >
 </el-Pagination>
</template>
<script>
export default {
 props: {
 module: Object
 },
 methods: {
 getData() {
  this.$emit("get-data");
 },
 handleCurrentChange() {
  this.getData();
 },
 handleSizeChange(val) {
  this.getData();
 }
 }
};
</script>

使用分页组件

<template>
 <div class="container">
 <el-table
  :data="user.list"
  style="width: 100%;"
  >
  <el-table-column
   v-for="(item,index) in columns"
   :key="index"
   :prop="item.prop"
   :label="item.label"
   align="center"
  />
  </el-table>
  <pagination
  :module="user"
  @get-data="getData"
  />
 </div>
</template>
<script>
import Pagination from "@/common/components/Pagination";
import { mapActions, mapState } from "vuex";
export default {
 components: {
 Pagination,
 },
 data: () => ({
 columns: [
  {
  prop: "name",
  label: "姓名"
  },
  {
  prop: "性别",
  label: "sex"
  },
  {
  prop: "年龄",
  label: "age"
  },
 ]
 }),
 created() {
 this.getData();
 },
 methods: {
  ...mapActions({
   getData : "getUser",
  }) 
 },
 computed: {
 ...mapState(["user"])
 }
};
</script>

后记

将一些常用的功能抽象出来,打造一个自己的工具库,从而使开发效率更高。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
eval的两组性能测试数据
Aug 17 Javascript
js图片处理示例代码
May 12 Javascript
JS 弹出层 定位至屏幕居中示例
May 21 Javascript
node.js中watch机制详解
Nov 17 Javascript
js控制输入框获得和失去焦点时状态显示的方法
Jan 30 Javascript
Javascript的表单验证长度
Mar 16 Javascript
jQuery事件绑定用法详解
Sep 08 Javascript
JS+html5制作简单音乐播放器
Sep 13 Javascript
vuex进阶知识点巩固
May 20 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
Sep 25 Javascript
JS实现字体背景跑马灯
Jan 06 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
Feb 24 Javascript
JS基于ES6新特性async await进行异步处理操作示例
Feb 02 #Javascript
JS使用canvas中的measureText方法测量字体宽度示例
Feb 02 #Javascript
JS使用对象的defineProperty进行变量监控操作示例
Feb 02 #Javascript
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
Feb 02 #Javascript
通过cordova将vue项目打包为webapp的方法
Feb 02 #Javascript
用Cordova打包Vue项目的方法步骤
Feb 02 #Javascript
JS实现数组去重及数组内对象去重功能示例
Feb 02 #Javascript
You might like
用PHP写的MySQL数据库用户认证系统代码
2007/03/22 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
ThinkPHP开发--使用七牛云储存
2017/09/14 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
JavaScript中URL编码函数代码
2011/01/11 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
JavaScript 布尔操作符解析  &amp;&amp; || !
2012/08/10 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
nodeJs内存泄漏问题详解
2016/09/05 NodeJs
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
python实现删除文件与目录的方法
2014/11/10 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
Python对称的二叉树多种思路实现方法
2020/02/28 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
自动化专业个人求职信范文
2013/12/30 职场文书
2014信息技术专业毕业生自我评价
2014/01/17 职场文书