|
@@ -0,0 +1,226 @@
|
|
|
+<template>
|
|
|
+ <table class="com-table">
|
|
|
+ <thead>
|
|
|
+ <tr>
|
|
|
+ <th v-for="(col, index) of data.column" :key="index" :class="{ light: col.is_light }" :style="{ width: col.width }" @click="onSort(col)">
|
|
|
+ {{ col.name }}
|
|
|
+ </th>
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <el-scrollbar>
|
|
|
+ <tbody :style="{ height: height }">
|
|
|
+ <tr v-for="(row, index) of tableData" :key="index">
|
|
|
+ <td
|
|
|
+ v-for="(col, i) of data.column"
|
|
|
+ :key="i"
|
|
|
+ :style="{ width: col.width }"
|
|
|
+ :class="{ light: hoverRow == row || hoverCol == col, num: col.is_num, 'always-light': col.is_light || row.is_light }"
|
|
|
+ @mouseenter="hover(row, col)"
|
|
|
+ @mouseleave="leave()"
|
|
|
+ >
|
|
|
+ <component :is="col.type ? col.type : 'span'" v-bind="col.props" v-html="template(col, row[col.field])" @click="onClick(col, row)"> </component>
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </el-scrollbar>
|
|
|
+ <el-pagination class="mg-t-8" v-if="pageable" @current-change="handleCurrentChange" :current-page="currentPage" :page-size="pageSize" :total="data.total" v-bind="elPaggingProps"> </el-pagination>
|
|
|
+ </table>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+export default {
|
|
|
+ // 名称
|
|
|
+ name: "ComTable",
|
|
|
+ // 使用组件
|
|
|
+ components: {},
|
|
|
+ // 传入参数
|
|
|
+ props: {
|
|
|
+ /**
|
|
|
+ * {
|
|
|
+ column: [{
|
|
|
+ name: "风机名称",
|
|
|
+ field: "name",
|
|
|
+ type:'div',
|
|
|
+ width:'', // 宽度
|
|
|
+ is_num: false, // 是否为数字
|
|
|
+ is_light: false, // 是否高亮
|
|
|
+ template:function(){ }
|
|
|
+ click:function(){} //点击事件
|
|
|
+ sortable:fasle // 排序
|
|
|
+ // 新增用于在表格中使用动态三方组件
|
|
|
+ type:'el-tag', // * 新增 用于传入三方组件名称 实现三方组件引入 component :is 方式实现
|
|
|
+ props:{}, // * 新增 用户传入三方组件的 props 与type同时使用
|
|
|
+ },{
|
|
|
+ name: "冷却风温度",
|
|
|
+ field: "lqf",
|
|
|
+ is_num: true,
|
|
|
+ is_light: false
|
|
|
+ }],
|
|
|
+ data: [{
|
|
|
+ name: "1E01",
|
|
|
+ lqf: 15.78,
|
|
|
+ is_light: false
|
|
|
+ }],
|
|
|
+ total:200
|
|
|
+ }
|
|
|
+ */
|
|
|
+ data: Object,
|
|
|
+ // hover 样式
|
|
|
+ showHover: {
|
|
|
+ type: Boolean,
|
|
|
+ default: true,
|
|
|
+ },
|
|
|
+ // 列高亮
|
|
|
+ showColHover: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ canScroll: {
|
|
|
+ type: Boolean,
|
|
|
+ default: true,
|
|
|
+ },
|
|
|
+ pageSize: {
|
|
|
+ type: Number,
|
|
|
+ default: 0,
|
|
|
+ },
|
|
|
+ height: {
|
|
|
+ type: String,
|
|
|
+ default: "",
|
|
|
+ },
|
|
|
+ // 新增 支持 pagging 组件
|
|
|
+ // elPaggingProps: {
|
|
|
+ // type: Object,
|
|
|
+ // default: () => {
|
|
|
+ // return {
|
|
|
+ // layout: "total, sizes, prev, pager, next, jumper",
|
|
|
+ // // "page-sizes": [100, 200, 300, 400],
|
|
|
+ // };
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+ },
|
|
|
+ // 自定义事件
|
|
|
+ emits: {
|
|
|
+ // 分页事件
|
|
|
+ // onPagging: null,
|
|
|
+ },
|
|
|
+ // 数据
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ hoverRow: -1,
|
|
|
+ hoverCol: -1,
|
|
|
+ sortCol: "",
|
|
|
+ sortType: "",
|
|
|
+ currentPage: 1,
|
|
|
+ };
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ tableData() {
|
|
|
+ let that = this;
|
|
|
+ if (this.sortCol == "") {
|
|
|
+ return this.data.data;
|
|
|
+ } else {
|
|
|
+ let data = this.data.data;
|
|
|
+
|
|
|
+ data.sort((a, b) => {
|
|
|
+ let rev = 1;
|
|
|
+ if (that.sortType == "ASC") rev = 1;
|
|
|
+ else if (that.sortType == "DESC") rev = -1;
|
|
|
+
|
|
|
+ if (a[that.sortCol] > b[that.sortCol]) return rev * 1;
|
|
|
+ if (a[that.sortCol] < b[that.sortCol]) return rev * -1;
|
|
|
+ return 0;
|
|
|
+ });
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ pageable() {
|
|
|
+ return this.pageSize != 0;
|
|
|
+ },
|
|
|
+ pages() {
|
|
|
+ if (this.pageable) return parseInt(this.data.total / this.pageSize) + 1;
|
|
|
+ else return 0;
|
|
|
+ },
|
|
|
+ startRow() {
|
|
|
+ if (this.pageable) return (this.currentPage - 1) * this.pageSize;
|
|
|
+ else return 0;
|
|
|
+ },
|
|
|
+ endRow() {
|
|
|
+ if (this.pageable) return this.currentPage * this.pageSize;
|
|
|
+ else return this.data.data.length;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ // 函数
|
|
|
+ methods: {
|
|
|
+ clearCheckBox(time){
|
|
|
+ this.$nextTick(()=>{
|
|
|
+ setTimeout(()=>{
|
|
|
+ const domArray = document.querySelectorAll(".curCheckBox");
|
|
|
+ for(let i=0;i<domArray.length;i++){
|
|
|
+ domArray[i].checked=false;
|
|
|
+ }
|
|
|
+ },(time || 300));
|
|
|
+ });
|
|
|
+ },
|
|
|
+ onClick(col, data) {
|
|
|
+ if (col.click) col.click(event, data);
|
|
|
+ },
|
|
|
+ onSort(col) {
|
|
|
+ if (col.sortable == true) {
|
|
|
+ this.sortCol = col.field;
|
|
|
+ switch (this.sortType) {
|
|
|
+ case "":
|
|
|
+ this.sortType = "DESC";
|
|
|
+ break;
|
|
|
+ case "DESC":
|
|
|
+ this.sortType = "ASC";
|
|
|
+ break;
|
|
|
+ case "ASC":
|
|
|
+ this.sortType = "";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ template(col, data) {
|
|
|
+ if (!col.template) return data;
|
|
|
+ else return col.template(data);
|
|
|
+ },
|
|
|
+ hover(row, col) {
|
|
|
+ if (this.showHover) {
|
|
|
+ this.hoverRow = row;
|
|
|
+ if (this.showColHover) this.hoverCol = col;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ leave() {
|
|
|
+ this.hoverRow = -1;
|
|
|
+ this.hoverCol = -1;
|
|
|
+ },
|
|
|
+ handleCurrentChange(val) {
|
|
|
+ this.currentPage = val;
|
|
|
+ this.$emit("onPagging", {
|
|
|
+ pageIndex: this.currentPage,
|
|
|
+ pageSize: this.pageSize,
|
|
|
+ start: this.startRow,
|
|
|
+ end: this.endRow,
|
|
|
+ });
|
|
|
+ },
|
|
|
+ },
|
|
|
+ // 生命周期钩子
|
|
|
+ beforeCreate() {
|
|
|
+ // 创建前
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ // 创建后
|
|
|
+ },
|
|
|
+ beforeMount() {
|
|
|
+ // 渲染前
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ // 渲染后
|
|
|
+ console.log('tabthis:',this)
|
|
|
+ },
|
|
|
+ beforeUpdate() {},
|
|
|
+ updated() {},
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less"></style>
|