dialog.vue 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <template>
  2. <!-- 省市详情弹窗 -->
  3. <el-dialog v-model="props.dialogVisible" :title="`详细数据`" width="80%" :before-close="handleClose" destroy-on-close>
  4. <div class="province-detail">
  5. <div class="header">
  6. <ExportToCSV :hideToggle="true" :hideTable="true" :data="formatData" :columns="columns" :fileName="title" />
  7. </div>
  8. <div class="dialog-container">
  9. <ExportToCSV :size="10" :tableStyle="{ width: '100%', maxWidth: '1476px', margin: '0 auto' }"
  10. :hideToggle="true" :hideTable="false" :data="formatData" :columns="columns" :fileName="title" />
  11. </div>
  12. </div>
  13. </el-dialog>
  14. </template>
  15. <script lang="ts" name="device" setup>
  16. import { ref, computed } from 'vue'
  17. import ExportToCSV from '/@/views/count/components/ExportToCSV.vue'
  18. const props = defineProps({
  19. provinceDetail: {
  20. type: Array,
  21. default: () => []
  22. },
  23. selectedProvince: {
  24. type: String,
  25. default: ''
  26. },
  27. dialogVisible: {
  28. type: Boolean,
  29. default: false
  30. }
  31. })
  32. const emit = defineEmits(['update:dialogVisible'])
  33. // 关闭弹窗
  34. const handleClose = () => {
  35. emit('update:dialogVisible', false)
  36. }
  37. const title = computed(() => {
  38. return props.selectedProvince + ' 详细数据'
  39. })
  40. // 定义表格列配置
  41. const columns = [
  42. { prop: 'city', label: '城市' },
  43. { prop: 'newUser', label: '新增用户' },
  44. { prop: 'newUserPercentage', label: '新增用户占比' },
  45. { prop: 'activeUser', label: '活跃用户' },
  46. { prop: 'activeUserPercentage', label: '活跃用户占比' },
  47. { prop: 'startCount', label: '启动次数' },
  48. { prop: 'startCountPercentage', label: '启动次数占比' }
  49. ];
  50. const formatData = computed(() => {
  51. console.log(`formatData: `);
  52. console.log(props.provinceDetail);
  53. return props.provinceDetail.map((item: any) => {
  54. return {
  55. city: item.name,
  56. newUser: item.value,
  57. newUserPercentage: `${item.value}%`,
  58. activeUser: item.value,
  59. activeUserPercentage: `${item.value}%`,
  60. startCount: item.value,
  61. startCountPercentage: `${item.value}%`
  62. }
  63. })
  64. })
  65. </script>
  66. <style scoped lang="scss">
  67. @import '/@/views/count/styles/common.scss';
  68. .header {
  69. height: 30px;
  70. }
  71. </style>
  72. <style lang="scss">
  73. .el-overlay .el-overlay-dialog .el-dialog .el-dialog__body {
  74. padding: 0 !important;
  75. }
  76. .el-dialog__header {
  77. padding-bottom: 0!important;
  78. }
  79. </style>