前端表格分页功能

我的设想

1.一次性将所有数据请求到,然后分成很多部分给前端来显示

(优点:一次性请求完成,无需再请求,缺点:可能用户并不需要用到全部的数据段,而且数据量大的话请求很慢,非常影响用户体验)

2.分若干步请求数据,用户点击到哪一页,数据库请求哪一个区间段的数据(推荐)

(优点:用户需要哪部分请求哪部分,不需要将所有数据都拿过来,缺点:数据来到有延迟,因为每一次点击都是一次请求)

难点

如何确定用户请求哪一段数据并返回给用户

实现

在sql语句中有两个参数limit和offset当然也可以只用一个limit,他们的作用是请求时返回相应区间的数据

limit和offset:limit后面跟需要的数据条数,offset后面跟起始查询位置(从0开始)

所以我们只需要对这两个参数做文章即可,前端确定表格展示多少行,共有多少页,每次点击到某一页时知道当前的页码即可。

我们只需要对前端所要展示的表格添加一个触发函数,当用户需要点击任意页时,返回此页的页数,根据表格展示每页多少条数据,可以将limit的值和offset的值计算并发送请求至后台,后台再将相应的数据返回,这样就可以达到所想要的效果。

效果展示&代码

此功能采用vue2+axios+php+element ui来实现
其实可以采用任意后端语言(java,php等)以及前端请求(axios,ajax等)来配合完成,主要是对SQL中limit和offset的用法进一步了解。

效果展示
在这里插入图片描述
在这里插入图片描述

代码展示

//我对axios进一步的封装
export async function MyAxios(url,parms,success,failure) {

   await axios.get(url,{params:parms}).then(
        response=> {
            success(response)
        },
        error=>{
            failure(error)
    })

//php
function getUserInfos($limits,$offsets){
    $sql="select account,place,lasttime,counts from vue_userInfo ORDER BY lasttime DESC limit $limits offset $offsets ";
    return json_encode(ExecuteQuery($sql));
}
//vue2代码
<template>
  <div>

    <el-table
      class="userTable"
      :data="userData"
      border
      stripe
      max-height=770px
      highlight-current-row
      style="width: 100%">
      <el-table-column
        prop="account"
        label="用户名"
        width="180">
      </el-table-column>
      <el-table-column
        prop="place"
        label="登录地址"
        width="180">
      </el-table-column>
      <el-table-column
        prop="counts"
        label="登录次数">
      </el-table-column>
      <el-table-column
        prop="lasttime"
        label="最近登录时间">
      </el-table-column>
  </el-table>
      <el-pagination
      style="margin-top:10px"
      background
      layout="prev, pager, next"
      :page-size="15"
      @current-change="dealCurrentChange"
      :current-page="currentPage"
      :total="counts">
    </el-pagination>
  </div>
</template>

<script>
import {MyAxios} from '../utils/Verify.js'
  export default {
    data() {
      return {
        userData:[],
        counts:0,
        currentPage:1,
        limits:15,
        offsets:0
      }
    },
    computed:{
      parms(){
        return {action:'SearchInfos',limits:this.limits,offsets:this.offsets}
      }
    },
    created() {
      this.initData()
    },
    mounted() {
      console.log(this.account+"------"+this.password);
    },
    methods: {
      // 初始化数据
      initData(){
        this.offsets=0;
        MyAxios('/VDB/',this.parms,res=>{
          this.counts=JSON.parse(res.data.counts);
          this.userData=JSON.parse(res.data.Userlist)
          },error=>{console.log(error.message);})
      },
      // 处理页码改变时
      dealCurrentChange(val){
        this.offsets=(val-1)*this.limits
        MyAxios('/VDB/',this.parms,res=>{
        this.userData=[];
        this.userData=JSON.parse(res.data.Userlist)
        },error=>{console.log(error.message);})
      },

    },
  }
</script>
//此处需要用到vue的一系列知识点,不采用vue可以只看methods中的方法,只需要明白逻辑即可

element ui分页组件的地址—>其中有相应的文档,按文档查看即可

如果有什么不完善或者说做的不好的地方欢迎指出。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com; public class Pager { private int totalRows = 0; // 记录总数 private int totalPages = 0; // 总页数 private int pageSize = 10; // 每页显示数据条数,默认为10条记录 private int currentPage = 1; // 当前页数 private boolean hasPrevious = false; // 是否有上一页 private boolean hasNext = false; // 是否有下一页 public int getSearchFrom() { return (currentPage - 1) * pageSize; } public Pager() { } public void init(int totalRows) { this.totalRows = totalRows; this.totalPages = ((totalRows + pageSize) - 1) / pageSize; refresh(); // 刷新当前页面信息 } /** * * @return Returns the currentPage. * */ public int getCurrentPage() { return currentPage; } /** * * @param currentPage * current page * */ public void setCurrentPage(int currentPage) { this.currentPage = currentPage; refresh(); } /** * * @return Returns the pageSize. * */ public int getPageSize() { return pageSize; } /** * * @param pageSize * The pageSize to set. * */ public void setPageSize(int pageSize) { this.pageSize = pageSize; refresh(); } /** * * @return Returns the totalPages. * */ public int getTotalPages() { return totalPages; } /** * * @param totalPages * The totalPages to set. * */ public void setTotalPages(int totalPages) { this.totalPages = totalPages; refresh(); } /** * * @return Returns the totalRows. * */ public int getTotalRows() { return totalRows; } /** * * @param totalRows * The totalRows to set. * */ public void setTotalRows(int totalRows) { this.totalRows = totalRows; refresh(); } // 跳到第一页 public void first() { currentPage = 1; this.setHasPrevious(false); refresh(); } // 取得上一页(重新设定当前页面即可) public void previous() { if (currentPage > 1) { currentPage--; } refresh(); } // 取得下一页 public void next() { //System.out.println("next: totalPages: "
在 Vue 和 Element UI 中,实现前端表格分页可以遵循以下步骤: 1. 将表格数据存储在一个数组中,例如 tableData。 2. 定义每页显示的数据量,例如 pageSize。 3. 定义当前页码,例如 currentPage。 4. 根据 pageSize 和 currentPage 来计算当前页应该显示的数据,例如: ``` const start = (currentPage - 1) * pageSize; const end = start + pageSize; const pageData = tableData.slice(start, end); ``` 5. 将 pageData 显示在表格中。 6. 在表格下方添加分页组件,使用 Element UI 的 el-pagination 组件即可。将 total 属性设为 tableData.length,pageSize 属性设为 pageSize,v-model 绑定 currentPage。 完整代码示例: ``` <template> <div> <el-table :data="pageData"> <!-- 表格列 --> </el-table> <el-pagination :current-page="currentPage" :page-size="pageSize" :total="tableData.length" @current-change="handleCurrentChange" /> </div> </template> <script> export default { data() { return { tableData: [], // 表格数据 pageSize: 10, // 每页显示的数据量 currentPage: 1, // 当前页码 }; }, computed: { pageData() { const start = (this.currentPage - 1) * this.pageSize; const end = start + this.pageSize; return this.tableData.slice(start, end); }, }, methods: { handleCurrentChange(currentPage) { this.currentPage = currentPage; }, }, }; </script> ``` 这样就可以实现基本的前端表格分页了。如果需要支持排序、筛选等功能,可以在计算 pageData 的时候加入对应的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值