element Table+Pagination实现分页

西门经国
2023-12-01
最近做项目时,有一个新需求:做一个列表展示,并且用上分页。
项目背景:前端框架是vue,我们的项目是电脑端,因此我们选择了element组件库
做一个列表展示,我们首先可以想到element的Table表格
首先,使用一个别人封装好的组件,基础的一定是最精华的,最基础的,我们想使用这个组件,最基础的的一定要有
Table组件表头:
<template>
    <el-table
      :data="tableData"
      style="width: 100%">
      <el-table-column
        prop="date"
        label="日期"
        width="180">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名"
        width="180">
      </el-table-column>
      <el-table-column
        prop="address"
        label="地址">
      </el-table-column>
    </el-table>
  </template>

template标签:HTML5提供的新标签,更加规范和语义化 ;可以把列表项放入template标签中,然后进行批量渲染。简单理解的话,可以把我们页面的HTML或者HTML+CSS放到template标签中,更加规范,方便进行批量渲染

:data:表格展示的数据
el-table-column:表格的每一列
prop : 对应列内容的字段名
label:定义表格的列名
我们只需要把prop和label替换成我们项目中对应的名字即可
接下来,我们说分页,直接想到了element的 Pagination 分页
<div class="block">
    <span class="demonstration">显示总数</span>
    <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page.sync="currentPage1"
      :page-size="100"
      layout="total, prev, pager, next"
      :total="1000">
    </el-pagination>
  </div>

<span class="demonstration">显示总数</span>:这个为了给我们区分做的标识,实际上我们使用这个组件的时候是不需要的

@size-change="handleSizeChange": 每页显示条目 改变时会触发
@current-change="handleCurrentChange": 当前页数 改变时会触发
:current-page.sync="currentPage1":当前页数默认为第一页
:page-size="100":每页的大小默认为100
layout="total, prev, pager, next":组件布局(总页数,前面的页数,当前页,后面的页数)
:total="1000":总页数为1000
这里,我们选择的不是一个最基础的分页功能,因为它不能满足我们的需求
关于total,我们需要从库里查询出来,所以我们需要改成变量
下面看一下我们的代码:
      //我们在Table表格上加了一个根据文件名称模糊查询的搜索框
      <div class="handle-box">
        <el-input
          v-model="query.name"
          placeholder="文件名"
          class="handle-input mr10"
        ></el-input>

        <el-button type="primary" icon="el-icon-search" @click="handleSearch"
          >搜索</el-button
        >
      </div> 
      <el-table
        :data="tableData"
        stripe
        border
        class="table"
        //这里我们添加了点击这一行的触发事件
        @row-click="openDetails"
      >
       //这里我们为了点击这一行能获取到id,但是页面不需要显示,我们用了v-if 
       <el-table-column
          v-if="false"
          prop="id"
          width="100"
          label="主键"
          //内容过长时隐藏,默认为false
          show-overflow-tooltip
        ></el-table-column>

        <el-table-column
          prop="name"
          width="100"
          label="文件名"
          show-overflow-tooltip
        ></el-table-column>

        <el-table-column
          prop="type"
          width="100"
          label="文件类型"
          show-overflow-tooltip
        ></el-table-column>

        <el-table-column
          prop="length"
          width="100"
          label="文件大小"
        ></el-table-column>

        <el-table-column
          prop="uploadTime"
          width="100"
          label="上传时间"
        ></el-table-column>

        <el-table-column
          prop="url"
          width="350"
          label="文件地址"
        ></el-table-column>
        //这里根据我们的业务需求,满足某些条件的时候按钮才可用
        <el-table-column label="操作" width="150" align="center">
          <template slot-scope="scope">
            <div
              v-if="
                ['video', 'application', 'audio', 'pdf'].includes(
                  scope.row.type
                )
              "
            >
              <el-button
                type="text"
                icon="el-icon-plus"
                class="blue"
                @click="addQuestion(scope.row)"
                >添加问题</el-button
              >
            </div>
            <div v-else>
              <el-button type="text" icon="el-icon-plus" disabled
                >添加问题</el-button
              >
            </div>
          </template>
        </el-table-column>
      </el-table>

 类似资料: