ImgPreview.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <template>
  2. <!-- 图片预览 -->
  3. <div class="demo-image__preview" v-if="canSeeImg(copyFileType)">
  4. <el-image-viewer
  5. v-if="showImageViewer"
  6. :url-list="[previewData]"
  7. @close="closeImgPreview"
  8. />
  9. </div>
  10. <!-- 视频预览 -->
  11. <el-dialog
  12. v-model="showImageViewer"
  13. width="40%"
  14. top="40vh"
  15. draggable
  16. title="预览"
  17. v-if="copyFileType === '.mp4'"
  18. :close-on-click-modal="false"
  19. :before-close="closeImgPreview"
  20. >
  21. <video
  22. :src="previewData"
  23. ref="video"
  24. controls
  25. :style="{ width: '100%', height: '100%' }"
  26. ></video>
  27. </el-dialog>
  28. <!-- 音频预览 -->
  29. <el-dialog
  30. v-model="showImageViewer"
  31. width="40%"
  32. title="预览"
  33. draggable
  34. :close-on-click-modal="false"
  35. v-if="copyFileType === '.mp3'"
  36. :before-close="closeImgPreview"
  37. >
  38. <audio :src="previewData" ref="audio" controls></audio>
  39. </el-dialog>
  40. </template>
  41. <script setup>
  42. import {
  43. ref,
  44. computed,
  45. reactive,
  46. defineComponent,
  47. watch,
  48. onMounted,
  49. defineExpose,
  50. onDeactivated
  51. } from "vue";
  52. const props = defineProps({
  53. showPreview: {
  54. type: Boolean,
  55. default: false,
  56. },
  57. previewData: {
  58. type: String,
  59. default: "",
  60. },
  61. copyFileType: {
  62. type: String,
  63. default: "",
  64. },
  65. });
  66. watch(
  67. () => props.showPreview,
  68. (newValue) => {
  69. // console.log(111);
  70. showImageViewer.value = newValue;
  71. if(newValue == false){
  72. console.log('watch',video.value);
  73. }
  74. },
  75. () => props.previewData,
  76. (newValue) => {
  77. console.log("previewData", newValue);
  78. // showImageViewer.value = newValue;
  79. }
  80. );
  81. const previewImg = ref(null);
  82. const showImageViewer = ref(false); //组件是否显示
  83. const video = ref(null);
  84. const audio = ref(null);
  85. const emit = defineEmits(["closeImgPreview"]);
  86. const showImg = () => {
  87. //预览大图
  88. showImageViewer.value = true;
  89. };
  90. const closeImgPreview = () => {
  91. //必须要这个事件 不然点击右上角关闭按钮没有反应
  92. console.log('sonClose');
  93. if(props.copyFileType === '.mp3'){
  94. const audioDom = document.getElementsByTagName("audio")[0];
  95. audioDom.pause()
  96. }
  97. if(props.copyFileType === '.mp4'){
  98. const videoDom = document.getElementsByTagName("video")[0];
  99. videoDom.pause()
  100. }
  101. // video.value.pause();
  102. // audio.value.pause();
  103. emit("closeImgPreview");
  104. };
  105. const canSeeImg = (copyFileType)=>{
  106. // console.log('copyFileType',props.copyFileType);
  107. const arr = ['.jpg','.JPG','.png','.PNG','.jpeg','JPEG','gif','GIF']
  108. if(arr.includes(copyFileType)){
  109. // console.log(1);
  110. return true
  111. }else{
  112. return false
  113. }
  114. }
  115. onMounted(()=>{
  116. console.log('audio',audio.value);
  117. })
  118. onDeactivated(()=>{
  119. console.log('audio',audio.value);
  120. })
  121. </script>
  122. <style scoped>
  123. .demo-image__error .image-slot {
  124. font-size: 30px;
  125. }
  126. .demo-image__error .image-slot .el-icon {
  127. font-size: 30px;
  128. }
  129. .demo-image__error .el-image {
  130. width: 100%;
  131. height: 200px;
  132. }
  133. .video_box {
  134. position: fixed;
  135. display: flex;
  136. justify-content: center;
  137. align-items: center;
  138. background-color: #fff;
  139. z-index: 10000;
  140. /* top: 20%;
  141. left: 40%; */
  142. }
  143. </style>