浅谈基于vue3+element二次封装el-upload组件

闲话少说,先上二次封装el-upload代码

<template>
  <div>
    <el-upload
      class="upload-demo"
      ref="uploadImgRef"
      action="#"
      :show-file-list="false"
      :auto-upload="false"
      accept=".png, .jpg, .gif"
      :on-change="changeFile"
    >
      <img v-if="fileUrl" class="img-class" :src="fileUrl" alt="">
      <el-button type="primary">选择文件</el-button>
    </el-upload>
  </div>
</template>

<script lang="ts" setup>
import { ref, watch } from "vue";
import { ElMessage } from "element-plus";
import type { UploadFile, ElUpload } from "element-plus";

const props = defineProps({
  url: {
    type: String,
    default: ''
  }
})

const emits = defineEmits<{
  (e: "handleUpload", uploadFile: UploadFile, url: string): void;
}>();

const acceptedTypes = ['image/png', 'image/jpeg', 'image/gif']
const fileUrl = ref<string>('')
const uploadImgRef = ref<InstanceType<typeof ElUpload> | null>(null);

// 监听的作用,当用户编辑图片时,将图片展示再页面上
watch(() => props.url, (val) => {
  fileUrl.value = val
}, { immediate: true })

// 添加上传文件
const changeFile = async (file: UploadFile) => {
  const isAccepted = acceptedTypes.includes(file?.raw?.type as string)
  if (!isAccepted) { // 校验图片格式
    ElMessage.warning('上传的图片格式不符,请核查后重新上传,谢谢!')
  } else  if (file.size && file.size > 1 * 1024 * 1024) { // 校验图片大小
    ElMessage.warning('图片大小不能超过1M,请核查后重新上传,谢谢!')
  } else {
      await checkResolution(file.raw) // 校验图片分辨率
      fileUrl.value = file.raw ? window.URL.createObjectURL(file.raw) : ''
      emits("handleUpload", file, fileUrl.value);
  }
};

// 校验图片分辨率为500*500
const checkResolution = (file: any) => {
  return new Promise((resolve, reject) => {
    const image = new Image()
    image.src = URL.createObjectURL(file)
    image.onload = () => {
      const width = image.width;
      const height = image.height;
      if (width === 500 && height === 500) {
        resolve(file)
      } else {
        ElMessage.warning('图片分辨率不符合要求,请核查后重新上传,谢谢!')
        // reject('图片分辨率不符合要求')
      }
    }
  })
}

const handleClear = () => {
  uploadImgRef.value?.clearFiles();
};

defineExpose({
  // uploadImgRef,
  handleClear,
});
</script>

<style lang="scss" scoped>
p {
  margin: 0;
  padding: 0;
  color: red;
}

.img-class {
  width: 100px;
  height: 100px;
  margin-right: 20px;
}

:deep(.el-upload) {
  display: flex;
  align-items: center;
  justify-content: left;
}
</style>

 注意:1.当设置“auto-upload”为false时,beforeUpload、onSuccess、before-upload、on-success都不会触发,此时只会触发on-change;

        2.当设置“limit”为1时,on-change之后触发一次,on-change会随 limit 改变而改变,另外,当上传的文件超过limit时,会触发on-exceed方法;

  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于el-upload二次封装,你可以按照以下步骤进行: 1. 创建一个新的组件,例如UploadWrapper.vue。 2. 在UploadWrapper.vue中引入el-upload组件: ```javascript <template> <el-upload></el-upload> </template> <script> import { Upload } from 'element-ui'; export default { components: { 'el-upload': Upload }, } </script> ``` 3. 在UploadWrapper.vue中,将el-upload的props和事件传递给封装组件: ```javascript <template> <el-upload :action="action" :headers="headers" :data="data" :file-list="fileList" :multiple="multiple" :before-upload="beforeUpload" :on-success="onSuccess" :on-remove="onRemove" ></el-upload> </template> <script> // ... export default { // ... props: { action: String, headers: Object, data: Object, fileList: Array, multiple: Boolean }, methods: { beforeUpload(file) { this.$emit('before-upload', file); }, onSuccess(response, file, fileList) { this.$emit('on-success', response, file, fileList); }, onRemove(file, fileList) { this.$emit('on-remove', file, fileList); } } } </script> ``` 4. 在父组件中使用封装组件UploadWrapper.vue: ```javascript <template> <upload-wrapper :action="action" :headers="headers" :data="data" :file-list="fileList" :multiple="multiple" @before-upload="beforeUpload" @on-success="onSuccess" @on-remove="onRemove" ></upload-wrapper> </template> <script> import UploadWrapper from './UploadWrapper.vue' export default { components: { 'upload-wrapper': UploadWrapper }, data() { return { action: 'your-action-url', headers: { // headers配置 }, data: { // 请求携带的额外参数 }, fileList: [], // 文件列表 multiple: true // 是否支持多选 } }, methods: { beforeUpload(file) { // 文件上传前的操作 }, onSuccess(response, file, fileList) { // 文件上传成功的操作 }, onRemove(file, fileList) { // 文件移除的操作 } } } </script> ``` 这样,你就完成了el-upload二次封装。在父组件中,通过props传入el-upload的配置项和事件,并在UploadWrapper组件中进行处理和触发相应的事件。同时可以根据需要自定义一些额外的功能和样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值