<template>
<div class="loading-table" v-loading="tableLoading">
<el-table :data="tableData" border stripe>
<el-table-column type="index" label="序号" align="center" width="80">
<template slot-scope="scope">
<span>{{ scope.$index + (page.current - 1) * page.size + 1 }}</span>
</template>
</el-table-column>
<template v-for="(item, index) in tableOption">
<el-table-column
:key="index"
:prop="item.prop"
:label="item.label"
:align="item.align || 'center'"
:show-overflow-tooltip="item.overHidden || true"
width="200"
v-if="item.prop === 'monitoringTime'"
>
<!--monitoringTime较长显示不全,字段特殊处理-->
<template slot-scope="scope">
<span>{{ scope.row[scope.column.property] }}</span>
</template>
</el-table-column>
<el-table-column
:key="index"
:prop="item.prop"
:label="item.label"
:align="item.align || 'center'"
:show-overflow-tooltip="item.overHidden || true"
v-else
>
<template slot-scope="scope">
<span>{{ scope.row[scope.column.property] }}</span>
</template>
</el-table-column>
</template>
</el-table>
<!-- 分页 -->
<el-pagination
layout="total, prev, pager, next"
:total="page.total"
:page-size="page.size"
@current-change="pageChange"
>
</el-pagination>
</div>
</template>
<script>
export default {
name: 'TableComponents', //table组件
props: {
index: {
//序号
type: Boolean,
default: function() {
return true
},
},
tableLoading: {
//数据加载
type: Boolean,
default: function() {
return false
},
},
tableData: {
//表格数据
type: Array,
default: function() {
return []
},
},
tableOption: {
//表头
type: Array,
default: function() {
return []
},
},
page: {
//分页
type: Object,
default: function() {
return {
total: 0,
current: 1,
page: 10,
}
},
},
},
data() {
return {}
},
methods: {
//分页改变
pageChange(val) {
this.$emit('page-change', val)
},
},
}
</script>
<style scoped>
.loading-table {
width: 100%;
}
</style>
以上为组件代码
//父组件
<template>
<div class="loadingPageDetail" v-if="showDetail">
<div class="dialog-top">
<a :title="'关闭弹出层'" @click="close()"></a>
</div>
<div class="dialog-content">
<div class="title">
{{ title }}
</div>
<TableComponents
:tableLoading="tableLoading"
:tableData="tableData"
:page="page"
:tableOption.sync="tableOption"
@page-change="getList"
/>
</div>
</div>
</template>
<script>
import { getMeasurementData } from '@index/api/specialLayer'
import TableComponents from './TableComponents'
export default {
name: 'EquipmentDetailDialog', //设备详情弹窗
props: {
showDetail: {
type: Boolean,
default: false,
},
deviceId: {
type: String,
default: '',
},
title: {
type: String,
default: '',
},
},
components: {
TableComponents,
},
data() {
return {
tableLoading: false,
tableOption: [],
tableData: [],
page: {
total: 0,
current: 1,
size: 10,
},
}
},
watch: {
showDetail(v) {
if (v) {
this.page.current = 1
this.tableData = []
this.loadingData()
}
},
},
methods: {
loadingData() {
// 获取数据
let requestUrl = '/iot/getMeasurementData'
let params = {
deviceId: this.deviceId,
pageNo: this.page.current,
pageSize: this.page.size,
}
getMeasurementData({ url: requestUrl, params: params })
.then(res => {
if (res && res.status === 0) {
this.tableData = res.result[0].monitoringDataList
this.processData(res.result)
this.page.total = res.total
}
})
.catch(() => {})
},
//数据处理
processData(params) {
if (params) {
this.tableOption = [{ label: '监测时间', prop: 'monitoringTime' }]
this.tableData = []
params.forEach((v, index) => {
let obj = {}
v.monitoringDataList.forEach((m, index1) => {
if (index === 0) this.tableOption.push({ label: m.flagName, prop: `option${index1}` })
obj[`option${index1}`] = `${m.measurement}${m.unit}`
})
obj.monitoringTime = v.monitoringTime
this.tableData.push(obj)
})
} else {
return []
}
},
//分页改变,加载分页数据
getList(v) {
this.page.current = v
this.loadingData()
},
//关闭弹窗-清空数据
close() {
this.tableData = []
this.$emit('closeDetail', false)
},
},
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.loadingPageDetail {
min-width: 600px;
height: auto;
min-height: 200px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 9999;
background-color: #fff;
padding: 20px;
.dialog-top {
display: block;
height: 15px;
a {
width: 16px;
height: 16px;
background-image: url('../../../home/assets/close.png');
background-size: 100%;
position: absolute;
z-index: 9;
display: block;
top: 10px;
right: 10px;
}
}
.dialog-content {
height: auto;
margin-top: 10px;
.title {
height: 48px;
line-height: 48px;
padding-left: 10px;
border-top: 1px solid #ebeef5;
border-left: 1px solid #ebeef5;
border-right: 1px solid #ebeef5;
}
}
/deep/ .el-table td,
/deep/ .el-table th {
padding: 9px 0;
}
}
</style>
表头数据格式:
表格数据格式(表头prop需要和option一一对应):
页面效果: