table.vue 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <template>
  2. <el-table size="mini" :data="datas" class="table" @selection-change="handleSelectionChange" @row-dblclick="$emit('oper', { event: 'dblclick', data: $event })" border>
  3. <el-table-column v-if="selection" type="selection" width="55"></el-table-column>
  4. <el-table-column v-for="(item, index) in meta" :key="index" :prop="item.name" :label="item.title" :width="item.width || ''" show-overflow-tooltip></el-table-column>
  5. <el-table-column label="操作" v-if="readonly">
  6. <template slot-scope="scope">
  7. <el-button size="mini" type="text" v-for="(item, index) in operation" :key="index" @click="oper(item, scope)">
  8. <i v-if="item.icons" :class="item.icons"></i>
  9. {{ item.title }}
  10. </el-button>
  11. </template>
  12. </el-table-column>
  13. </el-table>
  14. </template>
  15. <script>
  16. export default {
  17. components: {},
  18. props: {
  19. data: { type: Array, defalut: [] },
  20. meta: Array,
  21. operation: Array,
  22. selection: Boolean,
  23. readonly: Boolean
  24. },
  25. computed: {
  26. datas () {
  27. const formatter = this.meta.filter(p => p.formatter)
  28. const data = [...this.data]
  29. formatter.filter(i => {
  30. data.map(p => {
  31. const dict = this.$dict(i.name) || []
  32. // eslint-disable-next-line eqeqeq
  33. const item = dict.filter(z => p[i.name] == z.value)
  34. if (item.length > 0) {
  35. p[i.name] = item[0].title
  36. }
  37. })
  38. })
  39. return data
  40. }
  41. },
  42. data () {
  43. return {}
  44. },
  45. methods: {
  46. handleSelectionChange (val) {
  47. this.$emit('selection', val)
  48. },
  49. oper (item, scope) {
  50. const formatter = this.meta.filter(p => p.formatter)
  51. const data = { ...scope.row }
  52. formatter.filter(i => {
  53. for (const key in data) {
  54. const dict = this.$dict(key) || []
  55. if (dict.length > 0) {
  56. // eslint-disable-next-line eqeqeq
  57. const item = dict.filter(z => data[key] == z.title)
  58. if (item.length > 0) {
  59. data[key] = item[0].value
  60. }
  61. }
  62. }
  63. })
  64. this.$emit('oper', { event: item.name, data: data })
  65. }
  66. },
  67. mounted () {}
  68. }
  69. </script>
  70. <style lang="less" scoped>
  71. .table {
  72. width: 98%;
  73. margin: 0 auto;
  74. max-height: 60vh;
  75. overflow-y: auto;
  76. }
  77. </style>