当前位置:首页 > VUE

vue实现文件列表

2026-01-15 08:04:49VUE

实现文件列表的基本结构

在Vue中实现文件列表功能,可以通过v-for指令动态渲染文件数据。需要准备一个数组存储文件信息,每个文件对象包含名称、大小、类型等属性。

<template>
  <div>
    <ul>
      <li v-for="file in files" :key="file.name">
        {{ file.name }} ({{ formatSize(file.size) }})
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      files: [
        { name: 'document.pdf', size: 1024, type: 'application/pdf' },
        { name: 'image.jpg', size: 2048, type: 'image/jpeg' },
        { name: 'report.docx', size: 3072, type: 'application/msword' }
      ]
    }
  },
  methods: {
    formatSize(bytes) {
      if (bytes === 0) return '0 Bytes'
      const k = 1024
      const sizes = ['Bytes', 'KB', 'MB', 'GB']
      const i = Math.floor(Math.log(bytes) / Math.log(k))
      return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
    }
  }
}
</script>

添加文件上传功能

通过<input type="file">元素实现文件选择,使用@change事件处理文件添加逻辑。

vue实现文件列表

<template>
  <div>
    <input type="file" multiple @change="handleFileUpload">
    <ul>
      <li v-for="(file, index) in files" :key="index">
        {{ file.name }} 
        <button @click="removeFile(index)">删除</button>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      files: []
    }
  },
  methods: {
    handleFileUpload(event) {
      const uploadedFiles = Array.from(event.target.files)
      this.files = [...this.files, ...uploadedFiles]
      event.target.value = null
    },
    removeFile(index) {
      this.files.splice(index, 1)
    }
  }
}
</script>

显示文件类型图标

根据文件扩展名显示对应的图标,可以使用字体图标库或自定义图片。

<template>
  <div>
    <ul>
      <li v-for="file in files" :key="file.name">
        <i :class="getFileIcon(file.name)"></i>
        {{ file.name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  methods: {
    getFileIcon(filename) {
      const extension = filename.split('.').pop().toLowerCase()
      const icons = {
        pdf: 'fas fa-file-pdf',
        jpg: 'fas fa-file-image',
        png: 'fas fa-file-image',
        docx: 'fas fa-file-word',
        xlsx: 'fas fa-file-excel'
      }
      return icons[extension] || 'fas fa-file'
    }
  }
}
</script>

实现文件预览功能

对于图片和PDF等文件类型,可以添加预览功能。

vue实现文件列表

<template>
  <div>
    <ul>
      <li v-for="file in files" :key="file.name">
        <span @click="previewFile(file)">{{ file.name }}</span>
      </li>
    </ul>
    <div v-if="previewUrl">
      <img v-if="isImage" :src="previewUrl" style="max-width: 300px">
      <iframe v-else :src="previewUrl" style="width: 100%; height: 500px"></iframe>
      <button @click="previewUrl = null">关闭预览</button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      previewUrl: null,
      isImage: false
    }
  },
  methods: {
    previewFile(file) {
      if (file.type.startsWith('image/')) {
        this.isImage = true
        this.previewUrl = URL.createObjectURL(file)
      } else {
        this.isImage = false
        this.previewUrl = URL.createObjectURL(file)
      }
    }
  }
}
</script>

添加文件拖放功能

通过HTML5的拖放API实现文件拖放上传功能。

<template>
  <div 
    @dragover.prevent="dragover = true"
    @dragleave.prevent="dragover = false"
    @drop.prevent="handleDrop"
    :class="{ 'drag-active': dragover }"
  >
    <p>拖放文件到此处</p>
    <ul>
      <li v-for="file in files" :key="file.name">
        {{ file.name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      dragover: false,
      files: []
    }
  },
  methods: {
    handleDrop(event) {
      this.dragover = false
      const droppedFiles = event.dataTransfer.files
      this.files = [...this.files, ...Array.from(droppedFiles)]
    }
  }
}
</script>

<style>
.drag-active {
  border: 2px dashed #42b983;
  background-color: rgba(66, 185, 131, 0.1);
}
</style>

实现文件下载功能

为列表中的文件添加下载按钮,通过创建临时URL实现文件下载。

<template>
  <div>
    <ul>
      <li v-for="file in files" :key="file.name">
        {{ file.name }}
        <button @click="downloadFile(file)">下载</button>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  methods: {
    downloadFile(file) {
      const url = URL.createObjectURL(file)
      const link = document.createElement('a')
      link.href = url
      link.download = file.name
      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link)
      URL.revokeObjectURL(url)
    }
  }
}
</script>

标签: 文件列表vue
分享给朋友:

相关文章

vue实现前端分离

vue实现前端分离

Vue 实现前后端分离 前后端分离是一种架构模式,前端负责页面渲染和交互逻辑,后端提供数据接口。Vue.js 作为前端框架,非常适合实现前后端分离的开发模式。 核心实现步骤 创建 Vue 项目 使…

vue前端实现搜索

vue前端实现搜索

实现搜索功能的基本方法 在Vue中实现搜索功能通常涉及以下几个关键步骤,结合数据绑定、计算属性和方法调用来动态过滤和显示结果。 数据绑定与输入处理 使用v-model双向绑定搜索输入框的值,监听用户…

vue实现简单的弹窗

vue实现简单的弹窗

使用 Vue 实现简单弹窗 组件基础结构 创建一个名为 Modal.vue 的组件文件,包含模板、脚本和样式部分: <template> <div class="modal-…

vue实现冰墩墩

vue实现冰墩墩

使用 Vue 实现冰墩墩动画 通过 Vue 的动画特性和 SVG 技术,可以动态渲染冰墩墩的形象。以下是具体实现方法: 准备 SVG 素材 冰墩墩的形象通常由多个 SVG 路径组成,包括身体轮廓…

vue实现弹窗可切换

vue实现弹窗可切换

实现弹窗可切换的 Vue 方案 动态组件切换 通过 Vue 的 <component :is="currentComponent"> 动态加载不同弹窗组件,结合 v-if 控制显示状态。…

vue实现自定义登录

vue实现自定义登录

实现自定义登录的基本步骤 在Vue中实现自定义登录功能通常需要结合前端和后端技术。以下是一个基本的实现流程: 创建登录表单组件 使用Vue的单文件组件创建一个登录表单,包含用户名和密码输入框以及提…