Element-Plus中表格及分页功能

news2024/9/23 5:31:09

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读笔记】The Google File System

1 简介 Google File System (GFS) 是一个可扩展的分布式文件系统&#xff0c;专为快速增长的Google数据处理需求而设计。这篇论文发表于2003年&#xff0c;此前已在Google内部大规模应用。 GFS不仅追求性能、可伸缩性、可靠性和可用性等传统分布式文件系统的设计目标&#xf…

超市进销存|基于SprinBoot+vue的超市进销存系统(源码+数据库+文档)

超市进销存系统 目录 基于SprinBootvue的超市进销存系统 一、前言 二、系统设计 三、系统功能设计 1 登录注册 2 管理员功能模块 3员工功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#x…

leetcode 1264页面推荐(postgresql)

需求 朋友关系列表&#xff1a; Friendship ---------------------- | Column Name | Type | ---------------------- | user1_id | int | | user2_id | int | ---------------------- 这张表的主键是 (user1_id, user2_id)。 这张表的每一行代表着 user1_id 和 user2_id 之间…

URL跳转

1.URL介绍 开放重定向&#xff08;Open Redirect&#xff09;&#xff0c;也叫URL跳转漏洞&#xff0c;是指服务端未对传入的跳转url变量进行检查和控制&#xff0c;导致诱导用户跳转到恶意网站&#xff0c;由于是从可信的站点跳转出去的&#xff0c;用户会比较信任。 2.URL跳…

【最新区块链论文录用资讯】CCF A—INFOCOM 2024 共17篇

Conference&#xff1a;IEEE International Conference on Computer Communications CCF level&#xff1a;CCF A Categories&#xff1a;计算机网络 Year&#xff1a;2024 Num&#xff1a;17 A Generic Blockchain-based Steganography Framework with High Capacity via …

员工管理和激励怎么做?试试场景化激励解决方案!

截止到2020年底&#xff0c;中国企业主体数量达3858.3万&#xff0c;同比增速达11.1%。如何留住人才、激励人才以强化人才与企业“黏性”&#xff0c;最大化提升员工的忠诚度与敬业度&#xff0c;成为企业未来人才发展战略的主要方向之一。 一、传统激励方式存在哪些不足 传统的…

【加密与解密(第四版)】第十三章笔记

第十三章 HOOK技术 13.1 Hook概述 IAT HOOK&#xff08;改地址&#xff09; BOOL IAT_InstallHook(){BOOL bResult FALSE ;HMODULE hCurExe GetModuleHandle(NULL);PULONG_PTR pt ;ULONG_PTR OrginalAddr;bResult InstallModuleIATHook(hCurExe,"user32.dll",&qu…

若依启动run-modules-system.bat报错问题解决方案

在启动run-modules-system.bat时遇到了一些问题,在网上搜索无果后,排查解决完毕 1.启动nacos时,报错如下 Error creating bean with name grpcClusterServer: Invocation of init method failed; nested exception is java.io.IOException: Failed to bind to address 0.0.0.0…

CSS精灵图

详细内容见B站黑马程序员网课&#xff1a; 【前端Web开发HTML5CSS3移动web视频教程&#xff0c;前端web入门首选黑马程序员】https://www.bilibili.com/video/BV1kM4y127Li?p99&vd_source06e5549bf018e111f4275c259292d0da

智慧林业云巡平台 客户端和移动端(支持语音和视频)自动定位巡护,后端离线路线监测

目前现状 无法客观、方便地掌握护林员的到位情况&#xff0c;因而无法有效地保证巡护人员按计划要求&#xff0c;按时按周期对所负责的林区开展巡护&#xff0c;使巡护工作的质量得不到保证。遇到火情、乱砍滥伐等灾情时无法及时上报处理&#xff0c;现场状况、位置等信息描述…

代码随想录——左叶子之和(Leetcode404)

题目链接 BFS 队列 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

小程序使用vant组件库

一:下载组件库 在小程序内npm下载的包 vant组件库官网:快速上手 - Vant Weapp (youzan.github.io) 1)首先有有package.json文件,没有的话则先初始化 即使通过package.json去下载包,也需要有,可以观察下载的包. 2)下载包 3)构建npm包 下载包之后存储在node_modules内,但是我们…

ChatGPT原创指令大全(持续更新)

随着ChatGPT在互联网上的使用越来越多&#xff0c;但很多人在使用ChatGPT的过程中会觉得得到的答案并不是很精准。究其原因其实是你给它的命令不够准确、不够到位。实际现在网上已经很多关于ChatGPT的网站&#xff0c;可以快速生成带有快捷键的ChatGPT指令。但是对于不熟悉Chat…

Leetcode3161. 物块放置查询(Go语言的红黑树 + 线段树)

题目截图 题目分析 每次1操作将会分裂成两块区间长度&#xff0c;以最近右端点记录左侧区间的长度即可 因此涉及到单点更新和区间查询 然后左右侧最近端点则使用redBlackTree&#xff0c;也就是python中的sortedlist ac code type seg []int// 把 i 处的值改成 val func (t …

44、Flink 的 Interval Join 详解

Interval Join Interval join 组合元素的条件为&#xff1a;两个流&#xff08;暂时称为 A 和 B&#xff09;中 key 相同且 B 中元素的 timestamp 处于 A 中元素 timestamp 的一定范围内&#xff0c;即 b.timestamp ∈ [a.timestamp lowerBound; a.timestamp upperBound] 或…

HTML静态网页成品作业(HTML+CSS)——动漫熊出没介绍网页(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有3个页面。 二、作品演示 三、代…

美股重大变化,结算周期将从T+2变成T+1

KlipC报道&#xff1a;当地时间5月28日&#xff0c;美国证券交易结算时间将从“T2”改为“T1”。美股迎来历史性时刻。 目前&#xff0c;美股实行的是T0交易制度&#xff0c;T2结算交割制度。即投资者买入一只股票&#xff0c;当天可以卖出&#xff0c;但是交易的结算并不是立…

【国信华源:以专业服务,协助水利厅抵御强暴雨】

5月18日-19日&#xff0c;广西出现入汛以来最强暴雨天气过程&#xff0c;钦州、防城港、北海、南宁等地出现特大暴雨&#xff0c;多地打破降雨量极值。国信华源技术团队积极行动驻守一线&#xff0c;为打好山洪灾害防御的提前战、主动战提供了技术支撑。 5月17日18时&#xff0…

简单的利用有限脉冲响应(FIR)滤波器对心电信号进行降噪(Python)

代码很简单。 import numpy as np import matplotlib.pyplot as plt#------------------------Bandstop Filter Function------------------------ def bandstop(M,low,high,Fs):#50Hz removalk1 int( (low/Fs)*M) # index 22k2 int( (high/Fs)*M) # index 27#DC removalk0 …

移动应用程序设计详解:基本概念和原理

移动应用程序设计是什么&#xff1f; 一般来说&#xff0c;应用程序设计师的核心职责是让用户有体验应用的欲望&#xff0c;而开发者负责让它正常工作。移动应用程序设计包括用户界面 (UI) 和用户体验 (UX)。设计者负责应用程序的整体风格&#xff0c;包括配色方案、字体选择、…