Vue3 + Element Plus 手动批量上传文件组件详解

在Web应用中,文件上传是一项常见但重要的功能。Vue3结合Element Plus框架可以轻松实现文件上传,并提供良好的用户体验。本篇文章将详细介绍如何使用Vue3和Element Plus构建一个手动触发的批量文件上传组件。

技术栈
  • 前端框架: Vue3
  • UI库: Element Plus
完整代码
<template>
  <div class="app-container">
    <el-upload ref="uploadRef" multiple action="" accept=".xls, .xlsx" :show-file-list="true" :auto-upload="false" :http-request="uploadFile">
      <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
      <div class="tips">支持格式:.xls, .xlsx;大小不超过10MB。</div>
    </el-upload>
    <div class="operation-btn">
      <el-button size="small" type="success" @click="submitUpload">确定</el-button>
    </div>
  </div>
</template>

<script>
import { nextTick, onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'

export default {
  name: 'UploadFiles',
  setup() {
    const uploadFileList = ref([])
    const uploadRef = ref(null)

    function uploadFile({ file }) {
      const fileName = file.name
      const fileNameArray = fileName.split('.')
      let fileType = ''
      if (fileNameArray.length > 0) {
        fileType = fileNameArray[1]
      }
      const checkType = (fileType === 'xls' || fileType === 'xlsx')
      const fileSize = file.size / 1024 / 1024
      if (!checkType) {
        ElMessage.error('只允许上传.xls、.xlsx格式的文件')
        return
      }
      if (fileSize > 10) {
        ElMessage.error('上传文件大小不能超过 10MB!')
        return
      }
      uploadFileList.value.push(file)
    }

    function submitUpload() {
      // 触发上传操作
      ctx.emit('emitUploadFiles', uploadFileList.value)
      nextTick(() => {
        uploadRef.value.clearFiles()
        uploadFileList.value = []
      })
    }

    onMounted(() => {
      uploadFileList.value = []
    })

    return {
      uploadFileList,
      uploadFile,
      submitUpload,
      uploadRef
    }
  }
}
</script>

<style scoped>
.app-container :deep(.el-upload) {
  text-align: left;
}

.tips {
  color: red;
  text-align: left;
  font-size: 12px;
}

.operation-btn {
  width: 100%;
  text-align: center;
  height: 48px;
  line-height: 48px;
}
</style>

使用组件

现在,你可以在任何父组件中使用uploadFiles组件。

<upload-files @emitUploadFiles="submitUpload" />
function submitUpload(files) {
      const formData = new FormData()
      files.forEach((file) => {
        formData.append('files', file)
      })
      // 这里写你的上传逻辑或者请求接口
    }
步骤详解

1. 模板结构

  • 文件选择按钮 (<el-button slot="trigger">): 用于触发文件选择对话框。
  • 文件列表展示 (:show-file-list="true"): 显示已选择的文件列表。
  • 文件类型限制 (accept=".xls,.xlsx"): 限制只能选择.xls.xlsx格式的文件。
  • 手动上传开关 (:auto-upload="false"): 关闭自动上传功能。
  • 文件上传方法 (:http-request="uploadFile"): 自定义文件上传逻辑。

2. 文件选择逻辑

  • 文件验证 (uploadFile):
    • 分割文件名获取扩展名。
    • 验证文件类型是否为.xls.xlsx
    • 验证文件大小是否小于10MB。
    • 如果验证失败,则显示错误消息。
    • 如果验证成功,则将文件添加到uploadFileList数组中。

3. 文件上传逻辑

  • 上传按钮 (@click="submitUpload"): 触发文件上传操作。
  • 提交上传 (submitUpload):
    • 通知父组件执行文件上传,并向父组件传递文件列表
    • ctx.emit('emitUploadFiles', uploadFileList.value)
    • 清空文件列表(uploadRef.value.clearFiles()uploadFileList.value = [])。

总结

通过以上步骤,我们实现了基于Vue3和Element Plus的手动批量文件上传组件。该组件支持批量选择.xls.xlsx文件,并在用户确认后手动上传这些文件。你可以根据自己的需求进一步扩展此组件的功能,例如添加文件预览、上传进度条等功能。

对于Element Plus文件上传,你可以使用`el-upload`组件来实现。下面是一个简单的示例代码: ```html <template> <el-upload action="https://www.example.com/upload" :on-success="handleSuccess" :before-upload="beforeUpload" > <el-button slot="trigger" size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过2MB</div> </el-upload> </template> <script> export default { methods: { handleSuccess(response, file, fileList) { // 文件上传成功的回调函数 console.log(response); }, beforeUpload(file) { // 文件上传前的钩子函数 const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG) { this.$message.error('只能上传 JPG/PNG 格式的图片'); } if (!isLt2M) { this.$message.error('图片大小不能超过 2MB'); } return isJPG && isLt2M; }, }, }; </script> ``` 在上面的示例中,`el-upload`组件通过`action`属性指定了文件上传的接口地址。通过`on-success`属性可以指定文件上传成功后的回调函数,你可以在这个函数中处理上传成功后的逻辑。`before-upload`属性可以定义文件上传前的钩子函数,你可以在这个函数中校验文件的类型和大小。 需要注意的是,示例中的代码是基于Vue.jsElement Plus框架编写的,你需要确保在项目中已经引入了Vue.jsElement Plus。另外,需要替换`action`属性的值为你实际的文件上传接口地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端学步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值