upload组件封装,支持拖拽文件上传

news2024/11/18 9:43:51

一、组件封装需要注意什么?

组件化思想:组件应该是独立的、可复用的部件,应该遵循单一职责原则,将组件的功能划分得尽可能细致。
API 设计:组件的 API 设计要合理,要考虑到组件的可定制性和易用性。应该尽可能的提供必要的配置项和事件回调,同时避免提供过多的 API,导致 API 过于复杂。
生命周期:组件的生命周期要合理地使用,尤其是对于需要与外部交互的组件,要注意生命周期的时机,以便在组件的不同阶段进行相应的操作。
组件通信:组件通信是组件化开发中的一个重要问题,Vue 中提供了多种通信方式,包括props、 e m i t 、 emit、 emitparent、$attrs、ref、vuex、provide/inject 等。在组件的设计中,需要考虑到组件之间的通信问题,合理地使用这些通信方式。
样式和布局:组件的样式和布局应该尽可能地与组件的功能分离,避免样式和布局影响到组件的功能和逻辑。
测试:组件封装完成后,需要进行充分的测试,包括单元测试和集成测试,以保证组件的质量和稳定性。
总的来说,组件封装可以达到代码的灵活和可复用性,但封装时要谨记上面提到的封装要点。

二、目标效果

在这里插入图片描述

组件可配置属性:

  • multiple是否为多文件上传;
  • filePostfix允许上传文件类型提示;
  • fileList底部文件列表;
  • loading加载数据时显示动效;

组件可配置方法:

  • upload文件上传触发的事件回调;
  • delete点击删除图标触发的事件回调;
  • download点击下载图标触发的事件回调;

三、封装步骤

1、从本地选取文件

1)方式一——点击按钮选取文件:

<input ref="inputfile" class="file-content" type="file" :multiple="multiple" @change="handelInputFile">

相关方法:

handelInputFile(e) {
   
    this.readFile(e.target.files)
    this.$refs.inputfile.value = null;
},

2)方式二——直接拖拽文件:

<div class="file-box"
     :class="dropType ? 'dropbox-shadow' : ''"
     type="file"
     v-i-loading.fullscreen="loading"
     @dragenter.stop.prevent="fileBoxDragenter(true)"
     @dragleave.stop.prevent="fileBoxDragleave"
     @drop.stop.prevent="fileBoxDrop($event, true)"
     @dragover.stop.prevent=""
     @click="openFile">
    <div>
        <div class="upload-icon"></div>
    </div>
    <div class="upload-text">
        <span>将文件拖到此处,或</span>
        <span>点击上传</span>
        <div class="el-upload__tip" slot="tip">只能上传{
  {filePostfix}}文件,且不超过100M</div>
    </div>
</div>

相关方法:

/**
 * dragenter源对象进入过程对象范围内
 */
fileBoxDragenter(flag) {
   
    // 传入10ms的延迟锁,让drapleave在enter延迟后触发
    this.boxLock = true
    setTimeout(() => {
   
        this.boxLock = false
    }, 10)
    // dropType文件拖拽进选中范围的高亮效果
    this.dropType = flag
},

/**
 * dragleave源对象离开过程对象范围
 */
fileBoxDragleave() {
   
    if (this.boxLock) return
    this.dropType = false
},
/**
 * drop文件拖拽落下
 */
fileBoxDrop(e) {
   
    this.dropType = false
    let fileList = e.dataTransfer.files
    this.readFile(fileList)
},

2、获取上传的文件

readFile(fileList) {
    if (!fileList || fileList.length < 1) return
    if(fileList.length > 1) {
        this.$Imessage({
            message: `不支持一次上传多文件`,
            type: 'warning'
        })
        return
    }
    if(!this.multiple && this.fileList.length >= 1) { // 仅允许单个附件上传
        this.$Imessage({
            message: `不支持上传多个附件`,
            type: 'warning'
        })
        return
    }
    let file = fileList[0]
    if(this.validFile(file)) {
        tempFile = file
        this.$refs['paramForm'].validate(valid => {
            if(valid) {
                this.$emit('upload', tempFile, this.multiple)
            }
        })
    }
},

3、已上传文件展示、删除、下载
<!--已上传文件展示-->
<ul v-show="fileList.length>0" class="file-list">
    <li v-for="(item, index) in fileList" class="item-content">
        <a :title="item.name">
            

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python Supervisor助力代码后台运行

大家好&#xff0c;Supervisor 是一个 C/S 架构的进程监控与管理工具&#xff0c;本文将主要介绍其基本用法和部分高级特性&#xff0c;用于解决部署持久化进程的稳定性问题。 1.问题场景 在实际的工作中&#xff0c;往往会有部署持久化进程的需求&#xff0c;比如接口服务进…

BOOT程序与APP程序的RAM共享问题与栈顶地址判断合法

一、我们在进行BOOT程序和APP程序&#xff0c;会想到这里面的RAM他们之间是怎么分配的&#xff0c;会不会有冲突&#xff1f; 答案是&#xff1a;从BOOT程序跳转到APP程序后&#xff0c;相当于执行了新的程序&#xff0c;所以BOOT里边的内存是全部释放了。所以是相互不影响的 …

硬件 - TL431计算

文章目录 1 . 概要2 . TL431内部3 . TL431应用电路4 . TL431计算5 . 小结 【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 概要 1 . TL431常用于通过外围电阻R1,R2设置输出一个目标电压 2 . TL431内部 3 . TL431应用电路 1 . R1 1K&#xf…

web前端之sass中的颜色函数、active按钮激活、hover鼠标悬浮、disabled禁用、scss循环、css

MENU 效果图htmlsassscss编译后的css页面css 效果图 注意查看蓝色按钮。 html <div class"box"><button class"btn type_1">按钮</button><button class"btn type_2">按钮</button><button class"btn ty…

修改表空间对应数据文件的大小

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 表空间与数据文件紧密相连&#xff0c;相互依存&#xff0c;创建表空间的时候需设置数据文件大小。 在后期实际应用中&#xff0c;如果实际存储的数据量超出事先设置的数据…

Threejs Shader动态修改Merge合并几何体中单个Mesh的颜色

目录 Merge合并 现象 思路 实现 为单个geometry添加映射 通过id检索Merge后的Geometry映射属性&#xff0c;获取顶点坐标 onBeforeCompile修改编译前材质的着色代码 编译前材质的顶点着色代码 编译前材质的片元着色代码 着色器代码 注意 效果 Merge合并 mergeBuf…

Postgresql中JIT函数能否inline的依据function_inlinable

相关 《Postgresql源码&#xff08;128&#xff09;深入分析JIT中的函数内联llvm_inline》 《LLVM的ThinLTO编译优化技术在Postgresql中的应用》 前置阅读&#xff1a;《Postgresql源码&#xff08;128&#xff09;深入分析JIT中的函数内联llvm_inline》 在JIT inline函数的过…

2024高安全个人密码本程序源码,贴身密码管家-随机密码备忘录二代密码

项目概述&#xff1a; 在这个网络高度发展的时代&#xff0c;每个人都需要上网&#xff0c;而上网就不可避免地需要使用账号和密码。 在众多账号的情况下&#xff0c;你是否还在为复杂难记的密码感到烦恼&#xff1f;现在只需要记录一次&#xff0c; 就可以随时查看你的密码…

用websocket实现一个简单的im聊天功能

WebSocket前后端建立以及使用-CSDN博客 经过我上一篇的基本理解websocket的建立以及使用后&#xff0c;这篇就写一个简单的demo 实现im聊天 首先就是后端代码&#xff0c;详细解释我都放到了每一句的代码解析了&#xff0c;文章最后我会说怎么运行流程 放置后端代码 packa…

半小时搞懂STM32面经知识点——系统架构与启动流程

1.Cortex-M系统 1.1系统结构 1.处理器核心&#xff1a; Cortex-M3 2.存储器系统&#xff1a; Flash&#xff0c;SRAM&#xff0c;FSMC等 3.总线接口&#xff1a; 核心通过总线接口与外设设备和存储器进行通信。 总线矩阵&#xff1a;总线矩阵是一种硬件结构&#xff0c;用于连…

libcity笔记:

1 __init__ 2 encode 得到的内容如下&#xff1a; data_feature的内容&#xff1a; 一共有多少个location1【包括pad的一个】最长的时间间隔&#xff08;秒&#xff09;最长的距离间隔&#xff08;千米&#xff09;多少个useer idpadding 的locationidpad_item的内容 location…

社交媒体数据恢复:飞书

飞书数据恢复过程包括以下几个步骤&#xff1a; 确认数据丢失&#xff1a;首先要确认数据是否真的丢失&#xff0c;有时候可能只是被隐藏或者误操作删除了。 检查回收站&#xff1a;飞书中删除的文件会默认保存在回收站中&#xff0c;用户可以通过进入回收站找到被删除的文件&…

【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第5章 安装SSH

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

C++中调用python函数(VS2017+WIN10+Anaconda虚拟环境)

1.利用VS创建C空项目 step1 文件——新建——项目 step2 Visual C—— Windows桌面——Windows桌面向导 step3 选择空项目 step4 源文件——新建项——添加 step5 Visual C——C文件&#xff08;.cpp&#xff09; 2.配置环境 Step1. 更换成Release与X64 Step2. 打开项目属性&…

2 GPIO控制

ESP32的GPIO的模式&#xff0c;一共有输入和输出模式两类。其中输入模式&#xff1a;上拉输入、下拉输入、浮空输入、模拟输入&#xff1b;输出模式&#xff1a;输出模式、开漏输出&#xff08;跟stm32八种输入输出模式有所不同&#xff09;。库函数中控制引脚的函数如下&#…

20240511,谓词,内建函数对象

拜托铠甲勇士真的帅好不好&#xff01;&#xff01;&#xff01; STL案例2-员工分组 10个员工&#xff0c;指派部门&#xff0c;员工信息&#xff08;姓名&#xff0c;工资组成&#xff0c;部门&#xff1a;策划&#xff0c;美术&#xff0c;研发&#xff09;&#xff0c;随机…

量子波函数白话解释

关键词&#xff1a;Quantum Wave Function 文章目录 一、说明二、什么是波函数&#xff1f;三 量子波的可视化四、量子波的概率解释 一、说明 在量子力学中&#xff0c;粒子是我们只有在测量它们时才能看到的东西。其中运动模式由满足薛定谔方程的波函数描述。波函数并非量子…

基于Huffman编码的字符串统计及WPL计算

一、问题描述 问题概括&#xff1a; 给定一个字符串或文件&#xff0c;基于Huffman编码方法&#xff0c;实现以下功能&#xff1a; 1.统计每个字符的频率。 2.输出每个字符的Huffman编码。 3.计算并输出WPL&#xff08;加权路径长度&#xff09;。 这个问题要求对Huffman编码算…

AppBuilder低代码体验:构建雅思大作文组件

AppBuilder低代码体验&#xff1a;构建雅思大作文组件 ​ 在4月14日&#xff0c;AppBuilder赢来了一次大更新&#xff0c;具体更新内容见&#xff1a;AppBuilder 2024.04.14发版上线公告 。本次更新最大的亮点就是**新增了工作流&#xff0c;低代码制作组件。**具体包括&#x…