当前位置: 首页 > news >正文

vue项目开发记录1:为v-html内的img元素添加点击放大效果

项目需求:在页面上显示帖子,帖子内的数据来源于后端,形式是"<p>内容</p>"这样的字符串。其中,要为所有的img元素添加一个点击之后看全图的功能,研究了一下,实现方案如下。

1. 基础内容,实现了帖子的显示
<template><div><div v-for="post in posts" :id="post.id"><p>{{ post.author }}</p><p>{{ post.create_time }}</p><div class="content" v-html="post.content"></div></div></div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { getPost } from '@/api/index";const posts = ref([])
onMounted(() => {getData();
})
const getData = () => {getPost().then((res) => {posts.value = res.data;}).catch(err => {});
}
</script>
<style scoped>
.content >>> img {max-width: 500px;
}
</style>
2. 在finally中获取dom节点

由于要为img元素添加点击事件,起初我的想法是,用replaceAll函数手动给img添加@click或onclick事件,将字符串变成<img οnclick="test" src="/pictures/01.png" />这样的形式,后来发现不行,添加@click浏览器无法识别,添加onclick,浏览器也无法获取写在vue文件中的test函数,必须要对dom节点进行操作。

网上的写法都是在onMounted中通过ref获取对应节点,但是因为项目逻辑是在onMounted中调用api接口访问后端,所以必须要等到数据回来之后再去访问节点,才能获取对应的内容。

这时候就可以用到finally。在异步操作中,then, catch, finally是一组,finally内的内容在then和catch执行后执行,非常符合当前的场景。

const getData = () => {getPost().then((res) => {posts.value = res.data;}).catch(err => {console.log(err);}).finally(() => {const elements = document.querySelectorAll('.content img'); // 获取所有img节点elements.forEach(item => item.addEventListener('click', handleClick);});
}
3. 添加弹窗

本来想使用ant-design中的Modal实现图片放大后的弹窗,但是默认的样式和需求差得太远,所以自己写了个。其中还有个小插曲,因为这个组件外部还有内容,所以将.modal_mask的样式写为position:absolute;的时候,并没有达到全屏的效果,只是占满了外部组件的全部,所以要写成position:fixed;

<template><div>...<div v-show="showModal" class="modal_mask"><div class="close_btn" @click="showModal=false"><img src="@/assets/pictures/close.png" /></div><img :src="imgsrc" /></div>
</template>
<script setup>
...const showModal = ref(false); //控制弹窗显示隐藏
const imgsrc = ref('');
...
const handleClick = (event) => {showModal.value = true;imgsrc.value = event.target.src; //必须要通过传来的event获取图片src
}
</script>
<style scoped>
.modal_mask {position: fixed;left: 0;right: 0;top: 0;bottom: 0;background-color: rgba(0, 0, 0, 0.45);z-index: 9999;display: flex;align-items: center;justify-content: center;
}
.modal_mask .close_btn {position: absolute;right: 10px;top: 10px;cursor: pointer;
}
.modal_mask img {max-width: 100%;max-height: 100%;
}
</style>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 格式工厂FormatFactory 视频音频图片文档CD DVD ISO转换器 批量文件重命名 绿色便携免安装版本 下载
  • 【JavaEE初阶】TCP协议
  • 鸿蒙内核源码分析(ELF解析篇) | 内核加载
  • 每日一练 - Overlay VPN 模型技术
  • docker 修改数据目录
  • Java面试题———MySql篇③
  • GD32双路CAN踩坑记录
  • 人才流失预测项目
  • MySQL(二)——CRUD
  • [数据集][目标检测]机械常用工具检测数据集VOC+YOLO格式4713张8类别
  • 小阿轩yx-Kubernetes Pod入门
  • 实现Bezier样条曲线
  • JAVA Unsafe 类介绍
  • 封装websocket
  • 代码随想录算法训练营day50 | 深度优先搜索理论基础、98. 所有可达路径、广度优先搜索理论基础
  • [译]CSS 居中(Center)方法大合集
  • Angular Elements 及其运作原理
  • CSS 提示工具(Tooltip)
  • CSS中外联样式表代表的含义
  • gops —— Go 程序诊断分析工具
  • Java|序列化异常StreamCorruptedException的解决方法
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • spark本地环境的搭建到运行第一个spark程序
  • VUE es6技巧写法(持续更新中~~~)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 欢迎参加第二届中国游戏开发者大会
  • 聊聊directory traversal attack
  • 前言-如何学习区块链
  • 如何在GitHub上创建个人博客
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • # 达梦数据库知识点
  • #微信小程序:微信小程序常见的配置传旨
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (30)数组元素和与数字和的绝对差
  • (Forward) Music Player: From UI Proposal to Code
  • (pojstep1.3.1)1017(构造法模拟)
  • (八)Spring源码解析:Spring MVC
  • (备忘)Java Map 遍历
  • (排序详解之 堆排序)
  • (三)uboot源码分析
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)甲方乙方——赵民谈找工作
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • ***检测工具之RKHunter AIDE
  • *p++,*(p++),*++p,(*p)++区别?
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .gitattributes 文件
  • .java 9 找不到符号_java找不到符号
  • .net反混淆脱壳工具de4dot的使用
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET开发人员必知的八个网站
  • .NET微信公众号开发-2.0创建自定义菜单