首页 > 其他分享 >Vue3自定义组件实现图片预览下载

Vue3自定义组件实现图片预览下载

时间:2024-12-13 18:32:16浏览次数:7  
标签:const 自定义 预览 extName let Vue3 attachmentName true attachmentUrl

示例

代码

  • ImgPreview.vue
<template>
	<div class="preview" @click="onClick">
		<div class="preview-img">
			<div class="opt-box">
				<CloudDownloadOutlined :style="{fontSize: '44px', color: '#0d71ff'}" title="下载" @click="handleDownload"/>
				<CloseOutlined :style="{fontSize: '44px', color: '#0d71ff'}" title="关闭" @click="onClick"/>
			</div>
			<img :src="src" alt="预览图片" />
		</div>
	</div>
</template>
<script setup>
import { CloseOutlined, CloudDownloadOutlined } from '@ant-design/icons-vue'

const props = defineProps({
	src: {
		type: String,
		default: '',
		required: true
	},
	srcName: {
		type: String,
		default: '',
		required: true
	},
	onDownload: {
		type: Function, default: () => {
		}, required: true
	},
	onClick: {
		type: Function, default: () => {
		}, required: true
	},
	onKeydown: {
		type: Function, default: () => {
		}, required: true
	}
})
const {onDownload, src, srcName} = props
const handleDownload = (e) => {
	e.stopPropagation()
	onDownload({attachmentUrl: src, attachmentName: srcName})
}
</script>
<style lang="scss" scoped>
.preview {
	width: 100%;
	height: 100%;
	background: rgba(0, 0, 0, 0.5);
	position: fixed;
	top: 0;
	bottom: 0;
	left: 0;
	right: 0;
	z-index: 9999;
	overflow: scroll;
	cursor: pointer;
	display: flex;
	align-items: center;
}

.preview-img {
	padding: 20px;
	display: inline-block;
	margin: auto;
	position: relative;

	img {
		max-width: 100%;
		max-height: 100%;
	}

	.opt-box {
		position: absolute;
		top: 34px;
		right: 40px;

		span {
			margin-left: 14px;
		}
	}
}
</style>
  • 使用
		<ImgPreview
			v-if="previewVisible"
			:src="previewUrl"
			:srcName="previewName"
			:onClick="closeImgPreview"
			:onDownload="onDownLoad"
		/>


const previewVisible = ref(false)
const previewUrl = ref('')
const previewName = ref('')
const onPreview = ({ attachmentUrl,attachmentName }) => {
	if(isEmpty(attachmentUrl)) return
	previewVisible.value = true
	previewUrl.value = attachmentUrl
	previewName.value = attachmentName
}

const closeImgPreview = () => {
	previewVisible.value = false;
}

const onDownLoad = ({ attachmentUrl,attachmentName }) => {
	if(isEmpty(attachmentUrl)) {return}
	let param = {
		name: attachmentName.split('.')[0],
		extName: attachmentName.split('.')[1],
		address: attachmentUrl,
	}
	doDownload(param)
	// window.open(attachmentUrl, '_blank')
}

// 文件下载
export function doDownload(item) {
	let aUrl = item.address;
	let extNameIcon = item.extName;
	let extName = item.name;
	if (extName.includes(".")) {
		extName = extName.split(".")[0];
	}
	let xml = new XMLHttpRequest();
	xml.open("GET", aUrl, true);
	xml.responseType = "blob";
	xml.onload = () => {
		let url = window.URL.createObjectURL(xml.response);
		let a = document.createElement("a");
		a.href = url;
		a.download = `${extName}.${extNameIcon}`;
		a.style.display = "none";
		a.click();
	};
	xml.send();
}

标签:const,自定义,预览,extName,let,Vue3,attachmentName,true,attachmentUrl
From: https://www.cnblogs.com/openmind-ink/p/18605573

相关文章

  • 转载:【AI系统】自定义计算图 IR
    模型转换涉及对模型的结构和参数进行重新表示。在进行模型转换时,通常需要理解模型的计算图结构,并根据目标格式的要求对其进行调整和转换,可能包括添加、删除或修改节点、边等操作,以确保转换后的计算图能够正确地表示模型的计算流程。本文主要介绍自定义计算图的方法以及模型转换的......
  • Vue3_透传 Attributes
    什么是透传Attributes透传属性指的是没有被该组件声明为props或emits的属性或v-on事件监听器,eg:class、style、id...在JavaScript中访问透传Attributes//使用useAttrs()API来访问一个组件的所有透传属性<scriptsetup>import{useAttrs}from'vue'constattrs=u......
  • vue3调整el-tree样式
    vue3调整el-tree样式:deep(.el-tree){border:10px;padding:5px;background:rgba(7,36,77,0);height:calc(100%-49px)!important;color:#fff;overflow-y:auto;overflow-x:hidden;padding-right:20p......
  • Vue3+ElementPlus 中 el-image 预览大图属性 previewSrcList 和 translateY(-5px) 的
    【前言】Vue3使用ElementPlus,Vue2使用Element-ui。【问题描述】在Vue3+ElementPlus中,使用el-image和预览大图功能,点击el-image后预览的图片局限在原有图片(小图)内,遮罩也没有充满屏幕。【注】使用  transform:translateY(-5px); 的原因是本来外面有一层div,想用hover ......
  • SpringBoot - 自定义启动Banner(附:使用艺术字体)
    我们知道 SpringBoot 项目启动时会在控制台打印出一个 banner,下面演示如何定制这个 banner。1,修改banner文字 (1)首先在 resources 目录下创建一个 banner.txt 文件。2,使用艺术字体(1)如果想要将文本设置为类似默认 banner 那样的艺术字体,可以借助下面几个在线......
  • SpringBoot3+Vue3+ArcoDesign后台管理系统源码 | 小蚂蚁云
     项目介绍基于SpringBoot3、SpringSecurity、MybatisPlus、Vue3、TypeScript、Vite、ArcoDesign、MySQL等技术栈实现的单体前后端分离后台管理系统;后端基于Java语言采用SpringBoot3、SpringSecurity、MybatisPlus、MySQL等主流技术栈,前端基于Vue3、TypeScript、Vite等技术栈......
  • SpringBoot3+Vue3+ArcoDesign | 小蚂蚁云
    项目介绍基于SpringBoot3、SpringSecurity、MybatisPlus、Vue3、TypeScript、Vite、ArcoDesign、MySQL等技术栈实现的单体前后端分离后台管理系统;后端基于Java语言采用SpringBoot3、SpringSecurity、MybatisPlus、MySQL等主流技术栈,前端基于Vue3、TypeScript、Vite等技术栈实......
  • SpringBoot3+Vue3+NaiveUI后台搭建详细教程 | 小蚂蚁云
     项目介绍基于SpringBoot3、SpringSecurity、MybatisPlus、Vue3、TypeScript、Vite、NaiveUI、MySQL等技术栈实现的单体前后端分离后台管理系统;后端基于Java语言采用SpringBoot3、SpringSecurity、MybatisPlus、MySQL等主流技术栈,前端基于Vue3、TypeScript、Vite等技术栈实现......
  • SpringBoot3+Vue3+NaiveUI搭建后台系统脚手架 | 小蚂蚁云
     项目介绍基于SpringBoot3、SpringSecurity、MybatisPlus、Vue3、TypeScript、Vite、NaiveUI、MySQL等技术栈实现的单体前后端分离后台管理系统;后端基于Java语言采用SpringBoot3、SpringSecurity、MybatisPlus、MySQL等主流技术栈,前端基于Vue3、TypeScript、Vite等技术栈实现......
  • Spring Security6 实现数据库自定义验证和jwt校验
    SpringSecurity6数据库自定义验证和jwt校验的简单实现以及个人解读版本springboot3.4.0mybatis-plus3.5.7jjwt0.12.6在使用jjwt的时候需要导入三个依赖分别是jjwt-api,jjwt-impl和jjwt-jackson,导入三个有点麻烦,所以可以直接导入jjwt依赖,这个依赖包含前面三个<depen......