iview中基于upload源代码组件封装更为完善的上传组件

业务背景

  • 最近接了一个用iview为基础搭建的vue项目,在开需求研讨会议的时候,我个人提了一个柑橘很合理且很常规的建议,upload上传文件支持同时上传多个并且可限制数量。当时想的是这不应该很正常吗,但是尴尬的是:只有multiple 开启选项,并无limit属性。

初始解决问题的思路

  1. 通过业务代码来控制
    • 但是尴尬的是,搞了三个小时硬是没有成功解决这个问题
  2. 引入第三方插件
    • 这个感觉是最简单的方案了,但是这好像不是我的风格,为了一个小功能点去引入一个插件。
    • 直接放弃
  3. 修改源代码
    • 这是当发现我通过业务代码无法解决问题后的常规想法

如何修改源代码呢

  • 幸好,在不久的半年前我手撸过element uiupload源代码,二者结合一下吧,让iview适当抄袭下element ui

element ui 源代码里的 upload 组件限制上传数量代码如何实现的呢?

  1. 在props里定义了limit接收字段,
    在这里插入图片描述

  2. 在input type="file"的 on-change 事件里调用的 uploadFiles 方法中做好 数量限制的逻辑判断

uploadFiles 整体函数代码

 uploadFiles(files) {
      if (this.limit && this.fileList.length + files.length > this.limit) {
        this.onExceed && this.onExceed(files, this.fileList);
        return;
      }

      let postFiles = Array.prototype.slice.call(files);
      if (!this.multiple) { postFiles = postFiles.slice(0, 1); }

      if (postFiles.length === 0) { return; }

      postFiles.forEach(rawFile => {
        this.onStart(rawFile);
        if (this.autoUpload) this.upload(rawFile);
      });
    },

核心代码

if (this.limit && this.fileList.length + files.length > this.limit) {
    this.onExceed && this.onExceed(files, this.fileList);
    return;
}

具体逻辑

  • 当前文件列表的长度 + 这次上传的文件长度 > 总计限制的数量
  • 即抛出异常,并拦截

iview 如何实现的呢?并且有什么问题呢

  1. 压根就没有传入limt限制最大上传数量字段
  2. 没有传入数量超出异常回调函数
  3. uploadFiles 方法并没有 进行
    • 当前文件列表的长度 + 这次上传的文件长度 > 总计限制的数量,- 即抛出异常,并拦截 的逻辑处理
  4. 没有将次此上传的多个文件列表抛出到调用的业务组件,故无法通过业务层拦截
    • 而是将文件列表循环一个个依次抛出
    • 直接导致了iview 内部的 upload件底层没有做最大数量的拦截、同时也无法通过业务层代码进行拦截,

核心代码

handleChange (e) {
    const files = e.target.files;

    if (!files) {
        return;
    }
    this.uploadFiles(files);
    this.$refs.input.value = null;
},
uploadFiles (files) {
    let postFiles = Array.prototype.slice.call(files);
    if (!this.multiple) postFiles = postFiles.slice(0, 1);

    if (postFiles.length === 0) return;

    postFiles.forEach(file => {
        this.upload(file);
    });
},

核心问题代码

少了

if (this.limit && this.fileList.length + files.length > this.limit) {
    // 异常逻辑处理 建议从调用的业务代码定义好异常逻辑传入并且调用
}

完整逻辑

uploadFiles (files) {
    if (this.limit && this.fileList.length + files.length > this.limit) {
    // 异常逻辑处理 建议从调用的业务代码定义好异常逻辑传入并且调用
    }
    let postFiles = Array.prototype.slice.call(files);
    if (!this.multiple) postFiles = postFiles.slice(0, 1);

    if (postFiles.length === 0) return;

    postFiles.forEach(file => {
        this.upload(file);
    });
},

问题已经找到了,但是如何接入业务代码项目中呢

考虑方案

  • 直接改node_modules中源代码
    • 不建议,直接否定 ,理由如下
      • 在node_modules中源代码后需要,其他成员更新node_modules中源代码
      • 无法提交到git中,因为不可能将node_modules放到git上
      • 后期更新插件版本就会替换整个文件夹
      • 直接否定
  • 修改插件代码后放到私有服务器
    • 不建议,直接否定,理由如下
      • 后期插件版本升级了,如果想使用高版本的iview组件库,只能直接覆盖代码
      • 接入私服后,安装依赖只能在内网,极其不方便
  • 直接从iview组件库的upload组件中捞一份 upload的源代码,然后再新的文件中修改
    • 最优解
      • 以上问题都不会有
      • 可扩展性强,且不会影响其他逻辑

如何调用组件

  • 封装好组件后,直接调用
  • 同时传递,limit(限制数量),以及数量超出的执行异常回调函数即可

致谢

  • 感谢项目组给予我挑战自己的机会
  • 感谢iview写出了让我感到诧异的bug
    传递,limit(限制数量),以及数量超出的执行异常回调函数即可

致谢

  • 感谢项目组给予我挑战自己的机会
  • 感谢iview写出了让我感到诧异的bug
  • 感谢element ui 的完美源代码给予了我学习和参考并实践的机会

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

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

相关文章

YZ系列工具之YZ10:VBA_梦幻图像

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套一部VBA手册,教程分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的…

一分钟成为点灯大师(超简单1行代码-STM32F407的HAL实现按键中断方式点亮LED灯)

一、开发环境 硬件:正点原子探索者 V3 STM32F407 开发板 单片机:STM32F407ZGT6 Keil版本:5.32 STM32CubeMX版本:6.9.2 STM32Cube MCU Packges版本:STM32F4 V1.27.1 使用STM32F407的HAL库实现按键中断方式读取按键…

HCF-Net:用于红外小目标检测的分层上下文融合网络

摘要 红外小目标检测是一项重要的计算机视觉任务,涉及在红外图像中识别和定位微小物体,这些物体通常仅包含几个像素。然而,由于物体尺寸极小以及红外图像中通常复杂的背景,这项任务面临困难。在本文中,我们提出了一种…

【漏洞复现】魔方网表mailupdate.jsp接口存在任意文件上传漏洞

漏洞描述 魔方网表帮助其搭建了支持信创环境的端到端的一站式数据智能填报系统,实现数据收集模板个性化定义,收集任务集中管控,结构化数据存储、分析及呈现等功能。魔方网表mailupdate.jsp接口存在任意文件上传漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当…

Tomcat源码解析——类加载机制

一、类加载器的创建 在之前的Tomcat启动源码中,简单的介绍了Tomcat的四种类加载器,再复习一遍。 类加载器 作用父加载器commonLoader(共同类加载器)加载$CATALINA_HOME/lib下的类加载器应用类加载器catalinaLoader(容器…

CAD小软件diy-读柴油机壳体装配图

读取一个柴油机壳体dxf图纸,一般这种装配体轮廓曲线都是用直线和圆弧拟合的,全部都是显示的白色实现,发现有线段间隙,拖动线段补上间隙。 这个测试放在蓝奏云上面 https://wwf.lanzout.com/ip1Xx1vvhbkh

08 SQL进阶 -- 集合运算 -- 表的连结(JOIN)

1. 连结(JOIN) 前一节我们学习了 UNION和INTERSECT 等集合运算, 这些集合运算的特征就是以行方向为单位进行操作. 通俗地说, 就是进行这些集合运算时, 会导致记录行数的增减。使用 UNION 会增加记录行数,而使用 INTERSECT 或者 EXCEPT 会减少记录行数。 但这些运算不能改变…

张大哥笔记:到底什么是轻创业?怎么才叫轻创业

大家好,我是张大哥,我在公众号反复强调,个人创业尽量去选择轻资产项目,要么不创业,要么轻创业!到底什么是轻创业?怎么才叫轻创业呢,本问为你揭晓: 刚开始创业&#xff0c…

nginx--Nginx转发真实的IP

Nginx转发真实的IP 前言给nginx.conf 设置proxy_set_headerjava 程序里获取 前言 在使用nginx的时候可能会遇到判断是不是本机在做操作,这样的话web端我们是可以通过ip和端口进行远程连接的这样的话我们就需要从后端获取到真实ip来判断是不是指定的机器了&#xff…

2023androidstudio

终于下定决心将studio升级到新版本使用了,在这总结下和之前的差别 问题一: 创建java类型的项目 在新版本studio中,创建android项目时,语言选择中没有java选项了,这让一直使用java开发的我摸索了好久,终于…

深入剖析图像平滑与噪声滤波

噪声 在数字图像处理中,噪声是指在图像中引入的不希望的随机或无意义的信号。它是由于图像采集、传输、存储或处理过程中的各种因素引起的。 噪声会导致图像质量下降,使图像失真或降低细节的清晰度。它通常表现为图像中随机分布的亮度或颜色变化&#…

不敢说懂你 - Glide硬核源码剖析

问题 Glide加载流程? Glide整体架构? Glide数据加载的来源? Glide缓存加载的流程? Glide线程切换原理? Glide如何感知Activity? Glide哪种情况会返回应用级的RequestManager? … 带着一些问题去阅读… 使用示例 本篇主要基于glide:4.12.0进行分析。下面是Gli…

LeetCode 11.盛最多谁的容器

目录 题目描述 方法一 双指针 思路: 代码: 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的…

实验室三大常用仪器1---示波器的基本使用方法(笔记)

目录 示波器的作用 示波器的基础操作方法 示波器测量突变脉冲 示波器的作用 示波器能帮助我们干什么? 比如说某个电源用万用表测量是稳定的5V输出 但是用示波器一看确实波涛汹涌 这样的电源很可能回导致系统异常工作 又比如电脑和单片机进行串口通信时&#xf…

ubuntu在xshell中使用快捷方式操作命令,减少命令行的数入量

第一步 第二步 然后无脑确定 第三步 在xshell的显示方式 方式一 这样就会在每个窗格中进行显示 方式二 效果显示–> 这种窗格的显示是全局的 然后你双击这个process就会自动把命令打在命令行上,减少你的输入量

如何在本地服务器部署TeslaMate

文章目录 1.主要参考官方文档2.准备文件:docker-compose.yml3.运行4.成功后4.1 在这个链接,更具提示登录4.2 在这个链接可以看到电池健康和行车数据等 5.后续说明6.进行数据备份6.1 先将数据进行备份,参考链接6.2 数据迁移6.3 下图为我挂该数…

布隆过滤器初探

1、什么是布隆过滤器 布隆过滤器是一个很长的二进制向量和一系列随机hash函数。布隆过滤器可以用于检索一个元素是否在一个集合中。 常见的hash函数的应用hashMap、hashSet等 回顾一下hashMap的结构 hashMap由数组链表红黑树(java1.8后,链表元素长度大…

七月论文审稿GPT第4.5版:通过15K条paper-review数据微调Llama2 70B(含各种坑)

前言 当我们3月下旬微调完Mixtral 8x7B之后(更多详见:七月论文大模型:含论文的审稿、阅读、写作、修订 ),下一个想微调的就是llama2 70B 因为之前积攒了不少微调代码和微调经验,所以3月底apple便通过5K的paper-review数据集成功…

xilinx cpri ip 开发记录

CPRI是无线通信里的一个标准协议,连接REC和RE的通信。 Xilinx有提供CPRI IP核。 区别于其它通信协议,如以太网等,CPRI是一个同步系统。 这就意味着两端的Master和Slave应当是同源时钟的,两边不存在频差,并且内部延时…

使用isort和autopep8统一代码风格

前言 今天和大家分享一篇关于python代码风格统一的方法。我自己之前有使用过,但都是使用公司现成的,没有自己动手去实操,所以为了一探究竟,今天专门花了一点时间去研究,这个过程还挺顺利的,这里我将这个过…