index.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. <!--
  2. 二次封装vxe-table组件
  3. @Author: linqian
  4. @Date: 2021-10-18 14:22
  5. -->
  6. <template>
  7. <div>
  8. <vxe-table
  9. ref="vxeGrid"
  10. :data="tableData"
  11. :border="true"
  12. :loading="false"
  13. rowId="id"
  14. v-bind="gridOptions"
  15. highlight-hover-row
  16. :seq-config="{ seqMethod }"
  17. >
  18. <vxe-table-column type="checkbox" width="60" align="center" v-if="selection">
  19. <template #header="row">
  20. <span class="custom-checkbox">
  21. <el-checkbox
  22. :indeterminate="row.indeterminate"
  23. v-model="row.checked"
  24. @change="handleToggleAllCheck"
  25. ></el-checkbox>
  26. </span>
  27. </template>
  28. <template #checkbox="scoped">
  29. <span class="custom-checkbox">
  30. <el-checkbox
  31. :indeterminate="scoped.indeterminate"
  32. v-model="scoped.checked"
  33. @change="handleToggleCheck(scoped.row)"
  34. ></el-checkbox>
  35. </span>
  36. </template>
  37. </vxe-table-column>
  38. <vxe-table-column type="seq" width="60" align="center" title="序号"></vxe-table-column>
  39. <vxe-table-column
  40. v-for="item in tableColumn"
  41. :key="item.id"
  42. :align="item.align ? item.align : 'center'"
  43. v-bind="item"
  44. >
  45. <template #default="{ row }">
  46. <template v-if="item.custom">
  47. <slot :name="item.field" :row="row"></slot>
  48. </template>
  49. <template v-else>{{ row[item.field] }}</template>
  50. </template>
  51. </vxe-table-column>
  52. <vxe-table-column v-if="tableOptList.length > 0" align="center" title="操作" field="operate" width="100px">
  53. <template #default="{ row }">
  54. <div class="u-table__operation">
  55. <el-tooltip
  56. v-for="(item, index) in tableOptList"
  57. :key="index"
  58. :content="item"
  59. effect="dark"
  60. placement="top-end"
  61. >
  62. <i :class="item | optIcon" @click="handleEvent(item, row)"></i>
  63. </el-tooltip>
  64. </div>
  65. </template>
  66. </vxe-table-column>
  67. </vxe-table>
  68. <!-- 分页器 -->
  69. <div class="pagination-section" v-show="pagination">
  70. <el-pagination
  71. @size-change="handleSizeChange"
  72. @current-change="handleCurrentChange"
  73. :page-sizes="[10, 20, 30]"
  74. layout="total, sizes, prev, pager, next, jumper"
  75. :page-size="pageSize"
  76. :current-page="currentPage"
  77. :total="total"
  78. >
  79. </el-pagination>
  80. </div>
  81. </div>
  82. </template>
  83. <script>
  84. export default {
  85. props: {
  86. // 表格数据
  87. tableData: Array,
  88. // 是否有复选框
  89. selection: {
  90. type: Boolean,
  91. default: true
  92. },
  93. tableColumn: Array,
  94. // 是否分页
  95. pagination: {
  96. type: Boolean,
  97. default: true
  98. },
  99. paginationConfig: {
  100. type: Object,
  101. default: () => {
  102. return {
  103. pageSize: 10,
  104. currentPage: 1,
  105. total: 0
  106. };
  107. }
  108. },
  109. gridOptions: {
  110. type: Object,
  111. default: () => {}
  112. },
  113. tableOptList: {
  114. type: Array,
  115. default: () => []
  116. }
  117. },
  118. components: {},
  119. data() {
  120. return {};
  121. },
  122. computed: {
  123. pageSize() {
  124. return this.paginationConfig.pageSize;
  125. },
  126. currentPage() {
  127. return this.paginationConfig.currentPage;
  128. },
  129. total() {
  130. return this.paginationConfig.total;
  131. }
  132. },
  133. methods: {
  134. // 条数
  135. handleSizeChange(val) {
  136. this.pageSize = val;
  137. this.currentPage = 1;
  138. this.submitPaginationChange(1, val);
  139. },
  140. // 页码改变
  141. handleCurrentChange(val) {
  142. this.submitPaginationChange(val, this.paginationConfig.pageSize);
  143. },
  144. submitPaginationChange(currentPage, pageSize) {
  145. this.$emit('paginationChange', {
  146. pageSize,
  147. currentPage
  148. });
  149. },
  150. // 发送操作事件类型
  151. handleEvent(type, row) {
  152. this.$emit('submitTableOpt', type, row);
  153. },
  154. // 改变单个复选框
  155. handleToggleCheck(row) {
  156. this.$refs.vxeGrid.toggleCheckboxRow(row);
  157. },
  158. // 改变全选复选框
  159. handleToggleAllCheck() {
  160. this.$refs.vxeGrid.toggleAllCheckboxRow();
  161. },
  162. // 自定义序号
  163. // 自定义原因: 树形表格翻页序号还是从1开始
  164. seqMethod({ level, seq, $seq }) {
  165. let index = '';
  166. if (level > 0) {
  167. index = `${$seq}.${seq}`;
  168. if (this.pagination) {
  169. const dotIndex = index.indexOf('.');
  170. if (dotIndex > -1) {
  171. let integerNum = (this.currentPage - 1) * this.pageSize + Number(index.substring(0, dotIndex));
  172. index = integerNum + '' + index.substr(dotIndex);
  173. }
  174. }
  175. } else {
  176. index = seq;
  177. if (this.pagination) {
  178. index = (this.currentPage - 1) * this.pageSize + seq;
  179. }
  180. }
  181. return index;
  182. }
  183. },
  184. created() {},
  185. mounted() {}
  186. };
  187. </script>
  188. <style lang='scss' scoped>
  189. .pagination-section {
  190. text-align: right;
  191. margin-top: 10px;
  192. }
  193. /deep/ .vxe-table .vxe-table--header-wrapper {
  194. color: rgba(0, 0, 0, 0.65);
  195. font-family: 'Microsoft YaHei', '微软雅黑', 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', Arial,
  196. sans-serif;
  197. -webkit-font-smoothing: antialiased;
  198. }
  199. /deep/ .vxe-table--render-default {
  200. color: rgba(0, 0, 0, 0.85);
  201. }
  202. /deep/ .vxe-table--render-default .vxe-cell {
  203. white-space: normal;
  204. }
  205. /deep/ .vxe-header--column {
  206. font-weight: 400;
  207. }
  208. /deep/ .vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--icon:before {
  209. border: 1px solid rgba(0, 0, 0, 0.15);
  210. }
  211. /deep/ .vxe-body--row:hover {
  212. background-color: rgba(24, 144, 255, 0.08);
  213. }
  214. /deep/ .vxe-table--render-default .vxe-table--empty-block {
  215. min-height: 60px;
  216. color: rgba(0, 0, 0, 0.65);
  217. }
  218. </style>