config.vue 4.2 KB

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