ElementUI的table的假分页实现

前言

一般我们的 table 都是会通过真分页来实现数据的展示的,但是有一些情况,我们可能会通过假分页的方式,比如数据量小,为了不增加后端接口的复杂性,前端通过假分页来实现分页。

正文

假分页,其实通过 js 数组的 slice 即可轻松实现,难的是如何响应 ElementUI 中的页码切换、页码大小切换、页面搜索。

通过千方百计的测试,笔者最终选择了一个简单可行的方案,那就是在 table 的 data 绑定里边,调用 js 数组的 slice 方法,以达到实时响应页面交互的效果:

    <el-table
      :data="testData.slice((this.page - 1) * this.size, (this.page - 1) * this.size + this.size)"
      style="width: 100%">

页码切换事件,也是相当简单,修改 data 中代表页码的 page,页大小的 size 即可:

// 修改页大小
      handleSizeChange(val) {
        this.size = val;
      },
// 修改页码
      handleCurrentChange(val) {
        this.page = val;
      }

而搜索和真分页一样操作,不用变:

      queryData() {
        this.queryTestDataByName({
          dataName: this.q
        });
        this.page = 1;
        this.size = 10;
      },

效果图:
在这里插入图片描述

全部代码

<template>
  <section>
    <el-row style="margin-top: 15px">
      <el-form :inline="true">
        <el-form-item label="单量名称">
          <el-input placeholder="根据单量名称查询" v-model="q" size="small"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" size="small" @click="queryData()">查询</el-button>
        </el-form-item>
        <el-form-item style="float: right">
          <el-button type="primary" size="small" @click="initKeyList()">初始化列表</el-button>
        </el-form-item>
      </el-form>
    </el-row>
    <el-table
      :data="testData.slice((this.page - 1) * this.size, (this.page - 1) * this.size + this.size)"
      style="width: 100%">
      <el-table-column
        type="index"
        label="序号"
        width="80">
      </el-table-column>
      <el-table-column
        prop="dataKey"
        label="单量编号">
      </el-table-column>
      <el-table-column
        prop="dataName"
        label="单量名称">
      </el-table-column>
      <el-table-column
        prop="updateUser"
        label="更新人	">
      </el-table-column>
      <el-table-column
        prop="updateTime"
        label="更新时间">
      </el-table-column>
      <el-table-column
        prop="yn"
        label="监控开启状态">
        <template slot-scope="scope">
          {{scope.row.yn === 1?'已监控':'未开启'}}
        </template>
      </el-table-column>
      <el-table-column
        label="操作">
        <template slot-scope="scope">
          <el-button type="primary" size="small" v-if="scope.row.yn===0" @click="updateTestDataYn(scope.row)">开启监控
          </el-button>
          <el-button type="danger" size="small" v-if="scope.row.yn===1" @click="updateTestDataYn(scope.row)">解除监控
          </el-button>
        </template>
      </el-table-column>
    </el-table>

    <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="page"
      :page-sizes="[10, 20, 50, 100]"
      :page-size="size"
      layout="total, sizes, prev, pager, next, jumper"
      :total="this.testData.length">
    </el-pagination>

  </section>
</template>

<script>
  import {mapState, mapActions} from 'vuex';

  export default {
    data() {
      return {
        q: "",
        page: 1,
        size: 10
      }
    },
    computed: mapState({
      testData: state => state.test.testData
    }),
    created() {
      this.getTestData();
    },
    mounted() {
    },

    methods: {
      ...mapActions('test', ['getTestData', 'updateTestData', 'queryTestDataByName']),
      updateTestDataYn(row) {
        let that = this;
        this.$confirm('确定修改:' + row.dataName, '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          console.log(row);
          this.$message({
            type: 'success',
            message: '修改成功!'
          });
          this.updateTestData(row);
          // 刷新数据,更新监控状态
          this.getTestData();
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消修改'
          });
        });
      },
      initKeyList() {
        if (this.testData.length > 0) {
          this.$message('列表不为空,无需重新加载!!!');
        } else {
          this.getTestData();
        }
      },
      queryData() {
        this.queryTestDataByName({
          dataName: this.q
        });
        this.page = 1;
        this.size = 10;
      },
      handleSizeChange(val) {
        this.size = val;
      },
      handleCurrentChange(val) {
        this.page = val;
      }
    },
    watch: {},
  }
</script>

<style scoped>

</style>

结尾

其实我是不怎么支持假分页,因为这样代码拓展性不强,万一数据量大了,就要被迫实现真分页了。
而真分页的后端接口:仅多了 page(页码)、size(页大小)两个参数,返回值加 total(数据总数) 即可,一点儿也不复杂。

本文实属项目不得已而为之。

### 回答1: Element UI 是一套基于 Vue.js 的组件库,其中包含了丰富的 UI 组件,比如 Table 表格组件。在使用 Element UI 的 Table 组件进行后端分页时,需要进行以下步骤: 1. 后端准备:首先,后端需要提供一个接口来获取分页数据。这个接口应该包含获取当前页数据的逻辑,同时还需要对分页参数进行处理,比如每页数量、当前页码等。 2. 前端配置:在前端代码中,需要对 Table 组件进行配置。首先,需要设置表格的数据源为后端接口,可以使用 `:data` 属性来设置,例如 `:data="tableData"`。`tableData` 是一个变量,用来存储后端返回的数据。接着,还需要设置表格的分页属性,使用 `:pager` 属性来配置,例如 `:pager="true"`。设置为 `true` 表示启用分页功能。 3. 分页参数传递:在请求后端数据时,需要将分页相关的参数传递给后端接口。例如,可以使用 `@load="handleLoad"` 事件来触发加载数据的方法,并在该方法中将分页参数传递给后端接口。 4. 后端返回数据:后端接口收到请求后,根据传递的分页参数进行相应的处理,然后返回包含当前页数据的结果。 5. 数据渲染:前端在接收到后端返回的数据后,可以将数据显示在 Table 组件中。可以通过 `v-for` 指令来循环遍历数据,然后在相应的列上使用插值表达式将数据渲染出来。 通过以上步骤,就可以实现 Element UI Table 的后端分页功能。前端通过配置表格的数据源和分页属性,然后将分页参数传递给后端接口,后端接口根据分页参数处理数据并返回给前端,最后前端将数据渲染显示在 Table 组件中。 ### 回答2: Element UI是一款基于Vue.js的UI组件库,其中包含了很多常用的UI组件,如Table(表格)。Element UI Table组件的后端分页是指在数据量较大时,通过与后端进行交互,在前端只展示部分数据,而不是一次性加载所有数据。 要实现Element UI Table的后端分页,需要先获取到后端返回的总数据量,然后根据每页展示的数据量和当前页码向后端发送请求,获取当前页的数据。具体的步骤如下: 1. 在后端实现数据接口:后端应提供一个接口用于获取表格数据。该接口需接收参数:每页展示的数据量、当前页码,并根据这些参数返回对应的数据。 2. 在前端配置Table组件:在前端代码中,配置Table组件,并指定相应的属性,如数据源(data)、每页展示的数据量(page-size)、总数据量(total),以及当前页码(current-page)等。 3. 设置分页:在前端代码中,配置分页组件(Pagination),并指定相应的属性,如总数据量(total)、每页展示的数据量(page-size),以及当前页码(current-page)等。 4. 定义获取数据的方法:在前端代码中,定义一个方法用于向后端发送请求并获取数据。该方法应接收当前页码作为参数,并通过Axios等工具发送请求,传递相应的参数和请求头信息。 5. 分页操作:当用户切换页码时,调用获取数据的方法,并将当前页码作为参数传入,从后端获取数据并更新表格展示的数据。 通过以上步骤,就可以实现Element UI Table的后端分页功能。每次用户切换页码时,都会向后端请求数据,只展示当前页的数据,从而降低了前端的内存和渲染开销。同时,也能提高用户体验,保证了页面的加载速度和性能。 ### 回答3: Element-UI是一个基于Vue.js的组件库,它提供了一系列的UI组件,其中包括了Table组件。 Element-UI的Table组件可以支持前端分页和后端分页两种方式。对于后端分页,我们需要在后端进行相应的处理来返回分页数据。 首先,在前端,我们需要使用Table组件的`data`属性来绑定后端返回的数据列表,并使用`total`属性来绑定后端返回的数据总量。 然后,在后端,我们需要根据前端传递过来的分页参数(如页码、每页条数等)来查询相应的数据,并计算出总量。然后将查询到的数据列表和总量返回给前端。 具体的后端分页实现方式会根据不同的后端技术而有所不同。 例如,对于Java后端,我们可以使用Spring Boot框架来实现后端分页。首先,在后端定义一个Controller,接收前端传递的分页参数,并调用Service层的方法进行数据查询和计算总量。然后将查询到的数据列表和总量封装成一个分页对象,并返回给前端。 ```java @RestController @RequestMapping("/api/table") public class TableController { @Autowired private TableService tableService; @GetMapping("/list") public ResultData<TableData> getList(@RequestParam("pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) { List<TableItem> dataList = tableService.getDataList(pageNumber, pageSize); int total = tableService.getTotal(); TableData tableData = new TableData(dataList, total); return new ResultData<>(tableData); } } ``` 在Service层,我们可以使用MyBatis等持久层框架进行数据查询,并在查询语句中加入分页逻辑。 ```java @Service public class TableServiceImpl implements TableService { @Autowired private TableMapper tableMapper; @Override public List<TableItem> getDataList(int pageNumber, int pageSize) { PageHelper.startPage(pageNumber, pageSize); return tableMapper.selectDataList(); } @Override public int getTotal() { return tableMapper.selectTotal(); } } ``` 对于其他后端技术,可以根据相应的框架和数据库操作工具来实现后端分页逻辑。 总之,Element-UI的Table组件支持后端分页,我们需要在前端将分页参数传递给后端,并在后端根据这些参数进行数据查询和计算总量,然后将查询到的数据列表和总量返回给前端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT小村

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值