AIoT前端公共UI

CommonTable.vue 7.0KB

    <!-- * @Author: Devin * @Date: 2022-11-14 19:12:19 * @LastEditors: Devin * @LastEditTime: 2023-02-22 14:50:16 * @Description: 公共table --> <template> <el-table ref="commonTableRef" width="100%" :height="height" class="__common-table" empty-text="暂无数据" :data="tableData" :header-cell-style="headerCellStyle" :highlight-current-row="highlight" :cell-style="cellStyle" v-bind="tableAttrs" :scrollbar-always-on="false" @current-change="handleCurrentRowChange" @selection-change="handleSelectionChange" > <el-table-column v-if="isCheck" type="selection" width="55" ></el-table-column> <template v-for="header in tableHeader" :key="header?.name"> <!-- 自自定义按钮 --> <el-table-column v-if="header['type'] === 'selection'" type="selection" width="55" ></el-table-column> <!-- 按钮 --> <el-table-column v-else-if="header?.['type'] === 'custom'" :prop="header?.['name']" :label="header?.['label']" :width="header?.['width']" :min-width="header['minWidth']" :sortable="header?.['sortable'] || false" :fixed="header?.['fixed'] || false" :align="header?.['position'] || 'left'" > <template #default="scope"> <template v-for="btn in scope.row.actions" :key="btn.name"> <el-dropdown v-if="btn?.children" class="aiot-table-drop"> <el-button :disabled="btn.disabled" text :type="btn?.type || 'primary'" > {{ btn.label }} </el-button> <template #dropdown> <el-dropdown-menu> <el-dropdown-item v-for="drop in btn.children" :key="drop.name" :disabled="drop.disabled" @click.stop="drop.onClick(scope.row)" > {{ drop.label }} </el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> <el-button v-else text :disabled="btn.disabled" :type="btn?.type || 'primary'" @click="btn.onClick(scope.row)" > {{ btn.label }} </el-button> </template> </template> </el-table-column> <!-- 其他 --> <el-table-column v-else-if="header?.['type']" :prop="header?.['name']" :label="header?.['label']" :width="header?.['width']" :min-width="header?.['minWidth']" :sortable="header?.['sortable'] || false" :fixed="header?.['fixed'] || false" :align="header?.['position'] || 'left'" > <template #default="scope"> <!-- 自定义按钮 --> <table-column :header="header" :row="scope.row" :is-disable="isDisable" @change-event="changeEvent" @blur-event="blurEvent" ></table-column> <!-- 按钮 --> <slot :name="header['name']" :row="scope.row"></slot> </template> </el-table-column> <!-- 普通样式 --> <el-table-column v-else :prop="header?.['name']" show-overflow-tooltip :label="header?.['label']" :width="header?.['width']" :min-width="header?.['minWidth']" :sortable="header?.['sortable'] || false" :align="header?.['position'] || 'left'" :fixed="header?.['fixed'] || false" > <template #default="scope"> {{ scope.row[header?.['name']] || scope.row[header?.['name']] === 0 ? scope.row[header?.['name']] : '-' }} </template> </el-table-column> </template> <template #empty> <el-empty v-if="isEmpty" :image="getIcon('empty')" description="暂无数据" ></el-empty> </template> </el-table> </template> <script lang="ts" setup> import { ElTable } from 'element-plus'; import { ref } from 'vue'; import TableColumn from './TableColumn.vue'; const headerCellStyle = <any>{ padding: '0 2px', height: '39px', 'font-weight': '600', 'font-size': '12px', 'line-height': '39px', color: '#7B93A7', 'background-color': '#F9F9F9' }; const cellStyle = ref({ padding: '0 2px', height: '40px', 'line-height': '40px', 'font-size': '12px', color: '#2D3E53' }); defineProps({ tableHeader: { type: Array<any>, default: () => [] }, tableData: { type: Array<any>, default: () => [] }, tableAttrs: { type: Object, default: () => {} }, isCheck: { type: Boolean, default: () => false }, isDisable: { type: Boolean, default: true }, tableBtns: { type: Array<any>, default: () => [] }, isEmpty: { type: Boolean, default: () => true }, highlight: { type: Boolean, default: () => false }, height: { type: String, default: () => '100%' } }); function getIcon(name: any) { return new URL(`../assets/images/${name}.svg`, import.meta.url).href; } const emits = defineEmits([ 'changeEvent', 'blurEvent', 'handleCurrentRowChange', 'svgEvent', 'handleSelectionChange' ]); const changeEvent = (form: object) => { emits('changeEvent', form); }; // 触发blur事件 const blurEvent = (form: object) => { emits('blurEvent', form); }; const commonTableRef = ref<InstanceType<typeof ElTable>>(); // 选中当前行 function handleCurrentRowChange(row: object) { // console.log(row) emits('handleCurrentRowChange', row); } function handleSelectionChange(row: object) { emits('handleSelectionChange', row); } function setCurrent(rows: any) { if (rows) { rows.forEach((row: object) => { // @ts-expect-error commonTableRef.value!.toggleRowSelection(row); }); } } function setSingleCurrent(row: object) { if (row) { setTimeout(() => { commonTableRef.value!.setCurrentRow(row); }, 10); } } // 反选 defineExpose({ commonTableRef, setCurrent, setSingleCurrent }); </script> <script lang="ts"> export default { name: 'CommonTable' }; </script> <style lang="scss"> .__common-table { } .el-popper { max-width: 600px !important; } .el-button.is-text:not(.is-disabled):focus, .el-button.is-text:not(.is-disabled):hover, .el-button.is-text:not(.is-disabled):active { /* background-color: var(--el-fill-color-light); */ background: none !important; } :deep(.current-row) { position: relative; background: rgba(25, 130, 255, 0.04); &:after { content: ''; position: absolute; left: 0; width: 4px; height: 100%; background: #2d98ff; z-index: 1000; } } .el-button.is-text { padding: 0; } </style> <style lang="scss"> :deep(.el-table__inner-wrapper) { font-size: 14px; .el-table__header-wrapper { font-size: 14px; thead tr { font-size: 14px; } } } .el-table { width: 100%; } </style>