业务需求:上传头像,上传完毕后拿到头像的url,把头像展示在页面中,最终把头像url和其他用户信息一起发送给服务器

上传头像流程

导入 Upload 组件和图标(一个加号,一个加载中)

import { Upload } from 'antd';
import { PlusOutlined, LoadingOutlined } from '@ant-design/icons';

定义状态

const index = memo(() => {
  // 用于上传前和上传时切换
  const [loading, setLoading] = useState(false);   // 用于保存服务端返回的头像url
  const [imageUrl, setImageUrl] = useState();
}

定义一个上传状态组件,上传前显示 + 号,上传时显示loading

const index = memo(() => {
const uploadButton = (
<div>
{loading ? <LoadingOutlined /> : <PlusOutlined />}
<div
style={{
marginTop: 8,
}}
>
上传
</div>
</div>
);
}

组件代码(省略其他...)

const index = memo(() => {
return (
<Upload
listType="picture-card" // 上传列表的内建样式
showUploadList={false} // 是否展示文件列表
action="" // 这里填写上传的地址
beforeUpload={beforeUpload} // 上传前执行的操作
onChange={handleChange} // 上传中、完成、失败都会调用这个函数。
name='avatar' // 传递给后端的字段
>
{imageUrl ? (
<img
src={imageUrl}
alt="avatar"
style={{
width: '100%',
}}
/>
) : (uploadButton)}
</Upload>
)
})

定义头像上传前执行的钩子函数

const index = memo(() => {
// 该函数会在上传前执行,会把file对象传过来,可以对上传的文件类型判断,限制大小等
const beforeUpload = (file) => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
if (!isJpgOrPng) {
message.error('只能上传 JPG/PNG 文件!');
}
const isLt1M = file.size / 1024 / 1024 < 1;
if (!isLt1M) {
message.error('图片不能超过1MB!');
}
return isJpgOrPng && isLt1M;
};
})

定义头像上传后执行的钩子函数

const index = memo(() => {
const handleChange = (info) => {
if (info.file.status === 'uploading') {
setLoading(true);
return;
}
// 当上传完毕
if (info.file.status === 'done') {
setLoading(false);
// 判断是否上传成功
if (info.file.response.code === 200) {
// 把返回的图像地址设置给 imageUrl
setImageUrl(info.file.response.data.imageUrl) // 取决于服务端返回的字段名
}
}
};
})

以下是在控制台输出 info 对象

完整demo

import React, { memo, useState } from 'react'
import { UserWrapper } from './style' import { Upload } from 'antd';
import { PlusOutlined, LoadingOutlined } from '@ant-design/icons'; const index = memo(() => { const [loading, setLoading] = useState(false);
const [imageUrl, setImageUrl] = useState(); const beforeUpload = (file) => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
if (!isJpgOrPng) {
message.error('只能上传 JPG/PNG 文件!');
}
const isLt1M = file.size / 1024 / 1024 < 1;
if (!isLt1M) {
message.error('图片不能超过1MB!');
}
return isJpgOrPng && isLt1M;
}; const handleChange = (info) => {
if (info.file.status === 'uploading') {
setLoading(true);
return;
}
if (info.file.status === 'done') {
if (info.file.response.code === 200) {
setLoading(false);
setImageUrl(info.file.response.data.imageUrl)
}
}
}; const uploadButton = (
<div>
{loading ? <LoadingOutlined /> : <PlusOutlined />}
<div
style={{
marginTop: 8,
}}
>
上传
</div>
</div>
); return (
<Upload
listType="picture-card"
className="avatar-uploader"
showUploadList={false}
action="上传的地址"
beforeUpload={beforeUpload}
onChange={handleChange}
name='avatar'
>
{imageUrl ? (
<img
src={imageUrl}
alt="avatar"
style={{
width: '100%',
}}
/>
) : (
uploadButton
)}
</Upload>
)
}) export default index

最新文章

  1. [Jenkins] Jenkins配置自动构建时间代表意义
  2. dvwa第一次接触
  3. xml配置文件
  4. MapReduce运行过程以及原理
  5. springJDBC实现查询方法二
  6. RelativeLayout相对布局中拖放控件的办法
  7. solr基于jetty容器配置后台登陆角色用户名密码
  8. Ubuntu环境下手动配置Java环境
  9. ExtJS4.2学习(15)树形表格(转)
  10. Oracle 数据库基本操作——实用手册、表操作、事务操作、序列
  11. java 8 中lambda表达式学习
  12. linux 内核的futex
  13. 利用jenkins做项目的自动化部署
  14. 妙用Outlook2003群发商业邮件
  15. JavaWeb项目架构之Kafka分布式日志队列
  16. 09-TypeScript中的继承
  17. Javascript中的url编码与解码(详解)
  18. 理解性能的奥秘——应用程序中慢,SSMS中快(5)——案例:如何应对参数嗅探
  19. 理解性能的奥秘——应用程序中慢,SSMS中快(3)——不总是参数嗅探的错
  20. html网页引用中文字体,解决加载缓慢办法

热门文章

  1. L02.从图灵机到通用计算机
  2. Android 自定义View (二)
  3. day47-Mysql初识
  4. EL_获取域中存储的值_ List 集合&Map集合值和EL _ empty 运算符&隐式对象 pageContext
  5. oracle数据库常用操作
  6. mysql数据库备份(windows环境)
  7. 集群与iptables
  8. [Unity移动端]gradle打包
  9. Python第五章实验报告
  10. 使用react-vite-antd,修改antd主题,报错 [vite] Internal server error: Inline JavaScript is not enabled. Is it set in your options? It is hacky way to make this function will be compiled preferentially by less