136 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Vue
		
	
	
| <template>
 | |
|   <el-table
 | |
|     ref="tableRef"
 | |
|     size="small"
 | |
|     :data="data"
 | |
|     :border="border"
 | |
|     :stripe="stripe"
 | |
|     :height="height"
 | |
|     :max-height="maxHeight"
 | |
|     :highlight-current-row="highlightCurrentRow"
 | |
|     :row-key="getRowKey"
 | |
|     :row-class-name="rowClassName"
 | |
|     :row-style="rowStyle"
 | |
|     :show-header="showHeader"
 | |
|     :show-summary="showSummary"
 | |
|     :summary-method="summaryMethod"
 | |
|     :span-method="spanMethod"
 | |
|     :default-expand-all="defaultExpandAll"
 | |
|     :tree-props="treeProps"
 | |
|     :header-cell-style="headerCellStyle"
 | |
|     :cell-style="cellStyle"
 | |
|     :show-overflow-tooltip="showOverflowTooltip"
 | |
|     style="width: 100%"
 | |
|     @row-click="rowClick"
 | |
|     @row-dblclick="rowDblclick"
 | |
|   >
 | |
|     <el-table-column
 | |
|       v-if="showSelection"
 | |
|       type="selection"
 | |
|       :selectable="selectable"
 | |
|       reserve-selection
 | |
|       width="60"
 | |
|       :show-overflow-tooltip="false"
 | |
|     />
 | |
|     <template v-if="showIndex">
 | |
|       <el-table-column v-if="showPagination" label="序号" width="60">
 | |
|         <template #default="{ $index }">
 | |
|           {{ serialNumber(pagination, $index) }}
 | |
|         </template>
 | |
|       </el-table-column>
 | |
|       <el-table-column v-if="!showPagination" label="序号" width="60" type="index" />
 | |
|     </template>
 | |
|     <slot></slot>
 | |
|   </el-table>
 | |
|   <div v-if="showPagination || slots.button" class="table_footer">
 | |
|     <div>
 | |
|       <slot name="button"></slot>
 | |
|     </div>
 | |
|     <app-pagination v-if="showPagination" v-model:pagination="pagination" @get-data="emits('get-data')" />
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script setup>
 | |
| import { useSlots, useTemplateRef } from "vue";
 | |
| import { ElTable, ElTableColumn } from "element-plus";
 | |
| import "element-plus/es/components/table/style/css";
 | |
| import "element-plus/es/components/table-column/style/css";
 | |
| import AppPagination from "../pagination/index.vue";
 | |
| import { serialNumber } from "../../utils/index.js";
 | |
| 
 | |
| const slots = useSlots();
 | |
| defineOptions({
 | |
|   name: "AppTable",
 | |
| });
 | |
| const props = defineProps({
 | |
|   data: { type: Array, required: true },
 | |
|   showPagination: { type: Boolean, default: true },
 | |
|   showIndex: { type: Boolean, default: true },
 | |
|   showSelection: { type: Boolean, default: false },
 | |
|   stripe: { type: Boolean, default: true },
 | |
|   border: { type: Boolean, default: true },
 | |
|   showHeader: { type: Boolean, default: true },
 | |
|   highlightCurrentRow: { type: Boolean, default: false },
 | |
|   showSummary: { type: Boolean, default: false },
 | |
|   defaultExpandAll: { type: Boolean, default: false },
 | |
|   rowKey: { type: [String, Function] },
 | |
|   maxHeight: { type: [String, Number] },
 | |
|   height: { type: [String, Number] },
 | |
|   rowClassName: { type: Function },
 | |
|   rowStyle: { type: Function },
 | |
|   summaryMethod: { type: Function },
 | |
|   spanMethod: { type: Function },
 | |
|   selectable: { type: Function },
 | |
|   treeProps: {
 | |
|     type: Object,
 | |
|     default: () => ({ hasChildren: "hasChildren", children: "children" }),
 | |
|   },
 | |
|   headerCellStyle: { type: Object, default: () => ({}) },
 | |
|   cellStyle: { type: [Object, Function], default: () => ({}) },
 | |
|   showOverflowTooltip: { type: Boolean, default: true },
 | |
| });
 | |
| const pagination = defineModel("pagination", {
 | |
|   type: Object,
 | |
|   default: () => ({
 | |
|     currentPage: 1,
 | |
|     pageSize: 10,
 | |
|     total: 0,
 | |
|   }),
 | |
| });
 | |
| const emits = defineEmits(["get-data", "row-click", "row-dblclick"]);
 | |
| const tableRef = useTemplateRef("tableRef");
 | |
| const getRowKey = (row) => {
 | |
|   if (!props.rowKey) return;
 | |
|   if (typeof props.rowKey === "string") return row[props.rowKey];
 | |
|   else return props.rowKey(row);
 | |
| };
 | |
| const rowClick = (row, column, event) => {
 | |
|   emits("row-click", row, column, event);
 | |
| };
 | |
| const rowDblclick = (row, column, event) => {
 | |
|   emits("row-dblclick", row, column, event);
 | |
| };
 | |
| const getSelectionRows = () => {
 | |
|   return tableRef.value.getSelectionRows();
 | |
| };
 | |
| const clearSelection = () => {
 | |
|   return tableRef.value.clearSelection();
 | |
| };
 | |
| const toggleRowSelection = (value, selected = true) => {
 | |
|   tableRef.value.toggleRowSelection(value, selected);
 | |
| };
 | |
| defineExpose({
 | |
|   getSelectionRows,
 | |
|   clearSelection,
 | |
|   toggleRowSelection,
 | |
| });
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| .table_footer {
 | |
|   margin-top: 20px;
 | |
|   display: flex;
 | |
|   justify-content: space-between;
 | |
| }
 | |
| </style>
 |