用el-image-viewer实现全局预览图片

背景

在后台管理系统中,一些预览图片的场景,通常都是使用 `el-image-viewer` 去实现,但是如果多个地方都需要预览图片,又要重复的去写 `el-image-viewer`  以及一些重复的和预览相关的代码。

可以把预览图片的组件放在根文件,把通用的预览相关的代码放在状态管理,哪里需要预览图片,就引入调用预览方法,让根组件的预览组件预览图片。

实现

1. 状态管理用的pinia,新建preview模块文件

// /stores/modules/preview.js

import { defineStore } from "pinia";

export const PreviewStore = defineStore({
	id: "PreviewStore",
	state: () => {
        return {
            // 记录图片预览数据
		   imageViewer: {	
			    show: false, // 控制图片的显现
			    url: "", // 预览的图片路径
			    close: () => {} // 关闭的回调方法
		    }
        }
    },
	actions: {
		// 打开图片预览的弹窗
		openImageViewer({ url, close }: { url: string; close?: Function }) {
			this.imageViewer = {
				show: true,
				url,
				close: async () => {
					close && (await close());
					this.imageViewer.show = false;
				}
			};
		}
	}
});

2.对 el-image-viewer 进行了二次封装,增加了点击遮罩层关闭预览方法

// /components/modules/CImageViewer/index.vue

<template>
	<el-image-viewer v-bind="$attrs" :url-list="[`${baseUrl}${imageViewerUrl}`]" @close="imageViewerClose" />
</template>
<script setup lang="ts">
import { onMounted, ref, nextTick, onBeforeUnmount, computed } from "vue";
import { windowOrigin } from "@/utils/util";
import { PreviewStore } from "@/stores/modules/preview";

const baseUrl = windowOrigin(); // 基础路径
const previewStore = PreviewStore();
const imageViewerUrl = computed(() => previewStore.imageViewer.url);
const imageViewerClose = computed(() => previewStore.imageViewer.close);
onMounted(() => {
	nextTick(() => {
		// 获取预览的遮罩层
		mask.value = document.querySelector(".el-image-viewer__mask") as HTMLDivElement;
		if (mask.value) {
			// 遮罩层增加点击事件,关闭预览
			mask.value.addEventListener("click", imageViewerClose.value);
		}
	});
});
onBeforeUnmount(() => {
	if (mask.value) {
		// 遮罩层增加点击事件,关闭预览
		previewStore.imageViewer.close();
		mask.value.removeEventListener("click", previewStore.imageViewer.close);
	}
});
</script>

3. 在根组件App.vue 使用 CImageViewer 预览图片组件

// App.vue

<template>
	... 其他文件
	<!-- 全局的图片预览组件 -->
	<c-image-viewer v-if="imageViewerVisible"></c-image-viewer>
</template>

<script setup lang="ts">
import { computed } from "vue";
import { PreviewStore } from "@/stores/modules/preview";

import CImageViewer from "@/components/modules/CImageViewer/index.vue";


const previewStore = PreviewStore();
// 控制图片预览组件显现的变量
const imageViewerVisible = computed(() => previewStore.imageViewer.show);

</script>

4. 调用预览图片组件

// 需要预览图片的文件

<template>
    <div class="page">
        <img
            class="imgUrl"
			v-for="(url, index) in imageList(',')"
			:key="index"
			:src="url"
			@click="handlePicturePreview(url)"/>
    </div>
</template>
<script setup lang="ts">
import { PreviewStore } from "@/stores/modules/preview";

// ===========【 查看图片 】===========
const previewStore = PreviewStore();
const handlePicturePreview = (url: string) => {
	previewStore.openImageViewer({ url });
};
</script>

总结

其实就是把根组件的图片预览显现,和调用预览方法 都是交给状态管理控制的,这样就用el-image-viewer 实现全局预览图片的功能。

~~ End ~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java基础 - 05 Vector

Vector 学过C的同学都知道&#xff0c;Vector也在C中存在&#xff0c;他可以说是两种编程语言中都存在的数据结构&#xff0c;但是值得我们注意的是&#xff0c;Vector在java中和在C中是存在差别的&#xff0c;在Java中&#xff0c;Vector是一个数组。并且他是动态的&#xff…

记一次 JMeter 压测 HTTPS 性能问题

问题背景 在使用 JMeter 压测时&#xff0c;发现同一后端服务&#xff0c;在单机 500 并发下&#xff0c;HTTP 和 HTTPS 协议压测 RT 差距非常大。同时观测后端服务各监控指标水位都很低&#xff0c;因此怀疑性能瓶颈在 JMeter 施压客户端。 问题分析 切入点&#xff1a;垃圾…

vue3.2二次封装antd vue 中的Table组件,原有参数属性不变

vue3.2中的<script setup>语法 在项目中多处使用到表格组件,所以进行了一个基础的封装,主要是通过antd vue 中表格的slots配置项,通过配合插槽来进行封装自定义表格; 这次主要的一个功能是编辑之后变成input框 修改了之后变成完成发送请求重新渲染表格&#xff1a; 子…

【Android Gradle 插件】Android 依赖管理 ① ( 依赖库匹配 | 依赖库查找顺序及路径 | Gradle 资源库 )

一、依赖库匹配 依赖库匹配 : 依赖库由三部分组成 依赖库分组依赖库名称依赖库版本号 只有三者都对上 , 依赖库才能匹配上 , 如 dependencies {implementation androidx.appcompat:appcompat:1.3.1 }依赖库分组为 androidx.appcompat , 依赖库名称为 appcompat , 依赖库版本…

QT DAY6作业

1.学生管理系统&#xff0c;基于QT的数据库中数据表的增删改查 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> //执行sql语句类 #include <QSqlRecord> //数据库记…

工信部颁发的人工智能证书《自然语言与语音处理设计开发工程师》证书到手啦!

工信部颁发的人工智能证书《自然语言与语音处理设计开发工程师》证书拿到手啦&#xff01; 近期正在报考的工信部颁发的人工智能证书还有&#xff1a; 《计算机视觉处理设计开发工程师》中级 2024年1月24日至28日-北京 《自然语言与语音处理设计开发工程师》中级 第二期 20…

定位Linux下写句柄错误问题

编写代码时发现对于以下can 写资源句柄时出现的错误不是很能分析&#xff0c;但是如果将错误码打印出来后&#xff0c;清晰了很多&#xff0c;并且还可以查看。 int Can::Write(const struct can_frame *send_frame) { int result;std::cout << "before write s_ :…

嵌入式系统采用linux系统,怎样保证实时性?

嵌入式系统采用linux系统&#xff0c;怎样保证实时性&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&am…

跨平台进程/任务管理服务——Meproc的配置

配置 Meproc的配置非常简单&#xff0c;只有以下几个配置选项。 Conf [ip: 0.0.0.0,port: 8606,log_level: debug,log_dir: /tmp,web: [ip: 127.0.0.1,port: 8606,],bootstrap_cmd: , ];ip 是 Meproc 服务监听 HTTP 请求的地址。port 是Meproc服务监听HTTP请求的端口。log_l…

操作系统详解(5.2)——信号(Signal)的题目进阶

系列文章&#xff1a; 操作系统详解(1)——操作系统的作用 操作系统详解(2)——异常处理(Exception) 操作系统详解(3)——进程、并发和并行 操作系统详解(4)——进程控制(fork, waitpid, sleep, execve) 操作系统详解(5)——信号(Signal) 操作系统详解(5.1)——信号(Signal)的相…

网络安全笔记-SQL注入

文章目录 前言一、数据库1、Information_schema2、相关函数 二、SQL注入分类1、联合查询注入&#xff08;UNION query SQL injection&#xff09;语法 2、报错注入&#xff08;Error-based SQL injection&#xff09;报错注入分类报错函数报错注入原理 3、盲注布尔型盲注&#…

kubernetes入门到进阶(6)

打破次元壁&#xff1a;容器该如何与外界互通互联 在前面的几个章节里&#xff0c;我们已经学习了容器&#xff0c;镜像&#xff0c;镜像仓库的概念和用法&#xff0c;也知道了应该如何创建镜像&#xff0c;再以容器的形式启动应用。 不过&#xff0c;用容器来运行busybox、hel…

程序员有哪些接s单的渠道?

这题我会&#xff01;程序员接单的渠道那可太多了&#xff0c;想要接到合适的单子&#xff0c;筛选一个合适的平台很重要。如果你也在寻找一个合适的接单渠道&#xff0c;可以参考以下这些方向。 首先&#xff0c;程序员要对接单有一个基本的概念&#xff1a;接单渠道可以先粗…

DNS在线测试,CA证书

DNS验证方式如何验证 在线测试&#xff1a;DiG GUI - DiG Online, DiG Web Interface, DiG DNS, Google Dig, Online Dig, Dig Tool letsencrypt证书申请&#xff1a; https://letsencrypt.osfipin.com/user-0408/order/detail?id63mvyl 锐成云-管理中心 第一步&#xff1a…

EV7050AN(压控锯振荡器) 输出:LV-PECL /低相位抖动

低相位抖动18 fs类型。* 3频率范围 750MHz ~ 1100MHz1500MHz ~ 2200MH函数输出关闭(OE) /待机(ST)电源电压3.3 V类型绝对拉力范围50 10 6最小/30 10 6分钟。外形尺寸7.0 5.0 1.6 (t) mm输出LV-PECL应用程序OTN(40GbE,100GbE,400GbE)&#xff0c;高速adc和dac&#xff0c;测…

程序在FLASH中的执行效率比RAM中高?

背景 通常的说法是&#xff0c;程序在RAM中运行的效率比FLASH中的运行效率高&#xff0c;但是你见过程序在FLASH中运行比在RAM中运行效率高的芯片吗&#xff1f; 1 系统结构简介 想要了解芯片是如何取指的&#xff0c;需要对MCU系统的结构有一定的了解&#xff0c;特别是对I…

Access数据库模糊查询

Access数据库模糊查询的方法 1.使通配符: 在 Access 数据库中&#xff0c;有两种通配符可供使用&#xff0c;分别是"?"和"*"。 "?"表示匹配一个字符。 "*"表示匹配任意多个字符 1例如&#xff1a;如果要查询姓氏以"王"开…

jsonschema,一个超强的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - jsonschema。 Github地址&#xff1a;https://github.com/python-jsonschema/jsonschema JSON&#xff08;JavaScript Object Notation&#xff09;是…

windows server 2019 云服务器看不见硬盘的解决方案

刚拿的windows server 服务器看不见硬盘&#xff0c;这是因为没有初始化数据盘的原因。 解决方案如下&#xff1a; 单击“服务器管理器”仪表盘。 弹出“服务器管理器”窗口&#xff0c;如图1所示。 “服务器管理器”页面右上方选择“工具 > 计算机管理”。 弹出“计算机管…

零花钱也能设计精美网页!推荐几个免费设计素材站点!

UI设计师最怕什么&#xff1f; 没有创意&#xff0c;没有灵感&#xff0c;没有思路&#xff01; 在哪里可以得到idea&#xff1f;别担心&#xff0c;往下看&#xff01; 你知道网络有多大&#xff0c;你想要什么吗&#xff1f;今天&#xff0c;我想和大家分享一些宝藏网页设…