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为实际的文件上传地址。

Element UI 的 Upload 组件提供了一种方便的方式来实现文件上传功能。如果你想自定义上传进度条和添加“正在上传”的提示,你可以通过覆盖默认样式并监听上传事件来实现。这里是一个简单的步骤说明: 1. 首先,在 Vue 文件中导入 Upload 组件Element UI 主题样式,如果还没引入,可以这样做: ```html <template> <el-upload :action="uploadUrl" :before-upload="beforeUpload" :on-progress="handleProgress" :on-error="handleError" :show-file-list="false" :auto-upload="true"> <i class="el-icon-upload"></i> <div slot="tip">点击上传</div> </el-upload> </template> ``` 2. 然后,在组件的 methods 中,编写处理上传状态的方法: ```javascript import { Loading } from &#39;element-plus&#39;; data() { return { loading: new Loading({ fullscreen: true }), // 创建一个全屏加载动画 }; }, methods: { beforeUpload(file) { this.loading.show(); // 显示加载动画 // 这里可以添加你的验证逻辑,如文件大小、格式等 return true; }, handleProgress(progress) { // 更新进度条,比如百分比 let percent = Math.round((progress.loaded / progress.total) * 100); this.$refs.myLoading.setProgress(percent); // 如果你的进度条有自己的引用 if (percent === 100) { this.$message.success(&#39;上传完成&#39;); this.loading.hide(); // 隐藏加载动画 } }, handleError(err) { console.error(&#39;上传错误&#39;, err); this.loading.hide(); }, }, ``` 注意 `myLoading` 是你自定义进度条组件的引用,如果没有,你需要创建一个,并在模板上绑定到 `ref` 属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值