data-table.vue 1.6 KB

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