逻辑编排前端

IpuTable.vue 4.3KB

    <template> <el-table ref="ipuTable" class="g-table" :data="tableData" :header-cell-style="headerCellStyle" :cell-style="cellStyle" v-bind="tableAttrs" @current-change="handleCurrentRowChange" @selection-change="handleSelectionChange" > <template #empty> <el-empty description="暂无数据"></el-empty> </template> <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" :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"> <!-- <component :is="header.component" :value="scope.row"></component> --> <!-- 自定义按钮 --> <table-column :header="header" :row="scope.row" :is-disable="isDisable" @change-event="changeEvent" @blur-event="blurEvent" @svgEvent="svgEvent" ></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> </el-table> </template> <script setup> import { ref } from 'vue'; import TableColumn from './TableColumn.vue'; defineProps({ tableHeader: { type: Array, default: () => [] }, tableData: { type: Array, default: () => [] }, tableAttrs: { type: Object, default: () => {} }, isCheck: { type: Boolean, default: () => false }, isDisable: { type: Boolean, default: true } }); const emits = defineEmits([ 'changeEvent', 'blurEvent', 'handleCurrentRowChange', 'svgEvent', 'handleSelectionChange' ]); const cellStyle = ref({ padding: '0 2px', height: '60px', 'line-height': '60px', 'font-size': '14px' }); const headerCellStyle = ref({ padding: '0 2px', height: '39px', 'font-weight': '600', 'font-size': '14px', 'line-height': '39px', color: '#000', 'background-color': '#fafafa' }); const changeEvent = (form) => { emits('changeEvent', form); }; // 触发blur事件 const blurEvent = (form) => { emits('blurEvent', form); }; const ipuTable = ref(null); // 选中当前行 function handleCurrentRowChange(row) { // console.log(row) emits('handleCurrentRowChange', row); } function handleSelectionChange(row) { emits('handleSelectionChange', row); } function svgEvent(row) { emits('svgEvent', row); } function setCurrent(rows) { if (rows) { rows.forEach((row) => { ipuTable.value?.toggleRowSelection(row); }); } } function setSingleCurrent(row) { if (row) { setTimeout(() => { ipuTable.value?.setCurrentRow(row); }, 10); } } // 反选 defineExpose({ ipuTable, setCurrent, setSingleCurrent }); </script> <style scoped 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%; } // 消除table横向滚动条 // :deep(.is-horizontal){ // .el-scrollbar__thumb{ // display: none; // } // } :deep(.el-tooltip) { display: flex; } :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; } } </style>