当前位置: 首页 > news >正文

基于elementPlus的el-upload的二次封装组件

基于vue3,elementPlus的el-upload的二次封装组件,支持多传 数量控制

upload.vue

<template>
  <!-- 2022/8/29 Carter -->
  <el-upload
    v-model:file-list="fileLists"
    :action="actionUrl"
    :limit="limit"
    :disabled="disabled"
    list-type="picture-card"
    :auto-upload="true"
    :multiple="false"
    :accept="accept"
    :on-preview="handlePictureCardPreview"
    :on-remove="handleRemove"
    :http-request="httpRequest"
    :class="{ limitOpctin: limit === fileLists.length }"
  >
    <el-icon><Plus /></el-icon>
  </el-upload>

  <el-dialog v-model="dialogVisible">
    <img style="width: 90%" w-full :src="dialogImageUrl" alt="图片预览" />
  </el-dialog>
</template>

<script setup>
/**
 * @desc 封装 element UI el-upload
 * @param {fileLists} [v-model] - 双向绑定的值
 * @param {Number} [limit] [v-bind]- 上传个数限制
 * @param {String} [accept] [v-bind]- 上传后缀的限制
 * @param {disabled} [Boolean] [v-bind]- 是否禁用
 * @example <UpLoad :limit='1' v-model:fileLists='ruleForm.fileLists' accept='image/png,image/jpg'/>
 */
import { ref, onMounted } from 'vue'
import { Plus, Delete, ZoomIn } from '@element-plus/icons-vue'
import { config } from '@/assets/js/config'
const props = defineProps({
  limit: {
    type: Number,
    default: 1
  },
  accept: {
    type: String,
    default: 'image/png,image/jpeg,image/gif,image/jpg'
  },
  fileLists: {
    type: Array,
    default: [],
    required: true
  },
  disabled: {
    type: Boolean,
    default: false
  }
})
const infoList = ref([])

const dialogImageUrl = ref('')
const percent = ref(0)
const actionUrl = ref('#')
const dialogVisible = ref(false)
const emit = defineEmits(['update:fileLists'])
onMounted(() => {
  infoList.value = props.fileLists || []
})

const handleRemove = uploadFile => {
  infoList.value.forEach((v, i) => {
    if (v.uid == uploadFile.uid) {
      infoList.value.splice(i, 1)
    }
  })
  emit('update:fileLists', infoList.value)
}

const handlePictureCardPreview = uploadFile => {
  dialogImageUrl.value = uploadFile.url
  dialogVisible.value = true
}

const httpRequest = async params => {
  const file = params.file
  // 文件名(8位随机数):zokcutz4.jpg
  const fileName =
    Math.random().toString(36).substr(-8) +
    file.name.substr(file.name.lastIndexOf('.'))

  // 目录加文件名【上线前修改目录名】
  const fileSrc = `test20220824/${fileName}`
  try {
    params.onProgress({ percent: 0 })
   //上传的自定义逻辑都在这里

    infoList.value = [
      ...infoList.value,
      {
        uid: file.uid,
        name: file.name,
        url: `${config.awsUrl}${res.key}`
      }
    ]
    // console.log(`上传成功 ${res.key}`)
    emit('update:fileLists', infoList.value)
    params.onSuccess()
  } catch (err) {
    console.log(err, 'err')

    ElMessage.error('网络错误,请稍后重试')
    params.onError()
  }
}
</script>

<style lang="scss" scoped>
.limitOpctin :deep(.el-upload--picture-card) {
  display: none !important;
}
</style>

页面使用

<template>
  <!-- 2022/8/30 Carter 页面 -->
  <el-form
    ref="ruleFormRef"
    :model="ruleForm"
    :rules="rules"
    label-width="140px"
    class="demo-ruleForm"
    size="default"
    status-icon
  >

    <el-form-item label="上传背景图" prop="bgLists">
     <!-- 上传使用 -->
      <UpLoad
        v-model:fileLists="ruleForm.bgLists"
        accept="image/png,image/jpg,image/gif"
      />
      <div style="width: 500px">支持的图片格式为PNG,JPG,GIF</div>
    </el-form-item>
    <el-form-item label="上传图片" prop="fileLists">
      <UpLoad
        v-model:fileLists="ruleForm.fileLists"
        accept="image/png,image/jpg,image/gif"
      />
      <div style="width: 500px">支持的图片格式为PNG,JPG,GIF</div>
    </el-form-item>
  </el-form>

</template>
<script setup>
import UpLoad from '@/components/form/upload.vue'
</script>

在这里插入图片描述

相关文章:

  • 肾囊肿有哪些异常症状表现?
  • 适合学生用的蓝牙耳机哪款好?学生党无线蓝牙耳机推荐
  • 如何在linux系统上部署皕杰报表
  • 万魔和南卡蓝牙耳机哪款比较好用?万魔和南卡A2蓝牙耳机对比测评
  • 收藏:不能不刷的数字后端面试题,含解析
  • uniapp 小程序单页面设置横屏
  • 【Spring Cloud】新闻头条微服务项目:引入ElasticSearch建立文章搜索索引
  • 深度学习之文本分类 ----FastText
  • ITE IT6604E/AX HDMI1.4 接收器
  • openCV实践项目:拖拽虚拟方块
  • Java线程通信的简介说明
  • 对JavaBean的特点写法与实战心得详解
  • 【手写算法实现】 之 朴素贝叶斯 Naive Bayes 篇
  • Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第12章 Vue3.X新特性解析 12.12 响应式系统工具集的使用
  • java服务器端开发-servlet:202、Servlet执行过程介绍:get请求与post请求、编码相关等
  • [译]如何构建服务器端web组件,为何要构建?
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 5、React组件事件详解
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Hibernate【inverse和cascade属性】知识要点
  • Map集合、散列表、红黑树介绍
  • Markdown 语法简单说明
  • mysql innodb 索引使用指南
  • MySQL主从复制读写分离及奇怪的问题
  • Python学习笔记 字符串拼接
  • SAP云平台里Global Account和Sub Account的关系
  • spring security oauth2 password授权模式
  • 记一次删除Git记录中的大文件的过程
  • 什么是Javascript函数节流?
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 自动记录MySQL慢查询快照脚本
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)计算机毕业设计大学生兼职系统
  • (简单) HDU 2612 Find a way,BFS。
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十三)Maven插件解析运行机制
  • (原)本想说脏话,奈何已放下
  • (转)Google的Objective-C编码规范
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • ... 是什么 ?... 有什么用处?
  • .cn根服务器被攻击之后
  • .net CHARTING图表控件下载地址
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Project Open Day(2011.11.13)
  • .Net Web窗口页属性
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @media screen 针对不同移动设备
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)