PreviewFile.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <template>
  2. <el-dialog
  3. class="page-dialog preview-file"
  4. :visible.sync="modalIsShow"
  5. title="预览"
  6. fullscreen
  7. append-to-body
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. @open="visibleChange"
  11. @close="removeResizeEvent"
  12. >
  13. <iframe
  14. v-if="url && modalIsShow"
  15. :src="url"
  16. id="frame-content"
  17. width="100%"
  18. height="600px"
  19. >
  20. </iframe>
  21. <div slot="footer"></div>
  22. </el-dialog>
  23. </template>
  24. <script>
  25. export default {
  26. name: "preview-file",
  27. props: {
  28. data: {
  29. type: Object,
  30. default() {
  31. return {
  32. url: "",
  33. type: "",
  34. };
  35. },
  36. },
  37. },
  38. data() {
  39. return {
  40. modalIsShow: false,
  41. url: "",
  42. };
  43. },
  44. methods: {
  45. visibleChange() {
  46. this.getFile();
  47. this.registResizeEvent();
  48. },
  49. cancel() {
  50. this.modalIsShow = false;
  51. },
  52. open() {
  53. this.modalIsShow = true;
  54. },
  55. getFile() {
  56. fetch(this.data.url)
  57. .then((response) => response.blob())
  58. .then((blob) => {
  59. this.url = URL.createObjectURL(
  60. new Blob([blob], { type: this.data.type })
  61. );
  62. this.$nextTick(() => {
  63. document.getElementById("frame-content").height =
  64. window.innerHeight - 50;
  65. });
  66. })
  67. .catch((error) => console.error("Error fetching PDF:", error));
  68. },
  69. resizeEvent() {
  70. document.getElementById("frame-content").height = window.innerHeight - 50;
  71. },
  72. registResizeEvent() {
  73. window.addEventListener("resize", this.resizeEvent);
  74. },
  75. removeResizeEvent() {
  76. window.removeEventListener("resize", this.resizeEvent);
  77. },
  78. },
  79. beforeDestroy() {
  80. this.removeResizeEvent();
  81. },
  82. };
  83. </script>