data-table.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <template>
  2. <div id="data-table">
  3. <el-table :data="data" border stripe size="small">
  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 :key="index" type="text" :icon="item.icon || ''" size="mini" @click="handleOpera(row, item.method)"></el-button>
  14. </el-tooltip>
  15. </template>
  16. </template>
  17. </template>
  18. </el-table-column>
  19. </template>
  20. </el-table>
  21. </div>
  22. </template>
  23. <script>
  24. import _ from 'lodash';
  25. export default {
  26. name: 'data-table',
  27. props: {
  28. fields: { type: Array, required: true },
  29. data: { type: Array, required: true },
  30. opera: { type: Array, default: () => [] },
  31. },
  32. components: {},
  33. data: () => ({}),
  34. created() {},
  35. computed: {},
  36. methods: {
  37. toFormatter(row, column, cellValue, index) {
  38. let this_fields = this.fields.filter(fil => fil.prop === column.property);
  39. if (this_fields.length > 0) {
  40. let format = _.get(this_fields[0], `format`, false);
  41. if (format) {
  42. let res = format(cellValue);
  43. return res;
  44. } else return cellValue;
  45. }
  46. },
  47. handleOpera(data, method) {
  48. this.$emit(method, data);
  49. },
  50. display(item, row) {
  51. let display = _.get(item, `display`, true);
  52. if (display === true) return true;
  53. else {
  54. let res = display(row);
  55. return res;
  56. }
  57. },
  58. },
  59. };
  60. </script>
  61. <style lang="less" scoped></style>