ant-design源码解析——Upload上传组件

news2024/9/23 17:14:28

前言

文件上传是我们开发中不可或缺的一部分,我们将在本文深入解析Ant Design Upload组件的实现。

相信看完以后对于React以及Ant Design的工作原理理解能更上一层楼。

Upload.tsx

入口函数upload.tsx直接引用了AjaxUpload组件,引用了一些能力,并把ant-designprops给传了进去,如图:

在这里插入图片描述

我们去这个组件看核心逻辑

AjaxUpload.tsx

组件一共分了这些事件函数:

在这里插入图片描述

我们来依次拆解这些事件干了啥。

  • onChange:input onchange,上传文件逻辑;
  • onClick:点击事件,点击调起选择文件弹窗逻辑;
  • onKeyDown:同onClick事件;
  • onFileDrop:文件拖拽事件,监测文件拖拽到上传区,上传文件;
  • componentDidMount:组件挂载,标志isMounted
  • componentWillUnMount:组件即将销毁,标志isMounted
  • uploadFiles:上传文件,调用请求函数;
  • processFile:文件即将上传的业务逻辑,获取action上传地址、调用beforeUpload、格式化文件对象结构;
  • post:上传请求事件;
  • reset:重置状态;
  • abort:文件上传中断请求;
  • saveFileInput:挂载input元素ref;
  • render:渲染DOM;

文件上传流程大概是这样的:触发input的原生事件->触发uploadFiles->触发post请求。

我们先看input原生事件。

在这里插入图片描述

所有事件触发都在这里,挂载在了input元素上,以onChange事件为例,我们看下它的实现:

在这里插入图片描述

实现方案也比较易懂,就是原生js的解析文件,这里有directory的props。

  • 如果支持文件夹,则调用attrAccept把文件夹中的文件遍历出来;
  • 如果不支持,则取选中的文件,如果没有文件则不上传;

然后就走到了uploadFiles函数了。

在这里插入图片描述

这里会有两部分,上半部分会调用processFile函数,结构化原生的File对象,转换成RcFile的类型,并且在这个函数中去执行beforeUpload的回调函数。

下半部分会基于结构化完的文件数组,分批去调用post上传文件。

processFile函数的返回就像这样:

在这里插入图片描述

然后还进行了一些props传入的参数处理,包括事件回调、请求地址解析等等。

在这里插入图片描述

然后就到了请求的逻辑部分,我们看下post函数。

在这里插入图片描述

逻辑比较清晰,主要做了几件事情。

  1. 判断组件是否挂载,还没挂载则不请求;
  2. 读取antd props传过来的上传中的事件以及请求的数据,事件有onStartonProgressonSuccessonError,请求数据包含nameheaderswithCredentialsmethod,以及可以选择业务侧自己实现的请求request方法;
  3. 调用request,发送请求;

那我们看下defaultRequest的请求实现,走到request.ts文件里去。

request.ts

request函数中创建了一个XMLHttpRequest对象。

在这里插入图片描述

并在函数最后暴露出了一个abort中断请求函数:

在这里插入图片描述

而函数主体做了这些事情:

  1. 上传请求的配置:

    • UploadRequestOption 作为参数,定义了上传请求的相关选项,如请求的方法、目标 URL、要上传的文件、附加数据、请求头等。
  2. 错误处理:

    • getError 函数用于生成一个自定义的错误对象,包括请求方法、URL 和 HTTP 状态码。此函数在发生请求错误时被调用。
  3. 响应体处理:

    • getBody 函数用来处理服务器返回的响应,尝试将响应文本解析为 JSON,如果解析失败,则返回原始文本。
  4. 进度监控:

    • 使用 xhr.upload.onprogress 来监控文件上传的进度,并在 option.onProgress 中回调进度事件。
  5. FormData 的组装:

    • 根据提供的 option.dataoption.file,创建一个 FormData 对象,将所有需要上传的数据(包括文件)添加到这个对象中。
  6. 请求的发送:

    • 配置请求头,并设置是否需要带上凭证(例如,cookies)。最后,通过 xhr.send(formData) 发送请求。
  7. 事件处理:

    • 处理请求的错误事件和加载完成事件。在成功响应的时候,判断状态码是否在 2xx 范围内,并分别调用 onErroronSuccess 处理成功与失败的情况。
  8. 请求的中止:

    • 返回一个对象,其中包含一个 abort 方法,用于在需要的时候可以中止当前的请求。

在一开始,为函数绑定了xhr对应的事件,以及请求体的数据。

在这里插入图片描述

基于ajax的请求准备工作做完,最后将请求发送了出去,就像这样:

在这里插入图片描述

实现还是比较轻巧的,再回到组件中。其实事情也都做完了,在上传过程中,业务侧能通过组件的所有事件来获取到上传的数据。

我们上面主要基于onChange事件开启上传的整个链路的分析,再看下其他函数呢?其实本质上是一样的。

先看onClick事件。

直接获取到了input元素的DOM,然后基于ref的形式触发了点击事件,接下来选择完文件走的还是onChange的逻辑,并且调用了props.onClick的回调。

在这里插入图片描述

再看下onKeyDown事件,也只是在回车后调用了onClick

在这里插入图片描述

最后再看下onFileDrop拖拽事件,也是基于是否支持文件夹、是否支持多选,来进行原生File对象的解析和组装,最后调用uploadFiles

在这里插入图片描述

到这里,ant-design的底层上传组件能力已经讲完了,是否感觉没有想象中那么复杂呢?

结尾

如果你有任何问题,欢迎在评论区留言讨论。

本专栏会定期更新,最后讲解完所有组件,欢迎关注。

源码地址:

https://github.com/react-component/upload/tree/master

如果喜欢我的文章或者想上岸大厂,可以关注公众号「量子前端」[1],将不定期关注推送前端好文、分享就业资料秘籍,也希望有机会一对一帮助你实现梦想。

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

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

相关文章

UVa1660/LA3031 Cable TV Network

UVa1660/LA3031 Cable TV Network 题目链接题意分析AC 代码 题目链接 本题是2004年icpc欧洲区域赛东南欧赛区的题目 题意 给定一个n(n≤50)个点的无向图,求它的点连通度,即最少删除多少个点,使得图不连通。如下图所示…

Java日志体系框架总结:JUL、JCL、SLF4J、Log4j、Logback、Log4j2

概述 日志记录是应用程序运行中必不可少的一部分。具有良好格式和完备信息的日志,可以在程序出现问题时帮助开发人员迅速地定位错误的根源。日志所能提供的功能是多种多样的,包括记录程序运行时产生的错误信息、状态信息、调试信息和执行时间信息等。 …

Day 22~28 MySQL

MySQL 1、数据库 JavaEE:企业级开发 Web 前端 (页面:展示,数据) 后台(连接点:连接数据库JDBC,连接前端(控制,控制视图跳转,给前端传递数据&…

dedecms织梦 验证码不显示问题

dedecms验证码不显示呢?近期小编仔细研究了一下并根据网上的各个版本总结下面几种解决方法: 问题一:首先先确定php配置环境没问题,如果一个服务器有的网站显示验证码有的不显示,可以排除运行环境的问题;出现这种情况有可能是&…

学习日志8.14--ALC(Access Control List)访问控制列表

ACL访问控制列表是一条或者多条流量规则的集合,作用主要用于流量的匹配,还可以匹配路由。通过ACL对流量加以控制,通过配合使用过滤工具,对流量进行拦截。需要注意的是ACL只是一个个匹配工具,负责匹配源IP地址、目的IP地…

nestjs 全栈进阶--typeorm 一对一

1. 介绍 在 TypeORM 中,一对一(One-to-One)关系是一种数据库关系,其中一个表中的每一行只与另一个表中的一行相关联。比如用户和身份证 2. 准备 我们还是将就上节课的项目,不过我们需要把数据库删除了 右键&#x…

[CSS3]2D与3D变换技术详解

文章目录 2D变换(2D Transform)3D变换(3D Transform)结语 CSS3中的2D变换与3D变换是指通过transform属性对HTML元素进行几何操作,使其在二维或三维空间中进行移动、旋转、缩放和倾斜等变换。这些变换为前端开发者提供了…

秒通多语种!2024年超实用的4款翻译在线工具,真心好用

互联网时代让沟通变得没有界限。不论是和邻居闲聊家常,还是与远在海外的朋友畅谈,现在都非常容易。特别是对于正在学习外语的人来说,在线翻译工具就像是超级英雄的披风一样重要。我研究了很多资料,找到了几款性价比非常高的翻译在…

Java虚拟机:类的加载机制

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 034 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

【BUU】[Dest0g3 520迎新赛]Really Easy SQL

2024/8/14 [Dest0g3 520迎新赛]Really Easy SQL 题目标题说明是SQL注入 题目首页 页面title显示是钓鱼站点。 钓鱼站点主要为将我们的输入信息保存在数据库。后台应该是插入语句。 这里无论输入什么都显示密码错误, 只能尝试盲注,基于时间的盲注, 这里经过测试p…

OPC DAY-上海场提前预告:Softing带您探索“智能工厂中的OPC应用”

(图片来源于:OPC基金会官网) 时间:2024年9月25日 14:00-14:30 | OPC DAY-上海站 地点:上海国家会展中心-5.1H M5-03会议室 2024年9月24-28日,第二十四届中国国际工业博览会将于国家会展中心(上…

Linux 中的同步机制

代码基于:Kernel 6.6 临界资源:指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是,如果有线程正在使用,其他进程必须等待直到该线程释放资源。 临界区:指在每个线程中访问临界资源的那段代码。…

vue3结合海康WEB开发包,开发web在线预览视频

我们这里选择V3.3版本 文档地址:https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type20&id4c945d18fa5f49638ce517ec32e24e24 解压过后,会有三个文件夹 在docs中,点开Demo使用说明,按照流程先测试下&…

赋能基层,融合创新:EasyCVR视频汇聚平台构建平安城市视频共享系统

一、雪亮工程建设的意义 雪亮工程的核心在于通过高清视频监控、环境监测和智能预警等先进技术手段,构建一个高效、智能、安全、便捷的社会安全防控体系。这一工程的建设不仅代表了现代化科技手段在城市治安管理中的应用,更是提升社会安全保障能力、推动…

树形结构查找(B树、B+树)

平衡树结构的树高为 O(logn) ,平衡树结构包括两种平衡二叉树结构(分别为 AVL 树和 RBT)以及一种树结构(B-Tree,又称 B 树,它的度大于 2 )。AVL 树和 RBT 适合内部存储的应用,而 B 树…

CompreFace Study

系列文章目录 第一章 CompreFace Installation 第二章 Face verification POC 文章目录 系列文章目录前言一、What is the ComreFace?二、How to install the CompreFace? 1.On Linux for CompreFace 1.2.02.Troubleshooting总结 前言 此文旨在记录学习CompreF…

萤石取流播放失败自助排障及常见错误码解决方案

一、在使用播放地址播放时遇到播放失败的情况,可使用排障工具排查具体原因,以下具体介绍排障工具的使用方法 1、在浏览器里打开排障工具,地址:萤石开放平台-提供持续稳定的以音视频为主的全场景、多功能综合性服务 2、在第一行输入…

安全无忧!Windows7全补丁旗舰版:集成所有补丁!

今日,系统之家小编给大家分享集成所有补丁的Windows7旗舰版系统,集成至2023.12所有官方补丁,修复了系统高危漏洞,让大家时刻都能舒心地展开操作。系统基于微软 Windows 7 2009 SP1 旗舰版进行离线制作,全新升级的优化方…

本地环境VMware使用代理解决 Docker 镜像拉取问题

引言 本文将分享我在 Windows 10 环境下,通过 VMware 运行的 CentOS 7.8 虚拟机中配置 Docker 代理,成功解决了镜像拉取问题的经验。 问题描述 在尝试启动一个依赖 Docker 的 GitHub 项目时,拉取 Docker 镜像的失败。尝试配置了几个国内源…

(附源码)基于springboot的智慧社区管理系统-计算机毕设 06797

基于springboot的智慧社区管理系统 摘 要 SpringBoot智慧社区管理系统是一款基于SpringBoot框架开发的智能化社区管理软件,致力于提升社区管理效率和服务质量。该系统涵盖了社区入住管理、物业费管理、公共设施预约等功能,支持在线报修、信息发布、社区活…