VUE3+Element Plus `Upload`组件 实现自定义上传=进度条

<template>
  <el-upload
    class="upload-demo"
    action=""
    :http-request="uploadFile"
    :on-progress="handleProgress"
    :on-success="handleSuccess"
    :on-error="handleError"
  >
    <el-button slot="trigger" type="primary">选取文件</el-button>
    <div slot="tip" class="el-upload__tip">
      只能上传jpg/png文件,且不超过500kb
    </div>
  </el-upload>
  <div v-if="progress > 0">
    上传进度:{{ progress }}%
  </div>
</template>

<script setup>
import { ref } from 'vue';
import axios from 'axios';

const progress = ref(0);

const uploadFile = async ({ file, onProgress, onSuccess, onError }) => {
  const formData = new FormData();
  formData.append('file', file);

  try {
    const response = await axios.post('your-upload-url', formData, {
      onUploadProgress: event => {
        const percentCompleted = Math.round((event.loaded * 100) / event.total);
        onProgress({ percent: percentCompleted });
      }
    });

    onSuccess(response.data);
  } catch (error) {
    onError(error);
  }
};

const handleProgress = event => {
  progress.value = event.percent;
};

const handleSuccess = () => {
  progress.value = 0;
  // 显示成功消息
  console.log('上传成功');
};

const handleError = () => {
  progress.value = 0;
  // 显示错误消息
  console.error('上传失败');
};
</script>

<style>
.upload-demo {
  margin: 20px;
}
</style>

说明

  • 响应式数据:使用ref来创建响应式变量progress,来跟踪和显示上传进度。

  • 自定义上传功能uploadFile方法中使用axios库进行文件上传,并结合onProgress回调来更新上传进度。

  • 响应式更新:通过progress.value来获取和更新上传的进度信息,这样当进度改变时,视图会自动响应变化。

请确保你在项目中安装了axios库,并根据需求修改your-upload-url为实际的文件上传地址。

<< 在 Vue3Element Plus 中使用 `el-upload` 组件上传文件并展示进度条是一个常见的需求。以下是如何实现的具体步骤: ### 实现步骤 #### 1. 安装依赖 确保已安装 Vue3Element Plus,如果未安装可以通过以下命令完成: ```bash npm install element-plus ``` #### 2. 引入组件 在项目中引入 `ElUpload` 或者完整地按需加载 Element Plus。 ```javascript // main.js import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; import ElementPlus from &#39;element-plus&#39;; import &#39;element-plus/dist/index.css&#39;; const app = createApp(App); app.use(ElementPlus);app.mount(&#39;#app&#39;); ``` #### 3. 使用 el-upload 展示进度条 `el-upload` 提供了 `on-progress` 钩子方法用于监听上传过程中的进度变化,结合 `percentage` 参数可以在 UI 上显示上传百分比。 ```vue <template> <div> <!-- 文件上传 --> <el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/posts/" :on-progress="handleProgress" :before-upload="beforeAvatarUpload"> <el-button type="primary">点击上传</el-button> <template #tip> <div class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> </template> </el-upload> <!-- 进度条 --> <el-progress v-if="progressPercent > 0" :percentage="progressPercent"></el-progress> </div> </template> <script> export default { data() { return { progressPercent: 0, // 当前上传进度 }; }, methods: { handleProgress(event) { this.progressPercent = parseInt(event.percent); // 更新进度值 }, beforeAvatarUpload(file) { const isJPGorPNG = file.type === "image/jpeg" || file.type === "image/png"; const isLt500K = file.size / 1024 < 500; if (!isJPGorPNG) { this.$message.error("仅支持上传 JPG/PNG 格式的图片!"); } if (!isLt500K) { this.$message.error("上传头像图片大小不能超过 500KB!"); } return isJPGorPNG && isLt500K; }, }, }; </script> <style scoped> .upload-demo { margin-bottom: 20px; } </style> ``` #### 关键点解释 - **action**: 设置为服务器端接收上传请求的地址。 - **on-progress**: 在每次上传进度发生变化时触发,参数包含当前的百分比信息。 - **before-upload**: 可对上传之前的文件进行校验或预处理操作(如检查类型和大小)。 --- ### 总结 以上代码展示了如何通过 `el-upload` 结合 `el-progress` 来监控文件上传状态,并实时更新进度条---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值