index.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <template>
  2. <div class="container">
  3. <div class="table_box">
  4. <div class="table-title-btn">
  5. <slot name="table-title-btn"></slot>
  6. </div>
  7. <el-table
  8. ref="multipleTableRef"
  9. :header-cell-style="{ 'background-color': '#f2f2f2' }"
  10. :data="props.tableData"
  11. style="width: 100%"
  12. row-key="id"
  13. :tree-props="props.treeProps"
  14. >
  15. <el-table-column
  16. type="selection"
  17. v-if="showSelect"
  18. :selectable="selectable"
  19. width="55"
  20. />
  21. <el-table-column
  22. v-if="showIndex"
  23. type="index"
  24. label="序号"
  25. width="55"
  26. />
  27. <el-table-column
  28. v-for="column in columns"
  29. :key="column.prop"
  30. :prop="column.prop"
  31. :label="column.label"
  32. :sortable="column.sortable ? 'custom' : false"
  33. :width="column.width"
  34. >
  35. <template #header>
  36. <slot name="search" :slotData="column"></slot>
  37. </template>
  38. <template #default="scope">
  39. <component v-if="column.formatter" :is="column.formatter(scope.row, column, scope.row[column.prop], scope.$index)" class="routerlick" />
  40. <span v-else>{{ scope.row[column.prop] }}</span>
  41. </template>
  42. </el-table-column>
  43. <el-table-column label="操作">
  44. <template #default="scope">
  45. <slot name="operation" :operationData="scope"></slot>
  46. </template>
  47. <!-- <template #default="scope">
  48. <div v-if="scope.row._edit">
  49. <el-button type="primary" @click="handleSave(scope)"> 保存 </el-button>
  50. <el-button @click="handleCancle(scope)"> 取消 </el-button>
  51. </div>
  52. <el-button v-else type="primary" @click="handleEdit(scope)"> 编辑 </el-button>
  53. </template> -->
  54. </el-table-column>
  55. </el-table>
  56. </div>
  57. <div class="page_box" v-show="props.pageInfo.show">
  58. <el-pagination
  59. v-model:current-page="props.pageInfo.pageNum"
  60. v-model:page-size="props.pageInfo.pageSize"
  61. :page-sizes="props.pageInfo.sizes"
  62. layout="total, sizes, prev, pager, next, jumper"
  63. :total="props.pageInfo.total"
  64. @size-change="handleSizeChange"
  65. @current-change="handleCurrentChange"
  66. />
  67. </div>
  68. </div>
  69. </template>
  70. <script lang="ts" setup>
  71. import { defineProps, ref, onMounted, defineEmits } from "vue";
  72. import type { TableInstance } from "element-plus";
  73. interface TableRow {
  74. [key: string]: any;
  75. }
  76. interface TagTypes {
  77. [key: string]: string;
  78. }
  79. const emit = defineEmits(["getList"]);
  80. const props = defineProps<{
  81. tableData: Array<TableRow>;
  82. columns: {
  83. prop: string;
  84. label: string;
  85. sortable?: boolean;
  86. width?: string;
  87. style?: string;
  88. formatter?: (row: any, column: any, cellValue: any, index: number) => any;
  89. }[];
  90. pageInfo: {
  91. pageNum: number;
  92. pageSize: number;
  93. sizes: number[];
  94. total: number;
  95. show:boolean;
  96. };
  97. showSelect: boolean;
  98. showIndex: boolean;
  99. treeProps:{}
  100. }>();
  101. const multipleTableRef = ref<TableInstance>();
  102. const TableData = ref<TableRow[]>();
  103. onMounted(() => {
  104. let counter = 1;
  105. TableData.value = props.tableData.map((row) => ({
  106. ...row,
  107. _edit: false, // 设置默认非编辑状态
  108. counter: counter++,
  109. }));
  110. });
  111. const selectable = () => true;
  112. const Tagvalue = ref("");
  113. const tagTypes: TagTypes = {
  114. 公司: "primary",
  115. 甲方: "success",
  116. 合作伙伴: "primary",
  117. };
  118. const handleSizeChange = (val: number) => {
  119. props.pageInfo.pageSize = val;
  120. emit("getList", props.pageInfo);
  121. };
  122. const handleCurrentChange = (val: number) => {
  123. props.pageInfo.pageNum = val;
  124. emit("getList", props.pageInfo);
  125. };
  126. const getTagType = (tag: string) => {
  127. return tagTypes[tag] || tagTypes["公司"];
  128. };
  129. const handleEdit = (scope: { row: TableRow }) => {
  130. Tagvalue.value = scope.row.Tag || "";
  131. scope.row._edit = true;
  132. };
  133. const handleSave = (scope: { row: TableRow }) => {
  134. scope.row.Tag = Tagvalue.value;
  135. scope.row._edit = false;
  136. };
  137. const handleCancle = (scope: { row: TableRow }) => {
  138. scope.row._edit = false;
  139. };
  140. const headClass = (scope: { row: TableRow }) => {
  141. // return 'background:#F8F8F9'
  142. };
  143. </script>
  144. <style lang="scss" scoped>
  145. .container {
  146. width: 100%;
  147. height: auto;
  148. margin: 5px;
  149. display: flex;
  150. flex-direction: column;
  151. }
  152. .table_box {
  153. flex: 1;
  154. margin-bottom: 10px;
  155. overflow-y: auto;
  156. .table_item_container {
  157. margin-left: 20px;
  158. padding: 0;
  159. .table_item {
  160. margin: 5px 0;
  161. }
  162. }
  163. :deep(.cell) {
  164. display: flex;
  165. align-items: center;
  166. justify-content: center;
  167. }
  168. .table-title-btn {
  169. margin-bottom: 20px;
  170. :deep(.el-button) {
  171. margin-right: 20px;
  172. }
  173. }
  174. }
  175. .page_box {
  176. display: flex;
  177. align-items: center;
  178. justify-content: flex-end;
  179. }
  180. </style>