Element-Plus中表格及分页功能

导入Element-Plus

具体步骤如下:(内容参照官网:安装 | Element Plus)

# 选择一个你喜欢的包管理器

# NPM
$ npm install element-plus --save

# Yarn
$ yarn add element-plus

# pnpm
$ pnpm install element-plus

在main.js文件的引入 

// main.ts
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'

const app = createApp(App)

app.use(ElementPlus)
app.mount('#app')

完成以上步骤后即可在官网组件部分查找自己想用的插件进行使用了。 

VUE2版本方式

一、将官网中HTML源码复制到自己的文件中,对其中的参数进行修改。主要修改的是数据的绑定和部分样式的选择。
  <div class="demo-pagination-block">
    <div class="example-demonstration">
      <el-table :data="currentData" style="width: 100%">
        <el-table-column fixed type="index" :index="indexMethod" label="序号" width="50" />
        <el-table-column prop="nativeTip" show-overflow-tooltip label="本国子目" width="100" />
        <el-table-column prop="childrenTip" show-overflow-tooltip label="子目条文" width="100" />
        <el-table-column prop="date" label="数据版本" width="100" />

        <el-table-column fixed="right" label="操作" width="60">
          <template #default="scope">
            <el-button link type="primary" size="small" @click="handleClick(scope.$index)">
              详细
            </el-button>
          </template>
        </el-table-column>
      </el-table>
    </div>
<!-- 分页器 -->
    <el-pagination v-model:current-page="searchParams.pagenum" v-model:page-size="searchParams.pagesize" :small="small"
      :disabled="disabled" background layout="total,prev, pager, next, jumper" :total="total"
      @size-change="handleSizeChange" @current-change="handleCurrentChange" />
  </div>

说明:这里我用了首列索引来作为表头元素,但索引值并不是渲染在页面上副本数组中的索引,而是通过该索引计算后的值(即需要渲染在页面上的值),所以通过:index="indexMethod",绑定了indexMethod方法,该方法在methods中定义。

二、将JavaScript中的源码复制后进行修改
	export default {
		data() {
			return {
				searchParams: {
					pagesize: 5, //页面条数
					pagenum: 1, //当前页
				},
				total: 0,
				disabled: false, //是否禁选
				small: true,
				currentData: [], //渲染在页面上的副本
				tableData: [//虚拟数据
						{
						nativeTip: 'Cals',
						childrenTip: 'Tom',
						date: '2016-05-02',

					},
					{
						nativeTip: 'Sdaornia',
						childrenTip: 'Tom',
						date: '2016-05-22',

					},
					{
						nativeTip: 'Csfofif',
						childrenTip: 'Tom',
						date: '2016-05-21',

					}, {
						nativeTip: 'Gsdaw',
						childrenTip: 'Tom',
						date: '2016-05-11',

					}, {
						nativeTip: '2016-05-12',
						childrenTip: 'Tom',
						date: 'California',

					}, {
						nativeTip: 'FedDsa',
						childrenTip: 'Tom',
						date: '2016-05-04',

					},
					{
						nativeTip: 'California',
						childrenTip: 'Tom',
						date: '2016-05-31',

					}, {
						nativeTip: 'California',
						childrenTip: 'Tom',
						date: '2016-05-01',

					}, {
						nativeTip: 'California',
						childrenTip: 'Tom',
						date: '2016-05-04',

					}
				]
			};
		}
		
	}

 说明:这里用的是虚拟数据,所以需要一个副本将虚拟数据的内容进行深拷贝,然后根据当前页面大小和当前页数进行计算,将最终的副本数据进行渲染到页面上。步骤如下:

  1. 每次调用切换页面都将虚拟数据进行深拷贝到副本数据中。
  2. 对副本数据进行处理,根据要渲染第几页数据、一页有几条数据进行裁剪。
  3. 将最终的副本渲染到页面上。
methods: {
		
			// 修改索引
			indexMethod(index) {
				return index + 1 + (this.searchParams.pagenum - 1) * this.searchParams.pagesize
			},

			handleSizeChange(e) {
				console.log('SizeChange', e)

			},
			// 切换当前页面
			handleCurrentChange(e) {
				console.log('CurrentChange', e)

				this.searchParams.pagenum = e

				// 1.将获取到的数据存入副本中 深拷贝
				this.currentData = JSON.parse(JSON.stringify(this.tableData))
				console.log(this.tableData)
				// 2. 对数据进行处理
				let len = this.currentData.length //数据总条数
				console.log(len)
				this.total = len
				console.log('this.total', this.total)
				let num = len - this.searchParams.pagesize //判断是否过长了 多了多少个元素
				console.log(num)
				if (num > 0 && this.searchParams.pagenum === 1) {
					// 2.1 如果是第一页 且长度超过了页面展示长度
					// 进行裁剪 从页面展示的最后一个元素开始 一共num个元素
					this.currentData.splice(this.searchParams.pagesize, num)
					console.log(this.currentData)
				} else if (num > 0 && this.searchParams.pagenum !== 1) {
					// 数据过长 但不是第一页
					// 2.2.1 先裁剪掉前面的元素
					this.currentData.splice(0, (this.searchParams.pagenum - 1) * this.searchParams.pagesize)
					// 2.2.2 再裁剪掉后面的元素
					let len2 = this.currentData.length //判断是否过长了 还多了多少个元素
					if (len2 - this.searchParams.pagesize > 0) {
						this.currentData.splice((this.searchParams.pagesize), len2 - this.searchParams.pagesize)
					}

				}

			}
		},
		onLoad() {
			this.handleCurrentChange(1)
			
		}
项目成果: 

VUE3版本方式

 Vue3和Vue2的区别

两个最本质的区别在于拷贝,因为Vue3使用的是组合式API,所以在响应式基础上,能够对data中的数组进行直接拷贝渲染。

完整项目实例:
<template>

  <div>
    <!-- 面包屑 :separator-icon="ArrowRight"-->
    <el-breadcrumb>
      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
      <el-breadcrumb-item>账号列表</el-breadcrumb-item>
    </el-breadcrumb>
    <!-- 白色内容区域 -->
    <div class="page_content">
      <div class="flex">
        <div class="input_box">
          <el-input v-model="searchParams.query" placeholder="搜索关键字" class="input-with-select">
            <template #append>
              <el-button @click="searchList"><el-icon>
                  <Search />
                </el-icon></el-button>
            </template>
          </el-input>
        </div>
        <el-button type="primary" @click="addUser">新建用户</el-button>
      </div>
      <!-- 表格 -->
      <!-- 
              el-table  的  data:要展示的数据数组
              el-table-column:列 prop每条数据的对应属性
                label:列标题
                scope.row:相当于一条数据
             -->
      <el-table :data="users" style="width: 100%">
        <el-table-column prop="username" label="姓名" width="180" />
        <el-table-column prop="email" label="邮箱" width="180" />
        <el-table-column prop="mobile" label="电话" />
        <el-table-column prop="role_name" label="角色" />
        <el-table-column prop="mg_state" label="状态">
          <!-- <template #default="scope">
            <el-switch
              v-model="scope.row.mg_state"
              @change="switchChange(scope.row)"
            />
          </template> -->
        </el-table-column>
        <el-table-column label="操作">
          <template #default="scope">
            <el-button type="primary" @click="editRow(scope.row)">编辑</el-button>
            <el-button type="danger" @click="deleteRow(scope.row)">删除</el-button>
          </template>
        </el-table-column>
        <!-- mg_state 状态 -->
      </el-table>
      <!-- 分页 -->
      <el-pagination v-model:currentPage="searchParams.pagenum" v-model:page-size="searchParams.pagesize"
        :page-sizes="[1, 3, 5, 10]" layout="total, sizes, prev, pager, next" :total="total" @size-change="searchList"
        @current-change="searchList" />
    </div>
    
    <!-- 编辑弹窗 -->
    <el-dialog v-model="dialogFormEVisible" title="编辑用户">
      <!-- 
                表单 
                | email    | 邮箱     | 可以为空 |
                | mobile   | 手机号   | 可以为空 |
             -->
      <el-form ref="userForm2" :model="formData2" :rules="rules2">
        <el-form-item label="邮箱" prop="email">
          <el-input v-model="formData2.email" placeholder="请输入用户邮箱" />
        </el-form-item>
        <el-form-item label="手机号" prop="mobile">
          <el-input v-model="formData2.mobile" placeholder="请输入用户手机号" />
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="flex">
          <el-button>取消</el-button>
          <el-button type="primary" @click="submitEForm(userForm2)">确定</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>
<script>
import { toRefs, reactive, ref } from "vue";
// import { ArrowRight } from "@element-plus/icons-vue";
export default {
  name: "userList",
  setup() {
    const data = reactive({
      searchParams: {
        query: "",
        pagesize: 5,
        pagenum: 1,
      },
      total: 0,
      userList: [
        {
          username: "谭梦寻",
          email: "1232412@qq.com",
          mobile: "123123312312",
          role_name: "管理员",
          mg_state: "正常",
          id: 0,
        },
        {
          username: "江青影",
          email: "123242312@qq.com",
          mobile: "12312331231",
          role_name: "用户",
          mg_state: "正常",
          id: 1,
        },
        {
          username: "诸葛亮",
          email: "1232122@qq.com",
          mobile: "12312331231",
          role_name: "用户",
          mg_state: "正常",
          id: 2,
        },
        {
          username: "刘伯温",
          email: "1231232@qq.com",
          mobile: "12312331231",
          role_name: "用户",
          mg_state: "正常",
          id: 3,
        },
        {
          username: "张角",
          email: "1231232@qq.com",
          mobile: "13344431323",
          role_name: "用户",
          mg_state: "正常",
          id: 4,
        },
        {
          username: "刘备",
          email: "1231232@qq.com",
          mobile: "13344434343",
          role_name: "用户",
          mg_state: "正常",
          id: 5,
        },
        {
          username: "关羽",
          email: "1231232@qq.com",
          mobile: "12542331231",
          role_name: "用户",
          mg_state: "正常",
          id: 6,
        },
        {
          username: "曹操",
          email: "1231232@qq.com",
          mobile: "15678331231",
          role_name: "用户",
          mg_state: "正常",
          id: 7,
        },
      ],
      users: [],
      dialogFormVisible: false,
      dialogFormEVisible: false,
      formData: {
        username: "",
        password: "",
        email: "",
        mobile: "",
      },
      formData2: {
        id: "",
        email: "",
        mobile: "",
      },
      rules: {
        username: [{ required: true, message: "此项为必填", trigger: "blur" }],

        password: [{ required: true, message: "此项为必填", trigger: "blur" }],
        email: [
          {
            required: false,
            pattern:
              /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,
            message: "请填写正确邮箱",
            trigger: "blur",
          },
        ],
        mobile: [
          {
            required: false,
            pattern: /^[1][2,3,4,5,6,7,8,9][0-9]{9}$/,
            message: "请填写正确手机号",
            trigger: "blur",
          },
        ],
      },
      rules2: {
        email: [
          {
            required: false,
            pattern:
              /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/,
            message: "请填写正确邮箱",
            trigger: "blur",
          },
        ],
        mobile: [
          {
            required: false,
            pattern: /^[1][3,4,5,7,8][0-9]{9}$/,
            message: "请填写正确手机号",
            trigger: "blur",
          },
        ],
      },
    });
    const searchList = () => {
      // 使用正则表达式进行模糊查询
      const searchTerm = data.searchParams.query;
      const regex = new RegExp(searchTerm, "gi");
      console.log(data.searchParams);
      data.users = data.userList;
      data.users = data.users.filter((item) => regex.test(item.username));
      let len = data.users.length;
      let num = len - data.searchParams.pagesize;
      // 获取到的数组长度大于页面展示的长度
      if (num > 0 && data.searchParams.pagenum === 1) {
        console.log("展示首页内容!");
        data.users.splice(data.searchParams.pagesize, num);
      } else if (num > 0 && data.searchParams.pagenum !== 1) {
        console.log("展示后面的内容!");
        console.log(
          "前面要删除的数目:" +
          (data.searchParams.pagenum - 1) * data.searchParams.pagesize
        );
        data.users.splice(
          0,
          (data.searchParams.pagenum - 1) * data.searchParams.pagesize
        );
        // 二次截断
        let len2 = data.users.length;
        data.users.splice(
          data.searchParams.pagesize,
          len2 - data.searchParams.pagesize
        );
      }
      data.total = len;
    };
    const addUser = () => {
      data.dialogFormVisible = true;
    };
    // 新增提交
    const submitForm = (formEl) => {
      // validate
      formEl.validate((res) => {
        if (!res) {
          return;
        }
        // 表单通过对象形式新增到数组中
        // data.userList.push(data.formData);
        data.users.push(data.formData);
        // 隐藏弹窗
        data.dialogFormVisible = false;
        // 清空form
        data.formData = {
          username: "",
          password: "",
          email: "",
          mobile: "",
        };
      });
    };
    // 修改提交
    const submitEForm = (formEl) => {
      formEl.validate((res) => {
        if (!res) {
          return;
        }
        // 提交修改
        console.log(data.formData2);
        data.users[data.formData2.id].email = data.formData2.email;
        data.users[data.formData2.id].mobile = data.formData2.mobile;
        data.dialogFormEVisible = false;
        searchList();
      });
    };
    // 状态更改
    const switchChange = (row) => {
      console.log("操作的那条数据", row);
      if (row) {
        searchList();
      }
    };
    // 数据编辑
    const editRow = (row) => {
      console.log("编辑的那条数据", row);
      const { email, mobile, id } = row;
      // 展示编辑表单
      data.dialogFormEVisible = true;
      data.formData2.email = email;
      data.formData2.mobile = mobile;
      data.formData2.id = id;
    };
    // 删除数据
    const deleteRow = (row) => {
      console.log("删除的那条数据", row);
      let i = 0;
      console.log(row.email);
      for (i; i < data.users.length; i++) {
        if (data.users[i].email === row.email) {
          data.users.splice(i, 1);
        }
      }
      console.log(data.users);
    };

    // 方法初始化
    searchList();
    const userForm = ref();
    const userForm2 = ref();
    return {
      ...toRefs(data),
      searchList,
      addUser,
      submitForm,
      submitEForm,
      userForm,
      userForm2,
      // switchChange,
      editRow,
      deleteRow,
    };
  },
};
</script>
<style scoped>
.input_box {
  width: 200px;
  margin-right: 15px;
}
</style>
项目成果图:

总结: 

Element-Plus虽然给我们提供了框架,但是在实际运用时,还需要根据需求来编写代码逻辑,比如我这里用的是虚拟数据,所以需要利用副本来渲染,每一切换页面都要更新副本数据,假如后端直接提供参数来获取对应页数的数据条数,则不需要这样复杂的过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/662111.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

树与图的深度优先遍历

数和图的存储方式与遍历 数和图的存储方式&#xff1a; 一般有两种 树是一种特殊的图&#xff08;即无环联通图&#xff09;。所以下面只讲图。 图的话分为两种&#xff1a;①有向图&#xff08;边是有方向的&#xff1a;a➡️b&#xff09;和 ②无向图&#xff08;边是无方…

安全设计 | Microsoft 威胁建模工具Threat Modeling Tool安装、使用及威胁生成原理详解(文末附样例)

1. 概览 微软威胁建模工具&#xff08;Threat Modeling Tool&#xff09;是 Microsoft 安全开发生命周期 (SDL&#xff0c;Security Development LifeCycle) 的核心要素。 当潜在安全问题处于无需花费过多成本即可相对容易解决的阶段&#xff0c;软件架构师可以使用威胁建模工…

断开自定义模块与自定义库的链接

断开自定义模块与自定义库的链接 1、断开模块与库的链接 1、断开模块与库的链接 如果摸个库文件添加到模型中&#xff0c;无法“Disable Link”时&#xff0c;可以使用save_system命令进行断开到模型中用户定义的库模块的链接&#xff1b; 参考链接&#xff1a; 传送门 save…

Python词法和语法分析工具库之ply使用详解

概要 在编程语言的开发、编译器的实现和数据解析等领域,词法分析和语法分析是关键的技术。Python的ply库是一个功能强大的词法和语法分析工具,基于经典的Lex和Yacc工具实现。ply库为开发者提供了一种简单且高效的方法,用于定义词法规则和语法规则,从而实现对自定义语言和数…

现货白银交易点差是多少

现货白银投资者通过交易平台进行买卖操作的时候&#xff0c;平台会以“点差”的形式向投资者收取一定的交易费用。所谓的点差&#xff0c;也就是平台所报出的买入价和卖出价之间的固定差额&#xff0c;由于现货白银的报价是“成对”的&#xff0c;所以点差的存在也是其交易模式…

【SpringMVC】_SpringMVC项目返回HTML与JSON

目录 1. SpringMVC项目返回HTML页面 2. SpringMVC项目返回JSON 2.1 程序演示 2.2 关于响应的Content-Type 2.2.1 接口为对象 2.2.2 接口为String 2.2.3 接口为Map 本专栏已介绍&#xff1a; 返回静态页面&#xff1a; 【Spring MVC】_SpringMVC项目返回静态页面_mvc 返…

2024了,还有人在问为甚死锁?

大家好&#xff0c;我是javapub。 接上篇提到了锁&#xff0c;《InnoDB有哪些锁类型》。这么多的锁&#xff0c;你有遇到过死锁吗&#xff1f; 死锁是在事务数据库中会发生的一种特殊现象&#xff0c;多个事务在执行过程中&#xff0c;相互等待对方持有的资源&#xff0c;导致…

软件游戏缺失d3dcompiler_47.dll如何解决,简单有效的五种解决方法分享

在现代游戏中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“缺少d3dcompiler47.dll文件”。这个问题通常会导致游戏无法正常运行或出现崩溃的情况。为了解决这个问题&#xff0c;我总结出了以下五种解决方法。希望这些方法能够帮助到遇到相同问题的玩家。 …

论文解读之A General-Purpose Self-Supervised Model for Computational Pathology

一、前言 目前&#xff0c;有很多无知者认为计算机在疾病诊断上超过了人类&#xff0c;他们的理解是计算机在美丽国的某个什么医师测评上得分超过了人类。这比较可笑和无知。 笔者认为&#xff1a;病理图像的病症复杂、种类繁多&#xff0c;同时数据集很少并且标注极为困难。…

学习笔记——动态路由协议——OSPF(简介)

一、 OSPF简介 1、前言 由于静态路由由网络管理员手工配置&#xff0c;因此当网络发生变化时&#xff0c;静态路由需要手动调整&#xff0c;这制约了静态路由在现网大规模的应用。 动态路由协议因其灵活性高、可靠性好、易于扩展等特点被广泛应用于现网。在动态路由协议之中…

数字工厂管理系统可以和哪些软件集成

随着工业4.0时代的到来&#xff0c;数字工厂管理系统已成为制造业转型升级的核心驱动力。数字工厂管理系统通过集成各种软件和技术&#xff0c;实现了生产过程的数字化、网络化和智能化&#xff0c;大大提高了生产效率和管理水平。本文将探讨数字工厂管理系统可以与哪些软件集成…

在table表格中如何给tr的每一个子元素加haver效果

效果图&#xff1a; 核心代码&#xff1a; tbody tr :hover {background-color: #d5d5d5; } 改变子元素 tbody tr:hover {background-color: #d5d5d5; } 改变父元素 两段代码看起来一样&#xff0c;其实不一样&#xff0c;其中差了一个空格字符 希望可以帮到大家

Xilinx FPGA中的BUFFER

FPGA大型设计中推荐使用同步时序电路&#xff0c;同步时序电路基于时钟触发沿设计&#xff0c;对时钟的周期、占空比、延时和抖动有更高的要求。为满足时序的要求&#xff0c;一般采用全局时钟资源驱动设计的主时钟&#xff0c;FPGA的主时钟一般使用全铜层工艺实现&#xff0c;…

服务器内存与CPU要占用多少才合理?

一 通常服务器内存占用多少合理&#xff1f;cpu占用多少才合理&#xff1f; 1 通常配置范围建议&#xff1a; 建议CPU使用率不高于80%&#xff1b;内存使用率不高于80%&#xff1b; 注意&#xff1a;具体情况还需要根据服务器的实际负载和应用场景来判断。 2 内存使用率&…

揭秘智慧校园:可视化技术引领教育新篇章

随着科技的飞速发展&#xff0c;我们的生活方式正在经历一场前所未有的变革。而在这场变革中&#xff0c;学校作为培养未来人才的重要基地&#xff0c;也在不断地探索与创新。 一、什么是校园可视化&#xff1f; 校园可视化&#xff0c;就是通过先进的信息技术&#xff0c;将学…

光纤现网与接入网概念对应

OLT 一般在机房 一级分光可能在机房也可能在光交交接箱 路边的光交交接箱功能有分光或者光纤汇聚转换一下 二级分光在分光光纤箱里&#xff0c;楼道里面挂着的那种 ONU是家里的光猫

喜讯 | 盘古信息冠捷科技、锐明科技IMS项目荣获创新案例、优秀案例

5月28日&#xff0c;中国数据要素及行业应用创新大会盛大启幕&#xff0c;现场汇聚了中国工程院院士、数据要素研究机构及数据要素知名企业、数字要素行业生态代表等300位业内相关人士。广东盘古信息科技股份有限公司副总经理朱熀锋代表盘古信息出席大会&#xff0c;并带来了IM…

【SOFARPC框架的设计和实现】笔记记录

感谢刘老师对rpc框架的视频讲解&#xff1a;SOFAChannel#31 RPC框架的设计和实现_哔哩哔哩_bilibili 每个扩展点就是一个接口&#xff0c;可以通过实现接口来时拓展。 以registry举例&#xff0c;可以使用Extensible注解标记接口&#xff0c;然后Extension标记方法的实现。 …

STM32定时器及输出PWM完成呼吸灯

文章目录 一、STM32定时器原理1、基本定时器2、通用定时器&#xff08;1&#xff09;时钟源&#xff08;2&#xff09;预分频器PSC&#xff08;3&#xff09;计数器CNT&#xff08;4&#xff09;自动装载寄存器ARR 3、高级定时器 二、PWM工作原理三、控制LED以2s的频率周期性地…

esp8266的rtos和nonos区别

https://bbs.espressif.com/viewtopic.php?t75242#p100294 https://blog.csdn.net/ydogg/article/details/72598752