vue 简单实用的elementUI表格封装

在写这个表格组件之前,要了解 slot 插槽的使用。

目录

1.子组件:子组件调用父组件的方法 this.$parent.方法名

2.父组件使用

2.1 父组件(普通表格):

2.2 父组件(表格中的某一项数据需要修改) 

2.3 父组件(带操作列的表格):

注意:


1.子组件:子组件调用父组件的方法 this.$parent.方法名

<template><div id="table"  class="bg pd20"><!-- 表格 --><el-table :data="tableData" border class="myTable" :header-cell-style="{background:'#D9FFF2'}" style="width:100%"><!-- 表格扩展 --><el-table-column type="expand" width="30"><template slot-scope="props"><el-form label-position="left" inline class="demo-table-expand clear"><template ><el-form-item v-for="(info, infoId) in tableInfo" :key="infoId" :label="info.value+':'"><span>{{props.row[info.key]}}:</span></el-form-item></template></el-form></template></el-table-column><!-- 表格内容 --><el-table-column type="index" :index="indexMethod" width="60" label="序号" align="center"/><template v-for="(info, infoIndex) in tableInfo"><el-table-column :key="infoIndex" :prop="info.key" :label="info.value" align="center" :min-width="info.minWidth" show-overflow-tooltip ><!-- <slot :name="info.key" :data="info" :index="infoIndex"></slot> --><!-- 给插槽命名、传值、序列号,使用插槽时记得传dealData --><template slot-scope="scope"><slot :name="info.key" :data="scope.row" :index="infoIndex" v-if="info.dealData"></slot><span v-else>{{scope.row[info.key]}}</span></template></el-table-column></template>       <!-- 是否需要操作列,默认不需要,需要时父组件设置operateShow,记得传操作这一列的宽度,否则默认宽为200 --><el-table-column v-if="operateShow" label="操作" align="center" :min-width="operateWidth" fixed="right"><template slot-scope="scope"><slot name="operate" :data="scope.row"></slot></template></el-table-column>    </el-table><!-- 分页 --><pagination :total="total" @pageChange="pageChange" :pageNum="page.pageNum"></pagination></div>
</template><script>
import pagination from '@/components/pagination';
export default {components: {pagination},props:{tableData: { //el-table组件绑定的数据type: Array,require: true},tableInfo: { //表格显示的字段和字段名称type: Array,require: true},total: { //页码总数type: Number,require: true,default: 0},operateShow: { //操作栏是否显示,默认不显示type: Boolean,default: false},operateWidth: { //操作栏宽type: String,default: "200"}},data() {return {page: { //表格字段pageNum: 1,pageSize: 10 }}},watch: {'total': function(newV, oldV){this.total = newV;},'$parent.searchForm.pageNum': function(newV, oldV){this.page.pageNum = newV;}},methods: {//表格自定义序号indexMethod(index) {return (this.page.pageNum-1)*this.page.pageSize +(index+1) ;},//分页pageChange(val) {this.page.pageNum = val; //给组件中的pageNum传值,自定义序号会用到this.$parent.initData(val); //调用父页面的initData方法},}
}
</script>

2.父组件使用

2.1 父组件(普通表格):

<template><div class="bg"><my-table :tableData="tableData" :tableInfo="tableInfo" :total="total"></my-table></div>
</template><script>
import myTable from '@/components/table';
export default {components: {myTable},data() {return {searchForm:{ //请求参数endTime:"2021-07-15",startTime:"2020-07-01",pageNum:1,pageSize:10},total: 0, //页码需要的参数tableData: [], //后台传过来的数据tableInfo: [{key: "firstLabelQr", value: "首QR", "minWidth": 180},{key: "lastLabelQr", value: "末QR", "minWidth": 180},{key: "skuId", value: "SKU_ID", "minWidth": 160},{key: "skuName", value: "产品名称", "minWidth": 160},{key: "totalNum", value: "标签总数", "minWidth": 90},{key: "realNum", value: "实贴标数", "minWidth": 90},{key: "voidNum", value: "废标数", "minWidth": 90},{key: "activeTime", value: "上传时间", "minWidth": 150}]}},methods: {initData(pageNum){ //参数用于table组件,父级页面使用该函数时不需要传参this.searchForm.pageNum = pageNum ? pageNum : 1; //这行语句必填。this.$axios.post(this.$api.listQrIntegral, this.searchForm).then( res =>{this.tableData = res.datas.records;this.total = res.datas.total;})}},created(){this.initData();}
}
</script>

 如果觉得 this.searchForm.pageNum = pageNum ? pageNum : 1; //这行语句必填。 这样写太难理解,也可以这样:

 methods: {initData(pageNum){ //参数用于table组件this.searchForm.pageNum = pageNum; //这行语句必填。原因是参数有可能是子组件中的分页传过来的参数this.$axios.post(this.$api.listQrIntegral, this.searchForm).then( res =>{this.tableData = res.datas.records;this.total = res.datas.total;})}},created(){this.initData(1); //在这里传参,初始默认pageNum为1}

2.2 父组件(表格中的某一项数据需要修改) 

注意:tableInfo 传参的时候,给要修改的那一项添加: dealData: true。


<div class="bg"><my-table :tableData="tableData" :tableInfo="tableInfo" :total="total"><tepmlate slot="activeTime" lot-scope="myProps"><span v-if="myProps.data.activeTime">{{myProps.data.activeTime}}</span><span v-else>2021-12-19</span></template></my-table>
</div>data() {return {searchForm:{ //请求参数endTime:"2021-07-15",startTime:"2020-07-01",pageNum:1,pageSize:10},total: 0, //页码需要的参数tableData: [], //后台传过来的数据tableInfo: [{key: "firstLabelQr", value: "首QR", "minWidth": 180},{key: "lastLabelQr", value: "末QR", "minWidth": 180},{key: "activeTime", value: "上传时间", "minWidth": 150, dealData: true}] //dealData: true,给要处理的某条数据添加这个属性和属性值。}},methods: {initData(pageNum){ //参数用于table组件,父级页面使用该函数时不需要传参this.searchForm.pageNum = pageNum;this.$axios.post(this.$api.listQrIntegral, this.searchForm).then( res =>{this.tableData = res.datas.records;this.total = res.datas.total;})}},created(){this.initData(1);}

2.3 父组件(带操作列的表格):

<div><!-- 如果有操作项,父组件设置operateShow,操作栏最小宽度:operateWidth(可不传) --><my-table :tableData="tableData" :tableInfo="tableInfo" :total="total" operateShow operateWidth="130"><template slot="operate" slot-scope="myProps"> <!-- 通过slot-scope来承载数据 --><el-button type="warning" size="mini" icon="el-icon-edit-outline" @click="delete(myProps.data.id)">下载</el-button></template></my-table>
</div>data(){return {searchForm: {  //请求参数endTime:"2021-07-15",startTime:"2020-07-01",pageNum: 1,pageSize: 10},total: 0, //页码需要的参数tableData: [], //后台传过来的数据tableInfo: [{key: "bill", value: "单号", "minWidth": 170},{key: "status", value: "生成状态", "minWidth": 170},{key: "downloadCount", value: "下载次数", "minWidth": 170}]}},methods: {delete(id){console.log(id);//删除数据的异步操作。常操作完会调用initData初始化数据,注意这里的传参【注1】this.initData( 1 ); //},initData(pageNum){ //参数用于table组件,父级页面使用该函数时不需要传参      this.searchForm.pageNum = pageNum ; //这行语句必填。this.$axios.post(this.$api.downloadIntegralCode, this.searchForm).then( res =>{this.tableData = res.datas.records;this.total = res.datas.total;})}},created(){this.initData(1);}

注意:

  1. 如果删除数据后,页码数直接跳转到1,那么初始化数据的方法 this.initData(1); 中直接传个1就可以了。
  2. 通常我们想要看到操作的那一页,所以这里 initData 传的参数要做一下处理。

 在公共的 js 文件中:

//返回表格操作时的页数。
/*** * @param {*} name 操作类型* @param {*} total 总数,页面中一般传固定的值this.total* @param {*} pageNum 页数,页面中一般传固定的值 this.search.pageNum* @param {*} pageSize 可省略,默认为10,若this.search.pageSize改变则需要传* @returns */
const pageNum = (name, total, pageNum, pageSize=10) =>{//添加与其他操作不一样,提前将页数设置为还未生成的页数,样式不会生效。//因为页码是在调用接口生成数据后,得到total值才显示;if(name=="add"){return pageNum;} else if(name=="update"){return Math.ceil( total/pageSize );} else if(name=="delete"){return Math.ceil( (total-1)/pageSize );}
}export { pageNum } 

使用:

import { pageNum } from "@/filters/common";delete(id){console.log(id);//删除数据的异步操作。常操作完会调用initData初始化数据,注意这里的传参【注1】this.initData( pageNum("delete", this.total) ); 
}

 注意:上面提到 添加的操作与其他操作不一样,所以对它的传参方式有几种:

//方法一:保证代码统一性,使用pageNum
import { pageNum } from "@/filters/common";
add(id){console.log(id);//添加数据的异步操作。常操作完会调用initData初始化数据,注意这里的传参this.initData( pageNum("add", this.total, this.searchForm.pageNum) ); 
}//方法二:便捷,直接传参
add(id){console.log(id);//添加数据的异步操作。常操作完会调用initData初始化数据,注意这里的传参this.initData( this.searchForm.pageNum ); 
}

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

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

相关文章

【学习】012 垃圾回收机制算法分析

垃圾回收机制概述 Java语言中一个显著的特点就是引入了垃圾回收机制&#xff0c;使c程序员最头疼的内存管理的问题迎刃而解&#xff0c;它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制&#xff0c;Java中的对象不再有“作用域”的概念&#xff0…

介绍JBoss BPM Suite安装程序

本周&#xff0c;我们想向您介绍JBoss BRMS和JBoss BPM Suite产品随附的一个鲜为人知的安装程序组件。 请注意&#xff0c;当前所有的演示项目都要求您下载JBoss BPM Suite可部署的eap zip产品文件和JBoss EAP 6.1.1 zip产品文件。 展望未来&#xff0c;我们将迁移所有项目&am…

自动装箱,拆箱和NoSuchMethodError

J2SE 5为Java编程语言引入了许多功能。 这些功能之一是自动装箱和拆箱 &#xff0c;这是我几乎每天都没有考虑过的功能。 它通常很方便&#xff08;尤其是与收藏夹一起使用时&#xff09;&#xff0c;但有时会导致一些令人讨厌的惊喜 &#xff0c;即“ 怪异 ”和“ 疯狂” 。 在…

vue 动态显示三级路由

无需 vuex、本地存储实现动态显示三级路由。 目录 一、需求描述&#xff1a; 二、代码 2.1 路由配置 1. 我的一级菜单和二级菜单的路由配置的&#xff1a; 2. 三级菜单的路由配置&#xff1a; 3. 上面有几个变量和要注意的细节&#xff1a; 2.2 封装导航栏 2.3 封装面…

第二章 Vue快速入门-- 18 v-for中key的使用注意事项

注意:如果属性和方法还没定义直接使用的话&#xff0c;就会报 xxx is not defined 导致界面不能正常显示。我看视频教程里老师的可以直接使用&#xff0c;而且界面正常显示&#xff0c;可能是vue版本不同吗&#xff1f;还不清楚 1 <!DOCTYPE html>2 <html lang"…

vue 后端返回二进制流文件,前端如何实现下载?

目录 1. axios 请求二进制流文件导出文件 1.1 后台返回的二进制流&#xff1a; 1.2 使用&#xff1a; 1.3 需要注意以下几点&#xff1a; 2. 关于 arraybuffer 和 blob 2.1 ArrayBuffer 和 blob 2.2 区别 2.3 相互转换 3. 主要参考&#xff1a; 1. axios 请求二进制…

python量化之路:获取历史某一时刻沪深上市公司股票代码及上市时间

python量化之路&#xff1a;获取历史某一时刻沪深上市公司股票代码及上市时间 最近开始玩股票量化&#xff0c;由于想要做完整的股票回测&#xff0c;因此股票的上市和退市信息就必不可少。因为我们回测的时候必须要知道某一日期沪深股票的成分包含哪些对吧。所以我们要把沪深全…

《网页设计创意书》读后感

刚刚收到《网页设计创意书》&#xff0c;确实有点惊喜&#xff0c;开始以为是像之前审读的书一样是一叠叠的打印纸&#xff0c;没想到是一本成品书&#xff0c;拿到手上沉甸甸的&#xff0c;随便翻看了一下&#xff0c;没想到里面竟然还是全彩页印刷的&#xff0c;本书的第一感…

游戏AI –行为树简介

游戏AI是一个非常广泛的主题&#xff0c;尽管有很多资料&#xff0c;但我找不到能以较慢&#xff0c;更容易理解的速度缓慢介绍这些概念的东西。 本文将尝试解释如何基于行为树的概念来设计一个非常简单但可扩展的AI系统。 什么是AI&#xff1f; 人工智能是参与游戏的实体表现…

liteos错误处理(十一)

1. 概述 1.1 基本概念 错误处理指用户代码发生错误时&#xff0c;系统调用错误处理模块的接口函数&#xff0c;完成上报错误信息&#xff0c;并调用用户自己的钩子函数&#xff0c;进行特定的处理。 错误处理模块实现OS内部错误码记录功能。OS内部错误码无法通过接口返回&#…

js 变量提升与函数提升

规则&#xff1a; 函数的提升优先于变量提升。同名的函数会覆盖同名的函数与变量。同名的变量不会覆盖同名的函数。 示例代码1&#xff1a; <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta name"vi…

mockJs文档(一)

Mock.js 官网 目录 1. 开始安装 1.1 Node&#xff08;CommonJS&#xff09; 1.2 CMD方式 2. 语法规范 2.1 数据模板定义规范 DTD 2.1.1. 属性值是字符串 String 2.1.2. 属性值是数字 Number 2.1.3. 属性值是布尔型 Boolean 2.1.4. 属性值是对象 Object 2.1.5. 属性值…

小程序 获取手机号

【参考小程序开发文档&#xff1a;开发-指南-开放能力-用户信息-获取手机号】 地理位置 wx.getLocation(Object object) | 微信开放文档 手机号 获取手机号 | 微信开放文档 微信信息 小程序与小游戏获取用户信息接口调整&#xff0c;请开发者注意升级。 | 微信开放社区 目录…

CSS布局之脱离文档流详解——浮动、绝对定位脱离文档流的区别

1、代码 &#xff08;1&#xff09;示例代码1 <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><meta http-e…

小程序 获取当前城市位置-高德地图

微信小程序 wx.getLocation 只能获取到经纬度&#xff0c;想要获取具体城市信息&#xff0c;需要使用地图插件。公司要求使用 高德地图&#xff0c;在使用上&#xff0c;几个地图的代码步骤都差不多。 目录 1. 查看官方文档 1.1 申请高德地图Key&#xff0c;点击查看申请key…

网页端调用企业微信扫一扫 详细过程

效果展示&#xff08;需要使用微信内置浏览器打开&#xff09;&#xff1a; 目录 1. 快速集成H5开发应用 1.1 开始 1.2 创建应用 1.2.1 登录管理后台 1.2.2 添加自建应用 1.2.3 配置应用 1.2.4 获取应用的 AgentID 与 Secret 1.3 配置应用 1.3.1 配置应用主页 1.3.2 配置…

获取ip地址

代码 ///<summary>///取得客户端真实IP。如果有代理则取第一个非内网地址 ///</summary>publicstringIPAddress { get{ stringresult String.Empty; result HttpContext.Current.Request.ServerVariables["HTTP_X_FORWAR…

微信小程序 监听位置信息

wx.onLocationChange(function callback) | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/api/location/wx.onLocationChange.html 小程序 获取当前城市位置-高德地图_Start2019-CSDN博客小程序获取位置信息&#xff0c;包括省市区、用户…

通过构建Cocoapods私有库进行组件化开发探索

专题一 一、创建私有索引库 选Github或者码云都可以&#xff0c;本例以Github为例。创建私有索引库用来作为自己组件库的索引&#xff1a; 二、本地添加私有索引库 添加&#xff1a;pod repo add 索引库名称 索引库地址 例&#xff1a;pod repo add ZYHModule https://github.c…

layui 父页面弹框中获取子页面的内容

layer弹层组件开发文档 - Layuihttps://www.layui.site/doc/modules/layer.html#layer.getChildFrame 需求及代码分析 如上图&#xff0c;原来是点击一个按钮跳转到子页面&#xff0c;现在想改为&#xff1a;点击按钮&#xff0c;在当前页打开。因为不想要重写子页面的样式及内…