antd+Vue 3实现table行内upload文件图片上传【超详细图解】

这篇具有很好参考价值的文章主要介绍了antd+Vue 3实现table行内upload文件图片上传【超详细图解】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、背景

二、效果图

三、代码


一、背景

一名被组长逼着干前端的苦逼后端,在一个晴天霹雳的日子,被要求前端订单产品实现上传产品图片并立刻回显图片。文章来源地址https://www.toymoban.com/news/detail-847801.html

二、效果图

antd+Vue 3实现table行内upload文件图片上传【超详细图解】,vue.js,前端,javascript

三、代码

<template>
	<a-table :dataSource="dataSource" :columns="columns">
		/** 我这里只举例上传图片的插槽 */
		<template #base64Url="{ record }">
			<a-upload v-model:file-list="record.fileList" name="file" list-type="picture-card" class="product-upload" :show-upload-list="false" action="" @change="
          (file) => {
            return handleChange(file, record);
          }
        " :customRequest="
          (file) => {
            return requestUploadImg(file, record);
          }
        " accept="image/png, image/jpeg, image/jpg" :before-upload="beforeUpload">
				<img v-if="record.base64Url" :src="record.base64Url" />
				<div v-else>
					<loading-outlined v-if="record.loading" class="ant-upload-icon" />
					<div class="ant-upload-text" v-if="record.loading">上传中</div>
					<cloud-upload-outlined v-else class="ant-upload-icon" />
					<div class="ant-upload-text" v-if="!record.loading">支持上传 .jpg .jpeg .png 且小于 2MB 的图片</div>
				</div>
			</a-upload>
		</template>
	</a-table>
</template>
<script lang="ts">
import { LoadingOutlined, CloudUploadOutlined } from '@ant-design/icons-vue';
import { message } from 'ant-design-vue';
import { defineComponent, ref } from 'vue';

interface FileItem {
	uid: string;
	name?: string;
	status?: string;
	response?: string;
	url?: string;
	type?: string;
	size: number;
	originFileObj: any;
}
interface FileInfo {
	file: FileItem;
	fileList: FileItem[];
}
function getBase64(img: Blob, callback: (base64Url: string) => void) {
	const reader = new FileReader();
	reader.addEventListener('load', () => callback(reader.result as string));
	reader.readAsDataURL(img);
}

export default defineComponent({
	components: {
		LoadingOutlined,
		CloudUploadOutlined,
	},
	setup() {
		//这个只要file的状态发生改变就会触发
		const handleChange = (info: FileInfo, record) => {
			if (info.file.status === 'uploading') {
				record.loading = true;
				return;
			}
			if (info.file.status === 'done') {
				// Get this url from response in real world.
				getBase64(info.file.originFileObj, (base64Url: string) => {
					record.base64Url = base64Url;
					record.loading = false;
				});
                message.success('upload success');
			}
			if (info.file.status === 'error') {
				record.loading = false;
				message.error('upload error');
			}
		};
		//这个是上传图片之前的校验,限制图片的格式和大小。也可以在upload标签中使用accept和size设定用户上传时就禁止点击不符合条件的文件
		const beforeUpload = (file: FileItem) => {
			const isJpgOrPng =
				file.type === 'image/jpeg' || file.type === 'image/jpg' || file.type === 'image/png';
			if (!isJpgOrPng) {
				message.error('You can only upload JPG file!');
			}
			const isLt2M = file.size / 1024 / 1024 < 2;
			if (!isLt2M) {
				message.error('Image must smaller than 2MB!');
			}
			return isJpgOrPng && isLt2M;
		};
		//覆盖默认的上传行为,自定义自己的上传实现
		const requestUploadImg = async (info, record) => {
			requestUploadImgApi({ file: info.file })
				.then((res) => {
                    //必须转为blob格式(二进制文件),否则handleChange方法中接收的info.file中没有originFileObj
					const urlData = URL.createObjectURL(info.file); 
                    //必须调用这个方法,否则上传组件的状态将一直是loading状态,传入的res, info.file, record位置不允许改变,且res必须是包含code、data、status、message等信息的responce,而不是data里的数据,否则会一直是error状态或者loading状态
					info.onSuccess(res, info.file, record); 
				})
				.catch((err) => {
					info.onError();
				});
		};
		return {
			dataSource: [
				{
					key: '1',
					name: '产品1',
					desc: '产品描述1',
					base64Url: '',
					fileList: [],
					loading: false,
				},
				{
					key: '2',
					name: '产品2',
					desc: '产品描述2',
					base64Url: '',
					fileList: [],
					loading: false,
				},
			],

			columns: [
				{
					title: '产品名称',
					dataIndex: 'name',
					key: 'name',
				},
				{
					title: '产品描述',
					dataIndex: 'desc',
					key: 'desc',
				},
				{
					title: '产品图片',
					dataIndex: 'base64Url',
					key: 'base64Url',
					slots: { customRender: 'base64Url' }, //这个表示插槽,在html结构中可以自定义样式
				},
				{
					title: '操作',
					dataIndex: 'operation',
					key: 'operation',
					slots: { customRender: 'operation' },
				},
			],
			handleChange,
			beforeUpload,
			requestUploadImg,
		};
	},
});
</script>
<style lang="less">
.product-upload > .ant-upload {
	width: 204px;
	height: 125px;
}
.ant-upload-icon {
	font-size: 30px;
	opacity: 0.5;
}
</style>

到了这里,关于antd+Vue 3实现table行内upload文件图片上传【超详细图解】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • React antd upload组件上传视频并实现视频预览

    记录问题:antd的upload组件文档中对于视频的上传预览没有明确的文档demo,在这里记录一下 项目需求:支持图片及视频的上传并实现预览,点击上传后不会立即请求接口上传资源,后续点击确定再上传 上代码

    2024年02月04日
    浏览(44)
  • vue3 el-upload 上传附件及预览 限制只能上传一个图片或者pdf格式的文件

    效果如图 直接看代码吧 template部分 css部分 js部分

    2024年02月11日
    浏览(80)
  • React antd如何实现<Upload>组件上传附件再次上传已清除附件缓存问题

    最近遇到一个React上传组件的问题,即上传附件成功后,文件展示处仍然还有之前上传附件的缓存信息,需要解决的问题是,要把上一次上传的附件缓存在上传成功或者取消后,可以进行清除 经过一顿试错,终于解决了这个问题。 showUploadList,是可选参数,即是否展示upload

    2024年02月04日
    浏览(55)
  • ant-design-vue中upload上传图片、视频实现预览功能

    有没有小伙伴在使用ant-design-vue的upload组件时,发现api文档在图片预览功能的介绍寥寥无几,而且也没提供视频预览的demo,在实际开发中碰到相应的需求直挠头~~~~,别急,下面来给大家分享一个我自己封装的upload组件,符合需求可以直接在项目中放到组件目录调用。 templat

    2024年02月12日
    浏览(45)
  • Vue+element Upload利用http-request实现第三方地址图片上传

    Vue + element (el-upload)中的 :http-request 图片上传 java后端上传接口,利用 OSS 存储图片 postman测试 图片上传功能及方法 对比: 服务端签名后直传 使用element UI 的el-upload实现第三方地址图片上传,替换原来的action方法 直接上传方法如下:上传图片根据action地址请求后获取到图片u

    2023年04月26日
    浏览(40)
  • 扩展element-ui el-upload组件,实现复制粘贴上传图片文件,带图片预览功能

    控件改造 在窗口的 el-form 控件参数中添加 @paste.native 事件,事件绑定方法名 handlePaste 也可以在其他控件中添加事件监听,看个人需求。 注意: 监听粘贴事件时,需要当前页面先获取焦点,否则无法正常监听, 可以在页面加载后调用 focus() 获取焦点 粘贴功能Js部分参考资料

    2023年04月08日
    浏览(91)
  • Vue+element实现el-table行内编辑并校验

    el-table行内编辑情况情况概要:之前在开发过程中对于element数据的新增,修改,删除。一般直接结合el-form使用。也就是新增的时候点新增然后出来一个弹框,里面嵌套一个表单,然后保存就好了。这次项目中要求所有的新增,修改,删除功能加在表格中,实现行内编辑功能。

    2024年02月15日
    浏览(45)
  • 应用开发平台前端集成vue-simple-uploader实现文件分块上传

    文件的上传是系统的必备功能,Element提供了上传组件upload,也基本能满足常见常用的文件上传功能,特别是应对小型文件(10M以下)的处理。但如果是遇到要求更多更高的场景,上传几百兆甚至上G的视频文件,要求分块上传,能断点续传,显示进度,能暂停,能重试……这

    2024年02月08日
    浏览(53)
  • Element中Upload组件上传(图片和文件的默认上传以及自定义上传)

    适用于:文件上传接口只要求file二进制文件,无需其他参数。(或者配置data属性用于上传时附带的额外参数)。 该实现方式会在选择完图片后就根据配置好的action的接口上传地址自动上传图片。 重点就是配置好 action属性 ,以及限制类型和大小。 不需要配置action,使用http-r

    2024年01月21日
    浏览(50)
  • Vue+elementUI中的el-upload实现上传文件给后端,限制上传文件的格式、文件的大小、文件的数量,将表单和Excel文件一起提交给后端

    需求:1.表单输入信息 2.上传Excel附件 3.下载附件模板 4.限制上传文件的格式、文件的大小、文件的数量 5.将表单和Excel文件一起提交给后端 效果图: 样式部分 data部分代码 method中的代码

    2024年02月12日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包