config.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <script setup lang="ts">
  2. import { useI18n } from "vue-i18n";
  3. import { ref, reactive } from "vue";
  4. import { type Direction } from "element-plus";
  5. import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
  6. import { type VxeTableEvents, type VxeTableInstance } from "vxe-table";
  7. interface Props {
  8. drawer: boolean;
  9. drawTitle?: string;
  10. direction?: Direction;
  11. }
  12. withDefaults(defineProps<Props>(), {
  13. drawer: false,
  14. drawTitle: "",
  15. direction: "rtl"
  16. });
  17. const emit = defineEmits<{
  18. (e: "handleClose"): void;
  19. }>();
  20. const { t } = useI18n();
  21. const xTable = ref({} as VxeTableInstance);
  22. const configData = reactive({
  23. tableData: [
  24. {
  25. name: "禁用",
  26. dataval: "0"
  27. },
  28. {
  29. name: "启用",
  30. dataval: "1"
  31. }
  32. ],
  33. isAllChecked: false,
  34. isIndeterminate: false,
  35. selectRecords: [] as any[],
  36. tablePage: {
  37. total: 0,
  38. currentPage: 1,
  39. pageSize: 10
  40. }
  41. });
  42. // 抽屉关闭
  43. function handleClose() {
  44. configData.isAllChecked = false;
  45. configData.isIndeterminate = false;
  46. emit("handleClose");
  47. }
  48. function editConfig(row) {
  49. console.log("editConfig", row);
  50. }
  51. function delConfig(row) {
  52. console.log("delConfig", row);
  53. }
  54. const changeAllEvent = () => {
  55. setTimeout(() => {
  56. console.log(xTable);
  57. }, 1000);
  58. const $table = xTable.value;
  59. $table.setAllCheckboxRow(configData.isAllChecked);
  60. configData.selectRecords = $table.getCheckboxRecords();
  61. };
  62. const checkboxChangeEvent: VxeTableEvents.CheckboxChange = ({ records }) => {
  63. const $table = xTable.value;
  64. configData.isAllChecked = $table.isAllCheckboxChecked();
  65. configData.isIndeterminate = $table.isAllCheckboxIndeterminate();
  66. configData.selectRecords = records;
  67. };
  68. </script>
  69. <template>
  70. <div class="config">
  71. <el-drawer
  72. :model-value="drawer"
  73. :direction="direction"
  74. :before-close="handleClose"
  75. destroy-on-close
  76. size="680px"
  77. >
  78. <template #header>
  79. <span class="color-black dark:color-white">{{ drawTitle }}</span>
  80. </template>
  81. <el-divider />
  82. <!-- 列表 -->
  83. <div class="p-2">
  84. <vxe-table
  85. ref="xTable"
  86. border
  87. :data="configData.tableData"
  88. @checkbox-change="checkboxChangeEvent"
  89. @checkbox-all="checkboxChangeEvent"
  90. >
  91. <vxe-table-column type="checkbox" width="60" />
  92. <vxe-table-column field="name" title="名称" />
  93. <vxe-table-column field="dataval" title="数据值" />
  94. <vxe-table-column title="操作" fixed="right">
  95. <template #default="{ row }">
  96. <el-button
  97. link
  98. type="primary"
  99. :icon="useRenderIcon('edits')"
  100. @click="editConfig(row)"
  101. >
  102. 编辑
  103. </el-button>
  104. <el-button
  105. link
  106. type="primary"
  107. :icon="useRenderIcon('delete')"
  108. @click="delConfig(row)"
  109. >
  110. 删除
  111. </el-button>
  112. </template>
  113. </vxe-table-column>
  114. </vxe-table>
  115. <vxe-pager
  116. perfect
  117. v-model:current-page="configData.tablePage.currentPage"
  118. v-model:page-size="configData.tablePage.pageSize"
  119. :total="configData.tablePage.total"
  120. :layouts="[
  121. 'PrevJump',
  122. 'PrevPage',
  123. 'Number',
  124. 'NextPage',
  125. 'NextJump',
  126. 'Sizes',
  127. 'FullJump',
  128. 'Total'
  129. ]"
  130. >
  131. <template #left>
  132. <span class="absolute left-3 flex items-center">
  133. <vxe-checkbox
  134. v-model="configData.isAllChecked"
  135. :indeterminate="configData.isIndeterminate"
  136. @change="changeAllEvent"
  137. />
  138. <p>已选中{{ configData.selectRecords.length }}条</p>
  139. <el-button link type="danger" class="ml-1">
  140. {{ t("buttons.hsdelete") }}
  141. </el-button>
  142. </span>
  143. </template>
  144. </vxe-pager>
  145. </div>
  146. </el-drawer>
  147. </div>
  148. </template>
  149. <style lang="scss" scoped>
  150. :deep(.el-drawer__header) {
  151. margin-bottom: 0;
  152. }
  153. :deep(.el-drawer__body) {
  154. padding: 0;
  155. }
  156. :deep(.el-divider--horizontal) {
  157. margin: 13px 0;
  158. }
  159. </style>