vue实现elementui的table和datepicker的操作
组件对象说明
一个组件分别有自己的 属性 Attributes 事件Events 方法Methods
调用属性和调用事件的形式是不一样的 属性是用 :props 事件是用 @event 所以在使用之前一定要弄清楚给组件添加的是属性还是添加事件

<!-- 表格组件 --> <el-table :data="data" :height="height" :span-method="spanMethod" ref="table" @selection-change="handleSelectionChange" @sort-change="handleSortChange" v-loading="loading"> :span-method 表示接收属性 spanMethod是从子表格组件中传递过来的属性名称 @selection-change 表示接收事件 <script> export default { data() { return { // 表格高度 tableHeight: 0 } }, props: { // 表格数据 data: { type: Array, default() { return []; } }, // 表格列配置 columnConfig: { type: Array, default() { return []; } }, // 表格高度 height: { type: [String, Number], default() { return 400; } }, //表格是否显示折叠信息 expand: { type: Boolean, default() { return false; } }, // 分页参数-当前页 pageIndex: { type: Number, default() { return 1; } }, // 分页参数-每页条数 pageSize: { type: Number, default() { return 10; } }, // 分页参数-每页条数候选项 pageSizes: { type: Array, default() { return [10, 20, 50, 100]; } }, // 分页参数-总条数 total: { type: Number, default() { return 0; } }, // 是否显示loading loading: { type: Boolean, default() { return false; } }, spanMethod:{ type:Function, default(){ return()=>{}; } } }, methods: { /** * 处理行选中状态变化 * @param data */ handleSelectionChange(data) { this.$emit('selection-change', data); }, /** * 处理排序条件变化 * @param data */ handleSortChange(data) { this.$emit('sort-change', data); } }

<div style="margin-top:10px"> <bee-table :data="interfaceList" border :spanMethod="objectSpanMethod" :pageIndex="currentPage" :pageSize="pageSize" :column-config="Ins2_TABLE_COLUMN" @size-change="handleSizeChange" @current-change="handleCurrentChange" :total="total" v-loading="tbflag"> </bee-table> data(){ return { startTtime:"", endTime:"", pickerOptions:utils.setTimeOPtions(), value2:'', value:'', total: 0, //总记录数 currentPage:1, //初始页 pageSize:10, // 每页的数据 tbflag:false, Ins2_TABLE_COLUMN, interfaceList:[], spanMethod:"" }; } methods:{ objectSpanMethod({ row, column, rowIndex, columnIndex }) { if (columnIndex === 0) { console.log("eeeeee"); if (rowIndex % 2 === 0) { return { rowspan: 2, colspan: 1 }; } else { return { rowspan: 0, colspan: 0 }; } } }
具体效果
注意es6对属性类型的强制性检查 如果声明属性的类型和返回的类型不匹配 会造成一些异常

props: {
// 表格数据
data: {
type: Array,
default() {
return [];
}
},
// 表格列配置
columnConfig: {
type: Array,
default() {
return [];
}
},
// 表格高度
height: {
type: [String, Number],
default() {
return 400;
}
},
//表格是否显示折叠信息
expand: {
type: Boolean,
default() {
return false;
}
},
// 分页参数-当前页
pageIndex: {
type: Number,
default() {
return 1;
}
},
// 分页参数-每页条数
pageSize: {
type: Number,
default() {
return 10;
}
},
// 分页参数-每页条数候选项
pageSizes: {
type: Array,
default() {
return [10, 20, 50, 100];
}
},
// 分页参数-总条数
total: {
type: Number,
default() {
return 0;
}
},
// 是否显示loading
loading: {
type: Boolean,
default() {
return false;
}
},
spanMethod: {
type: [Function],
default() {
//函数类型的属性就一定要返回一个函数
return ()=>{};
}
}
}
示例效果代码

<bee-table :data="interfaceList" :spanMethod="objectSpanMethod" :border=true :pageIndex="currentPage" :pageSize="pageSize" :column-config="Ins2_TABLE_COLUMN" @size-change="handleSizeChange" @current-change="handleCurrentChange" :total="total" v-loading="tbflag"> </bee-table> methods:{ objectSpanMethod({ row, column, rowIndex, columnIndex }){ const span = column['property'] + '-span' if(row[span]){ return row[span] } }, mergeTableRow(data, merge) { if (!merge || merge.length === 0) { return data } merge.forEach((m) => { const mList = {} data = data.map((v, index) => { const rowVal = v[m] if (mList[rowVal]) { mList[rowVal]++ data[index - (mList[rowVal] - 1)][m + '-span'].rowspan++ v[m + '-span'] = { rowspan: 0, colspan: 0 } } else { mList[rowVal] = 1 v[m + '-span'] = { rowspan: 1, colspan: 1 } } return v }) }) return data }, getinferfaceCall() { this.tbflag=true; return this.$http.getInterfaceCall( { "pageIndex":this.currentPage, "pageSize":this.pageSize, "startTime":this.startTtime, "endTime":this.endTime },{notify:true}) .then((data) => { this.interfaceList=data.list; this.total=data.total; }).finally(() =>{ this.tbflag=false; this.interfaceList = this.mergeTableRow(this.interfaceList, ['businessname', 'appname']); }); } }

<el-table :data="data" :height="height" :span-method="spanMethod" :border="border" ref="table" @selection-change="handleSelectionChange" @sort-change="handleSortChange" v-loading="loading"> props: { spanMethod: { type: [Function], default() { return ()=>{}; } }, border: { type: Boolean, default() { return false; } } }
vue实现表格不同的分页样式功能

<!-- 分页组件 --> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="pageIndex" :page-sizes="pageSizes" :page-size="pageSize" :layout="paginationlayout" :total="total"/> <script> export default { data() { return { // 表格高度 tableHeight: 0 } }, props: { // 表格数据 data: { type: Array, default() { return []; } }, //设置分页样式的默认值 paginationlayout:{ type: [String, Number], default() { return "total, sizes, prev, pager, next, jumper"; } } }

<bee-table :data="tbList" :column-config="LOG_TABLE_COLUMN" :pageIndex="currentPage" :pageSize="pageSize" v-loading="tbflag" //指定自己的分页样式 不使用默认样式 :paginationlayout="pglayout" @size-change="handleSizeChange" @current-change="handleCurrentChange" :total="total"> </bee-table> data() { return { total: 0, //总记录数 currentPage:1, //初始页 pageSize:10, // 每页的数据 pickerOptions:utils.setTimeOPtions(), value1: [new Date(2010, 10, 10, 10, 10), new Date(2010, 10, 11, 10, 10)], value2: '', highinput:"", startTime:"", endTime:"", tbList:[], tbflag:false, LOG_TABLE_COLUMN, dHeight:"200px", svalue:true, pickerOptions:utils.setTimeOPtions(), pglayout:"total, sizes, prev, next, jumper" } }
Elementui日期控制选择范围

<el-date-picker v-model="value2" type="datetimerange" :picker-options="pickerOptions" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" align="right"> </el-date-picker> this.value2 = this.setDefaultTime(); this.startTime=this.value2[0]; this.endTime=this.value2[1]; data() { return { total: 0, //总记录数 currentPage:1, //初始页 pageSize:10, // 每页的数据 pickerOptions:utils.setTimeOPtions(), value2: '', highinput:"*", startTime:"", endTime:"", tbList:[], tbflag:false, LOG_TABLE_COLUMN, dHeight:"200px", svalue:true, pglayout:"total,sizes,prev,next" } methods: { setDefaultTime() { const end = new Date(); const start = new Date(); start.setTime(start.getTime() - 3600 * 250); return [start,end]; }

setTimeOPtions() { let _minTime=null; let _maxTime=null; return { onPick(time){ // 如果选择了只选择了一个时间 if (!time.maxDate) { let curTime = (new Date()).getTime(); let timeRange = 6*24*60*60*1000; // 6天 _minTime = time.minDate.getTime() - timeRange; // 最小时间 _maxTime = time.minDate.getTime() + timeRange; // 最大时间 if (_maxTime > curTime){ _maxTime = curTime; } // 如果选了两个时间,那就清空本次范围判断数据,以备重选 } else { _minTime = _maxTime = null } }, disabledDate(time) { // onPick后触发 let curTime = (new Date()).getTime(); if(_minTime && _maxTime){ return time.getTime() < _minTime || time.getTime() > _maxTime } else { //不能选择大于今天的日期 return time.getTime()>curTime; } }, shortcuts: [ { text: '最近15分钟', onClick(picker) { const end = new Date(); const start = new Date(); start.setTime(start.getTime() - 3600 * 250); picker.$emit('pick', [start, end]); } }, { text: '最近30分钟', onClick(picker) { const end = new Date(); const start = new Date(); start.setTime(start.getTime() - 3600 * 500); picker.$emit('pick', [start, end]); } }, { text: '最近1小时', onClick(picker) { const end = new Date(); const start = new Date(); start.setTime(start.getTime() - 3600 * 1000); picker.$emit('pick', [start, end]); } }, { text: '最近12小时', onClick(picker) { const end = new Date(); const start = new Date(); start.setTime(start.getTime() - 3600 * 1000 *12); picker.$emit('pick', [start, end]); } }] }; }
elementUI实现表格和合并
实现效果
按照业务类型和应用名称进行去重合并单元格
这个功能对后台返回的数据列表格式是有要求的 必须按照需要被分组的列进行排序(可以是升序也可以是降序)
属于同一个业务类型或者应用名称的记录必须排列在一起
如果返回的数据不是有序的 那么页面的显示会如下
后台返回的数据列表businessname的值是由暂无业务代码和业务代码1随机排列的 导致页面表格按照业务代码合并行列时出现异常
解决办法 在后台查询好数据后按照业务代码先进行排序 然后再返回给前端

userChoiceTime_start = self.formartStartTime(startTime) userChoiceTime_end = self.formartEndTime(endTime) index_list_pattern=self.getindexes(startTime,endTime) pageIndex = int(pageIndex) pageSize = int(pageSize) if sortColumn=="": sortColumn = "businessname" reverse=False floatflag=False if sortType == "desc": reverse=True if sortColumn in ["avgtime","requestCount","errRequest","maxtime","mintime"]: floatflag=True if floatflag: ilist = sorted(ilist,key=lambda e:float(e.__getitem__(sortColumn)),reverse=reverse) else: ilist = sorted(ilist, key=lambda e:e.__getitem__(sortColumn), reverse=reverse) if querytype != "excel": reslist=ilist[(pageIndex-1)*pageSize:pageIndex*pageSize] data = {'code': 'SUCCESS', 'message': '', 'data': {"total":len(ilist),"list":reslist}} return data else: data = {'code': 'SUCCESS', 'message': '', 'data': {"total": len(ilist), "list": ilist}} return data

[{'appname': 'wszx-web', 'avgtime': '36.75', 'errRequest': 0, 'maxtime': '53.00', 'interface': '111111', 'mintime': '23.00', 'requestCount': 4, 'businessname': '业务代码1'}, {'appname': 'wszx-web', 'avgtime': '21.00', 'errRequest': 0, 'maxtime': '22.00', 'interface': '111111', 'mintime': '20.00', 'requestCount': 2, 'businessname': '业务代码1'}, {'appname': 'wszx-web', 'avgtime': '1517.00', 'errRequest': 0, 'maxtime': '2110.00', 'interface': '111111', 'mintime': '924.00', 'requestCount': 2, 'businessname': '业务代码1'}, {'appname': 'wszx-web', 'avgtime': '68.00', 'errRequest': 0, 'maxtime': '113.00', 'interface': '1111111', 'mintime': '23.00', 'requestCount': 2, 'businessname': '业务代码1'}, {'appname': 'wszx-web', 'avgtime': '119.50', 'errRequest': 0, 'maxtime': '165.00', 'interface': '11111', 'mintime': '74.00', 'requestCount': 2, 'businessname': '业务代码1'}, {'appname': 'wszx-web', 'avgtime': '21.00', 'errRequest': 0, 'maxtime': '21.00', 'interface': '111111', 'mintime': '21.00', 'requestCount': 1, 'businessname': '业务代码1'}, {'appname': 'wszx-web', 'avgtime': '111.00', 'errRequest': 0, 'maxtime': '111.00', 'interface': '11111111', 'mintime': '111.00', 'requestCount': 1, 'businessname': '业务代码1'}, {'appname': 'hgzx-web', 'avgtime': '84.75', 'errRequest': 0, 'maxtime': '370.00', 'interface': '1111111', 'mintime': '32.00', 'requestCount': 8, 'businessname': '业务代码2'}, {'appname': 'hgzx-web', 'avgtime': '3173.17', 'errRequest': 0, 'maxtime': '6480.00', 'interface': '111111', 'mintime': '102.00', 'requestCount': 6, 'businessname': '业务代码2'}, {'appname': 'hgzx-web', 'avgtime': '63.50', 'errRequest': 0, 'maxtime': '87.00', 'interface': '11111111', 'mintime': '40.00', 'requestCount': 2, 'businessname': '业务代码2'}, {'appname': 'hgzx-web', 'avgtime': '183.00', 'errRequest': 0, 'maxtime': '183.00', 'interface': '111111111', 'mintime': '183.00', 'requestCount': 1, 'businessname': '业务代码2'}]

<template> <div class="topology-container"> <bee-breadcrumb/> <div id="applicationdiv" style="margin-left:30px"> <el-date-picker v-model="value2" type="datetimerange" :picker-options="pickerOptions" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" align="right"> </el-date-picker> <el-button type="primary" @click="handleQuery">查询</el-button> <div style="margin-top:10px"> <bee-table :data="interfaceList" :spanMethod="objectSpanMethod" :border=true :pageIndex="currentPage" :pageSize="pageSize" :column-config="Ins2_TABLE_COLUMN" @size-change="handleSizeChange" @current-change="handleCurrentChange" :total="total" v-loading="tbflag"> </bee-table> </div> </div> </div> </template> <script> import BeeBreadcrumb from '@/common/component/BeeBreadcrumb' import utils from '@/common/utils' import BeeTable from '@/common/component/BeeTable' import { Ins2_TABLE_COLUMN } from './constants' export default { components: { BeeBreadcrumb, BeeTable }, data(){ return { startTtime:"", endTime:"", pickerOptions:utils.setTimeOPtions(), value2:'', value:'', total: 0, //总记录数 currentPage:1, //初始页 pageSize:10, // 每页的数据 tbflag:false, Ins2_TABLE_COLUMN, interfaceList:[], spanMethod:"", needMergeArr: ['businessname', 'appname'], rowMergeArrs: {}, }; }, mounted() { this.breadcrumbList = [ { path: '', text: '分类统计详情' } ]; this.value2 = this.setDefaultTime(); this.startTtime=this.value2[0]; this.endTime=this.value2[1]; this.getinferfaceCall(); }, methods:{ objectSpanMethod({ row, column, rowIndex, columnIndex }){ const span = column['property'] + '-span' if(row[span]){ return row[span] } }, mergeTableRow(data, merge) { if (!merge || merge.length === 0) { return data } merge.forEach((m) => { const mList = {} data = data.map((v, index) => { const rowVal = v[m] if (mList[rowVal]) { mList[rowVal]++ data[index - (mList[rowVal] - 1)][m + '-span'].rowspan++ v[m + '-span'] = { rowspan: 0, colspan: 0 } } else { mList[rowVal] = 1 v[m + '-span'] = { rowspan: 1, colspan: 1 } } return v }) }) return data }, handleQuery() { this.startTtime=this.value2[0]; this.endTime=this.value2[1]; if(!this.startTtime || !this.endTime) { this.$message({ showClose: true, message: '查询日期不能为空!', type: 'warning' }); return; } this.getinferfaceCall(); }, setDefaultTime() { const end = new Date(); const start = new Date(); start.setTime(start.getTime() - 3600 * 250); return [start,end]; }, handleCurrentChange(pageIndex) { this.currentPage=pageIndex; this.getinferfaceCall(); }, handleSizeChange(pageSize) { this.currentPage = 1; this.pageSize= pageSize; this.getinferfaceCall(); }, getinferfaceCall() { this.tbflag=true; return this.$http.getInterfaceCall( { "pageIndex":this.currentPage, "pageSize":this.pageSize, "startTime":this.startTtime, "endTime":this.endTime },{notify:true}) .then((data) => { this.interfaceList=data.list; this.total=data.total; }).finally(() =>{ this.tbflag=false; this.interfaceList = this.mergeTableRow(this.interfaceList, ['businessname', 'appname']); }); } } } </script> <style lang="scss" scoped> .chart_example{ margin-left:5px; width: 49%; height: 300px; border: 1px solid #C0C4CC; float:left; } .chart_example2{ margin-left:5px; width: 330px; height: 270px; border: 1px solid #C0C4CC; float:left; } .chart_left { float:left; width:33%; height:100%; background-color:#f4f6f9; margin-left:3px; } .chart_right { margin-left:10px; float:left; width:65%; } </style>
本文来自博客园,作者:不懂123,转载请注明原文链接:https://www.cnblogs.com/yxh168/articles/11512264.html