Implementing File Preview in Vue 3: Complete Implementation Guide

File Preview Implementation in Vue3

This guide covers implementing preview functionality for common file types within a Vue 3 project.

Supported File Types

The implementation supports: docx, xlsx, pdf, txt, png, jpg, jpeg, mp4, and mp3.

Note: Legacy DOC format is not supported due to lack of reliable solutions. Only DOCX is covered.


1. DOCX Document Preview

Install Dependencies Using version 1.6.2:

npm i @vue-office/docx
# or
yarn add @vue-office/docx

Component Template

<template>
  <vue-office-docx
    :src="documentUrl"
    :style="previewStyles"
    @rendered="handleRendered"
    @error="handleError"
  />
</template>

Script Section

<script setup>
import { defineProps } from 'vue';
import VueOfficeDocx from '@vue-office/docx';
import '@vue-office/docx/lib/index.css';

const props = defineProps({
  documentUrl: {
    type: String,
    required: false,
    default: () => ''
  }
});

const previewStyles = {
  width: '100%',
  height: '100%'
};

const handleRendered = () => {
  console.log('Document rendered successfully');
};

const handleError = (error) => {
  console.error('Rendering failed:', error);
};
</script>

2. XLSX Document Preview

Install Dependencies Using version 1.7.8:

npm i @vue-office/excel
# or
yarn add @vue-office/excel

Comopnent Template

<template>
  <vue-office-excel
    :src="spreadsheetUrl"
    :style="previewStyles"
    @rendered="handleRendered"
    @error="handleError"
  />
</template>

Script Section

<script setup>
import { defineProps } from 'vue';
import VueOfficeExcel from '@vue-office/excel';
import '@vue-office/excel/lib/index.css';

const props = defineProps({
  spreadsheetUrl: {
    type: String,
    required: false,
    default: () => ''
  }
});

const previewStyles = {
  width: '100%',
  height: '100%'
};

const handleRendered = () => {
  console.log('Spreadsheet rendered successfully');
};

const handleError = (error) => {
  console.error('Rendering failed:', error);
};
</script>

3. PDF and TXT Preview

No additional dependencies required. Uses native iframe support for both formats.

Component Template

<template>
  <iframe
    :src="fileUrl"
    style="width: 100%; height: 600px; border: none;"
  />
</template>

Script Section

<script setup>
import { defineProps } from 'vue';

const props = defineProps({
  fileUrl: {
    type: String,
    required: false,
    default: () => ''
  }
});
</script>

4. Video Preview

Install Dependencies Using version 1.3.2:

npm i vue3-video-play
# or
yarn add vue3-video-play

Entry File Configuration

import { createApp } from 'vue';
import App from './App.vue';
import vue3videoPlay from 'vue3-video-play';
import 'vue3-video-play/dist/style.css';

const app = createApp(App);
app.use(vue3videoPlay);
app.mount('#app');

Important Fix: Some versions have module path issues. To resolve runtime errorss, edit the dependency's package.json and change the 'module' field to "./dist/index.mjs".

Component Template

<template>
  <vue3-video-play
    width="100%"
    title="Sample Video"
    :src="videoUrl"
    :poster="videoOptions.poster"
    @play="onPlayHandler"
    @pause="onPauseHandler"
    @timeupdate="onTimeUpdateHandler"
    @canplay="onCanPlayHandler"
  />
</template>

Script Section

<script setup>
import { reactive, defineProps } from 'vue';

const props = defineProps({
  videoUrl: {
    type: String,
    required: false,
    default: () => ''
  }
});

const videoOptions = reactive({
  poster: ''
});

const onPlayHandler = (event) => {
  console.log('Video playing');
};

const onPauseHandler = (event) => {
  console.log('Video paused');
};

const onTimeUpdateHandler = (event) => {
  console.log('Time updated');
};

const onCanPlayHandler = (event) => {
  console.log('Ready to play');
};
</script>

5. Audio Preview

No external dependencies required. Uses native HTML5 audio element.

Component Template

<template>
  <audio
    controls
    controlsList="nodownload"
    style="width: 100%;"
  >
    <source
      :src="audioUrl"
      type="audio/mp3"
    />
    Your browser does not support the audio element.
  </audio>
</template>

Script Section

<script setup>
import { defineProps } from 'vue';

const props = defineProps({
  audioUrl: {
    type: String,
    required: false,
    default: () => ''
  }
});
</script>

Tags: Vue 3 File Preview frontend DocX XLSX

Posted on Wed, 24 Jun 2026 16:59:38 +0000 by 6pandn21