data-table.vue 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <template>
  2. <div id="data-table">
  3. <el-table :data="data" border stripe size="small" :max-height="height ? height : ''">
  4. <template v-for="(item, index) in fields">
  5. <el-table-column :key="index" align="center" :label="item.label" :prop="item.prop" :formatter="toFormatter"></el-table-column>
  6. </template>
  7. <template v-if="opera.length > 0">
  8. <el-table-column label="操作" align="center">
  9. <template v-slot="{ row, $index }">
  10. <template v-for="(item, index) in opera">
  11. <template v-if="display(item, row)">
  12. <el-tooltip :key="index" effect="dark" :content="item.label" placement="bottom">
  13. <el-button
  14. :key="index"
  15. type="text"
  16. :icon="item.icon || ''"
  17. size="mini"
  18. @click="handleOpera(row, item.method, item.confirm, item.methodZh, item.label, $index)"
  19. ></el-button>
  20. </el-tooltip>
  21. </template>
  22. </template>
  23. </template>
  24. </el-table-column>
  25. </template>
  26. </el-table>
  27. </div>
  28. </template>
  29. <script>
  30. import _ from 'lodash';
  31. export default {
  32. name: 'data-table',
  33. props: {
  34. fields: { type: Array, required: true },
  35. data: { type: Array, required: true },
  36. opera: { type: Array, default: () => [] },
  37. toFormat: null,
  38. height: null,
  39. },
  40. components: {},
  41. data: () => ({}),
  42. created() {},
  43. computed: {},
  44. methods: {
  45. toFormatter(row, column, cellValue, index) {
  46. let this_fields = this.fields.filter(fil => fil.prop === column.property);
  47. if (this_fields.length > 0) {
  48. let format = _.get(this_fields[0], `format`, false);
  49. if (format) {
  50. let res;
  51. if (_.isFunction(format)) {
  52. res = format(cellValue);
  53. } else {
  54. res = this.toFormat({
  55. model: this_fields[0].prop,
  56. value: cellValue,
  57. });
  58. }
  59. return res;
  60. } else return cellValue;
  61. }
  62. },
  63. handleOpera(data, method, confirm = false, methodZh, label, index) {
  64. if (!methodZh) {
  65. methodZh = label;
  66. }
  67. if (confirm) {
  68. this.$confirm(`您确认${methodZh}该数据?`, '提示', {
  69. confirmButtonText: '确定',
  70. cancelButtonText: '取消',
  71. type: 'warning',
  72. })
  73. .then(() => {
  74. this.$emit(method, { data, index });
  75. })
  76. .catch(() => {});
  77. } else {
  78. this.$emit(method, { data, index });
  79. }
  80. },
  81. display(item, row) {
  82. let display = _.get(item, `display`, true);
  83. if (display === true) return true;
  84. else {
  85. let res = display(row);
  86. return res;
  87. }
  88. },
  89. },
  90. };
  91. </script>
  92. <style lang="less" scoped></style>