【sgUploadImage】自定义组件:基于elementUI的el-upload封装的上传图片、相片组件,适用于上传缩略图、文章封面

sgUploadImage源码

<template>
  <div :class="$options.name">
    <ul class="uploadImages">
      <li
        class="uploadImage"
        v-loading="loadings[i]"
        v-for="(a, i) in imgFiles && imgFiles.length ? imgFiles : 1"
        :key="i"
        @click="(d) => disabled || clickFile(a)"
      >
        <img :src="a" @load="load(a, i)" v-if="typeof a !== 'number'" />
        <el-button
          v-if="showRemoveBtn(a)"
          class="remove-btn"
          type="text"
          icon="el-icon-delete"
          @click.stop="remove(a, i)"
        />
      </li>
    </ul>
    <el-alert
      v-if="alertMsg !== false"
      style="margin-top: 10px"
      :closable="true"
      :close-text="``"
      :description="``"
      :effect="'light'"
      :show-icon="true"
      :title="alertMsg || `最多可上传${limit}个图片,每个附件大小不超过${maxSize}M`"
      :type="'warning'"
    />
    <el-upload
      style="display: none"
      ref="upload"
      :accept="
        accept ||
        `.${$global.resourceTypes.find((v) => v.label == `图片`).suffixs.join(',.')}`
      "
      :action="'#'"
      :auto-upload="false"
      :multiple="true"
      :on-change="change"
      :show-file-list="false"
    />
    <el-image ref="image" style="display: none" src="" :preview-src-list="[previewSrc]" />
  </div>
</template>
<script>
export default {
  name: "sgUploadImage",
  components: {},
  data() {
    return {
      accept: false,
      form: {},
      uploadBtn: null, //上传触发按钮
      disabled: false,
      alertMsg: ``, //如果为false就隐藏提示内容
      limit: 1, //默认只能传1张
      maxSize: 10, //默认最大传10MB的图片
      imgFiles: [], //图像的base64对象数组
      files: [], //图像的File对象数组
      previewSrc: null,
      loadings: [],
    };
  },
  props: ["data"],
  computed: {},
  watch: {
    data: {
      handler(newValue, oldValue) {
        // console.log(`深度监听${this.$options.name}:`, newValue, oldValue);
        if (Object.keys(newValue || {}).length) {
          this.form = JSON.parse(JSON.stringify(newValue));
        } else {
          this.form = {};
        }
        this.disabled = this.form.disabled;
        this.alertMsg = this.form.alertMsg;
        // 获取外部回显上传列表----------------------------------------
        let files =
          typeof this.form.files === `string`
            ? JSON.parse(this.form.files || "[]")
            : this.form.files || [];
        Array.isArray(files) || (files = [files]);
        this.files = files;
        this.files.forEach((v, i) => this.getImageSrc(v, i));
        // ----------------------------------------
        this.form.accept && (this.accept = this.form.accept);
        this.form.limit && (this.limit = this.form.limit);
        this.form.maxSize && (this.maxSize = this.form.maxSize);
        this.$nextTick(() => {
          let width = this.form.width || 200;
          let height = this.form.height || 150;
          this.$el.style.setProperty("--uploadImage_width", `${width}px`);
          this.$el.style.setProperty("--uploadImage_height", `${height}px`);
          this.$el.style.setProperty(
            "--background",
            `url(http://via.placeholder.com/${width}x${height})`
          );
          this.uploadBtn = this.$refs.upload.$children[0].$refs.input;
          this.uploadBtn.webkitdirectory = this.form.webkitdirectory; //让el-upload支持上传文件夹
        });
      },
      deep: true, //深度监听
      immediate: true, //立即执行
    },
  },
  created() {},
  mounted() {},
  destroyed() {},
  methods: {
    load(d, idx) {
      this.$set(this.loadings, idx, false);
    },
    getImageSrc(file, idx = this.files.length - 1) {
      this.$set(this.loadings, idx, true);
      if (file.path) {
        this.imgFiles.push(this.$d.responseFile(file));
      } else {
        this.$g.file2Base64Image(file, (d) => this.imgFiles.push(d));
      }
    },
    showRemoveBtn(d) {
      return !(typeof d === "number");
    },
    remove(d, i) {
      this.files.splice(i, 1);
      this.imgFiles.splice(i, 1);
      this.$emit(`change`, { files: this.files });
    },

    showImage(previewSrc) {
      this.previewSrc = previewSrc;
      this.$refs.image.showViewer = true; //显示大图
    },
    clickFile(d) {
      if (typeof d === "number") {
        this.uploadBtn.click();
      } else {
        this.showImage(d);
      }
    },
    change(file) {
      if (this.files.length >= this.limit) {
        this.$message(`最多只能上传${this.limit}个文件`);
      } else {
        let fileSizeMB = file.size / 1024 / 1024; //转换文件大小(单位MB)
        if (this.maxSize && fileSizeMB > this.maxSize) {
          this.$message(
            `“${file.name}”文件大小超过${this.$g.getSize(this.maxSize * 1024 * 1024)}`
          );
        } else {
          this.files.push(file.raw);
          this.getImageSrc(file.raw);
          this.$emit(`change`, { files: this.files });
        }
      }
    },
  },
};
</script>
<style lang="scss" scoped>
.sgUploadImage {
  .uploadImages {
    display: flex;
    flex-wrap: wrap;
    align-content: flex-start;
    .uploadImage {
      flex-shrink: 0;
      margin-right: 10px;
      margin-bottom: 10px;
      position: relative;
      border-radius: 4px;
      width: var(--uploadImage_width);
      height: var(--uploadImage_height);
      /*背景图片*/
      background: #f5f7fa var(--background) no-repeat center / cover;
      img {
        width: 100%;
        height: 100%;
        object-position: center;
        object-fit: cover;
      }
      &:last-of-type {
        margin-bottom: 0;
      }
      &:hover {
        .remove-btn {
          opacity: 1;
          pointer-events: auto;
        }
      }
      .remove-btn {
        background-color: #f56c6c;
        border-radius: 88px;
        box-sizing: border-box;
        padding: 5px;
        color: white;
        cursor: pointer;
        transition: 0.2s;
        position: absolute;
        right: 10px;
        top: 10px;
        opacity: 0;
        pointer-events: none;
        &:hover {
          background-color: red;
        }
      }
    }
  }
}
</style>

应用

<sgUploadImage @change="getUploadFiles" />


...


getUploadFiles({ files }) {
    console.log(`获取上传文件:`, files);
},

基于基础的el-upload组件使用【实用的代码片段】基于elementUI的el-upload的上传文件对象获取代码片段,支持上传单个、多个File或文件夹(可以获取文件夹下钻子文件夹递归文件)-CSDN博客文章浏览阅读133次,点赞5次,收藏2次。文章浏览阅读192次。【代码】【sgUploadList】自定义组件:基于elementUI的el-upload封装的上传列表组件,适用于上传附件时。【sgUploadList】自定义组件:基于elementUI的el-upload封装的上传列表组件,适用于上传附件时-CSDN博客。https://blog.csdn.net/qq_37860634/article/details/144338242

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/933595.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NAT traversal 原理 | TCP / UDP/ P2P

注&#xff1a;本文为 “NAT traversal ”相关的几篇文章合辑。 未整理去重。 NAT 穿越技术原理 Li_yy123 于 2020-12-08 18:54:26 发布 一、NAT 由来 为了解决全球公有 IPv4 的稀缺&#xff0c;提出了 NAT 技术。NAT 是 Network Address Translation 网络地址转换的缩写。 …

算法日记(2024.12.09)

1.二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2 …

js:事件监听

事件监听 事件监听&#xff1a;让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就调用一个函数做出响应&#xff0c;也称为绑定事件或注册事件 事件&#xff1a;编程系统内发生的动作或发生的事情 比如用户单击一个按钮下拉菜单 添加事件监听 事件监听三要…

Linux驱动开发(12):中断子系统–按键中断实验

本章我们以按键为例讲解在驱动程序中如何使用中断&#xff0c; 在学习本章之前建议先回顾一下关于中断相关的裸机部分相关章节&#xff0c; 这里主要介绍在驱动中如何使用中断&#xff0c;对于中断的概念及GIC中断控制器相关内容不再进行讲解。 本章配套源码和设备树插件位于“…

距离与AoA辅助的三维测距算法,适用于自适应基站数量的情况。订阅专栏后可直接查看完整源代码

本MATLAB 代码实现了一个基于距离与到达角(AoA)的三维测距系统,主要用于在动态环境中估计目标物体的位置。提供本算法与仅侧角(AoA)的定位误差对比 文章目录 代码运行结果源代码代码功能概述主要步骤分析初始化部分AOA定位绘图部分输出部分代码的应用和意义总结代码运行结…

解决社区版IDEA新建项目没有Spring Initializr 选项 2023.2版本

方法一 1.打开Preference 2.选择Plugins插件管理&#xff0c;并安装Spring Boot Helper&#xff08;选择marketplace -> install -> 安装后勾选&#xff09; 3.重启restart后打开IDEA&#xff0c;有spring initializr选项 结束。 参考 https://blog.csdn.net/qq_2…

计算机键盘简史 | 键盘按键功能和指法

注&#xff1a;本篇为 “计算机键盘简史 | 键盘按键功能和指法” 相关文章合辑。 英文部分机翻未校。 The Evolution of Keyboards: From Typewriters to Tech Marvels 键盘的演变&#xff1a;从打字机到技术奇迹 Introduction 介绍 The keyboard has journeyed from a humb…

基于单片机的空调温度控制器设计

摘 要 随着国民经济的发展和人民生活水平的提高&#xff0c;空调已被广泛应用于社会的各种场合。空调因具有节能、低噪、恒温控制、全天候运转、启动低频补偿、快速达到设定温度等性能&#xff0c;大大提高了其舒适性&#xff0c;得到越来越多的人们的喜爱。单片机和数字温度传…

【慕伏白教程】Zerotier 连接与简单配置

文章目录 下载与安装WindowsLinuxapt安装官方脚本安装 Zerotier 配置新建网络网络配置 终端配置WindowsLinux 下载与安装 Windows 进入Zerotier官方下载网站&#xff0c;点击下载 在下载目录找到安装文件&#xff0c;双击打开后点击 Install 开始安装 安装完成后&#xff0c;…

DDR的跨4K问题

参考视频&#xff1a;【深入理解FPGA底层逻辑】、4k边界和outsdanding_哔哩哔哩_bilibili 1、AXI4_FULL突发写一个字节是一个地址&#xff0c; 2、协议规定&#xff0c;把AXI4从机的地址区间从0进行到了4095....每4K进行一次分配 所以突发长度的计算如下&#xff1a; 另外AX…

Spark on Yarn安装配置,大数据技能竞赛(容器环境)

Spark on Yarn模式&#xff0c;即把Spark作为一个客户端&#xff0c;将作业提交给Yarn服务&#xff0c;由于在生产环境中&#xff0c;很多时候都要与Hadoop使用同一个集群&#xff0c;因此采用Yarn来管理资源调度&#xff0c;可以有效提高资源利用率。 环境说明&#xff1a; 服…

OSI模型及各层缺陷

1&#xff0e;TCP/IP概述 &#xff08;1&#xff09;TCP/IP基本结构 TCP/IP是一组Internet协议&#xff0c;不但包括TCP和IP两个关键协议&#xff0c;还包括其他协议&#xff0c;如UDP、ARP、ICMP、Telnet和FTP等。TCP/IP的设计目标是使不同的网络互相连接&#xff0c;即实现互…

C/C++流星雨

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C/C…

Google Cloud Platform云架构设计要点

在设计GCP&#xff08;Google Cloud Platform&#xff09;云架构时&#xff0c;有几个关键要点需要考虑&#xff0c;以确保系统的高效性、可扩展性和安全性。以下是一些重要的设计要点&#xff1a; 需求分析&#xff1a; 在开始设计之前&#xff0c;明确业务需求、性能需求、预…

Amazon SageMaker 和 Amazon Bedrock 有什么区别

Amazon SageMaker 和 Amazon Bedrock 有什么区别 文章目录 Amazon SageMaker 和 Amazon Bedrock 有什么区别1.服务定位和主要功能区别Amazon SageMakerAmazon Bedrock 2. 适用场景Amazon SageMakerAmazon Bedrock 3. 用户群体Amazon SageMakerAmazon Bedrock 4. 开发和部署流程…

在AWS上可以使用什么和人工智能相关的服务?

在人工智能技术飞速发展的今天&#xff0c;如何高效、安全地构建和部署AI模型&#xff0c;成为了众多开发者和企业关注的焦点。为此&#xff0c;亚马逊推出了 Amazon Bedrock——一个专为构建、训练和扩展大规模生成性AI应用而设计的平台。今天&#xff0c;我们九河云就来和大家…

Redis实战篇(一:项目导入和短信登录)

目录 一、实战内容概述 1.导入 SQL 2.有关当前模型 3.导入后端项目 4.导入前端项目 二、短信登录 1.基于 Session 实现登录流程 2.实现发送短信验证码 3.实现短信验证码登录和注册 4.实现登录校验功能 5.隐藏用户敏感信息 6.集群的 session 共享问题 7.Redis 替代…

国际荐酒师Peter助力第六届地博会,推动地理标志产品国际化发展

国际荐酒师Peter Lisicky助力第六届知交会暨地博会&#xff0c;推动地理标志产品国际化发展 第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会于2024年12月9日至11日在中新广州知识城盛大举行&#xff0c;吸引了全球众多行业专家、企业代表及相关机构齐聚一…

vue自定义弹窗点击除了自己区域外关闭弹窗

这里使用到vue的自定义指令 <div class"item" v-clickoutside"clickoutside1"><div click"opencity" class"text":style"{ color: popup.iscitypop || okcitylist.length ! 0 ? #FF9500 : #000000 }">选择地区…

2024 年 11 月区块链游戏研报:牛市加持下的 GameFi 破局之路

2024 年 11 月区块链游戏研报 作者&#xff1a;Stella L (stellafootprint.network) 数据来源&#xff1a;Footprint Analytics 区块链游戏 Research 页面 2024 年 11 月 Web3 游戏行业市场增长显著但大规模采用策略仍在演进。随着比特币创下历史新高并接近 10 万美元里程碑…