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 相关文章推荐
浅谈tudou土豆网首页图片延迟加载的效果
Jun 23 Javascript
Grid得到选择行数据的方法总结
Jan 17 Javascript
兼容FF和IE的动态table示例自写
Oct 21 Javascript
在javascript中执行任意html代码的方法示例解读
Dec 25 Javascript
jquery实现的一个简单进度条效果实例
May 12 Javascript
jQuery基于图层模仿五星星评价功能的方法
May 07 Javascript
AngularJS基础 ng-src 指令简单示例
Aug 03 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
Aug 25 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
Sep 01 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
Nov 27 Javascript
Node+OCR实现图像文字识别功能
Nov 26 Javascript
vue实现数字动态翻牌的效果(开箱即用)
Dec 08 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缓存技术详细总结
2013/08/07 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
深入分析element ScrollBar滚动组件源码
2019/01/22 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
Python进程间通信Queue实例解析
2018/01/25 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
GWebs公司笔试题
2012/05/04 面试题
《小蝌蚪找妈妈》教学反思
2014/02/21 职场文书
大专生找工作自荐书
2014/06/10 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
离婚协议书样本
2015/01/26 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis