vue+element-ui 使用插槽对table表格组件+分页器的二次封装,拿过去可直接使用

1、先封装表格

说明:this.$parent  为调用父组件的方法,

<template>
	<div id="tables">
		<!-- table 表格 -->
		<el-table id="ou" size="mini" :cell-style="{textAlign:'center'}"
			:header-cell-style="{background:'#f2f2f2',color:'#666666',textAlign: 'center'}" :border="true"
			:data="data.tableList" @selection-change="handleSelectionChange" ref="multipleTable" style="width: 100%">
			<el-table-column v-if="isSelection" type="selection" width="55"></el-table-column>
			<template v-for="item in data.tableHeader">
				<el-table-column sortable :key="item.name" :prop="item.prop" :label="item.label" :min-width="item.width"
					v-if="item.type==='slot'">
					<!-- 作用域 -->
					<template slot-scope="{ row }">
						<slot :name="item.slotName" :data="row"></slot>
					</template>
				</el-table-column>
				<el-table-column sortable :key="item.name" :prop="item.prop" :label="item.label" :min-width="item.width"
					v-else>
				</el-table-column>
			</template>
		</el-table>
		<!-- table end -->
		<!-- 分页器 -->
		<div class="pagination" v-if="isShowPage">
			<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
				:current-page="currentPage4" :page-sizes="pageSize" :page-size="size"
				layout="total, sizes, prev, pager, next, jumper" :total="total">
			</el-pagination>
		</div>
	</div>
</template>

<script>
	export default {
		//data表格的数据(对象) total分页器总页数   isShowPage是否显示分页器  isSelection是否显示表格首列勾选框
		props: ['data', "total", 'isShowPage','isSelection'],
		data() {
			return {
				multipleSelection: '',
				currentPage4: 1, //当前页数
				pageSize: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100], //可选页数
				size: 10, //每页大小
			}
		},
		methods: {
			//每页条数
			handleSizeChange(val) {
				console.log(`每页 ${val} 条`);
				this.$parent.setSize(val)
			},
			//当前页数/页数切换
			handleCurrentChange(val) {
				console.log(`当前页: ${val}`);
				this.$parent.setPage(val)
			},
			//选择项
			handleSelectionChange(val) {
				this.multipleSelection = val;
				this.$parent.delXuan(val);
				console.log(val)
			}
		},
		mounted() {

		}
	}
</script>

<style scoped lang="less">
	#tables {
		.pagination {
			width: 100%;
			height: 40px;
			display: flex;
			align-items: center;
			border: #e6e6e6 1px solid;
			border-top: none;
		}
		/**
		改变边框颜色
		 */
		/deep/.el-table--border,
		.el-table--group {
			border: 1px solid #e6e6e6;
			border-bottom: none;
		}
		/**
		改变表格内竖线颜色
		 */
		/deep/.el-table--border td,
		.el-table--border th,
		.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed {
			border-right: 1px solid #e6e6e6;
		}
		/**
		改变表格内行线颜色
		 */
		/deep/.el-table td,
		.el-table th.is-leaf {
			border-bottom: 1px solid #e6e6e6;
		}
		/deep/.el-table thead tr th {
			border-color: #e6e6e6;
		}
	}
</style>

2、父组件中配置使用

先看成品图:

使用:

<template>
	<div id="PersonnelOnDuty">
		<!-- 封装好的表格组件 -->
		<!-- tableData表格数据 total数据总数量 isShowPage分页器是否显示 isSelection表格勾选框是否显示 -->
		<Tables :data="tableData" :total="total" :isShowPage="true" :isSelection="true">
			<!-- #operation 插槽对应的名称(列配置项声明的插槽名称) data插槽返回的行数据  -->
			<template #operation='{data}'>
				<el-button size="mini" icon="el-icon-edit" @click="addTable(data)" type="success">编辑</el-button>
			</template>
		</Tables>
	</div>
</template>

<script>
	import Tables from "../../components/tables.vue"
	import {
		
	} from "@/api";
	export default {
		name: "",
		components: {
			Tables,
		},
		data() {
			return {
				total: 0, //数据总数量
				size: 10,
				page: 1,
				tableData: { //表格数据/参数
					select: true,
					tableHeader: [{ //表格头及对应列配置
							label: "专家姓名",
							prop: "equipmentName", //此列绑定的数据字段(索引)
							// type: "slot", //类型插槽
							width: 120,
							// slotName: 'equipmentName' //插槽名称
						},
						{
							label: "专家类别",
							prop: "equipmentType",
							width: 120,
							// type: "slot",
							// slotName: "equipmentType"
						},
						{
							label: "职称",
							prop: "charge",
							width: 120,
							// type: "slot",
							// slotName: "charge"
						},
						{
							label: "联系方式",
							width: 120,
							prop: "phone",
						},
						{
							label: "操作",
							width: 120, //列宽度
							type: "slot", //列类型  slot插槽
							slotName: 'operation' //插槽名称(html表格组件内声明此插槽)
						}
					],
					tableList: [ //表格数据
						{
							equipmentName:'杨杨杨', 
							equipmentType:'化学专家',
							charge:'公共卫生',
							phone:'联系方式'
						}
					],
				},
			}
		},
		mounted() {
		},
		methods: {
			// 编辑
			addTable(row){
				console.log(row) //编辑行数据
			},
			//表格勾选框勾选选择项触发
			delXuan(e) {
				console.log(e)
			},
			//表格每页数量改变触发
			setSize(size) {
				console.log(size)
			},
			//表格当前页数改变触发
			setPage(page) {
				console.log(page)
			}
		}
	}
</script>

<style scoped lang="less">
	
</style>

以上代码我都做了详细备注,所以具体过程就不说了(主要是记录下方便以后自己使用),有需要可直接拿去使用。

猜你喜欢

转载自blog.csdn.net/weixin_46408500/article/details/126048304