新闻中心

Vue 2中动态重构DOM结构:利用details和summary标签分组内容

2025-12-07
浏览次数:
返回列表

Vue 2中动态重构DOM结构:利用details和summary标签分组内容

本教程详细讲解如何在vue 2应用中动态重构dom结构,将一系列`h1`标题及其后续的段落(`p`标签)分组,并封装到html的`ails>`和`

`标签中。文章将介绍在vue生命周期钩子`mounted`中使用原生dom操作方法(如`getelementsbytagname`、`insertbefore`、`appendchild`和`remove`)实现这一复杂布局转换的步骤和注意事项,以达到清晰、可折叠的内容展示效果。

理解需求与挑战

在处理来自内容管理系统(如Sanity.io)的数据时,我们常常会遇到需要将扁平化的内容结构转换为更具语义和交互性的HTML结构。例如,一个常见的场景是,内容以一系列

标题,后面紧跟着多个

段落的形式呈现,如下所示:

<h1>标题一</h1>
<p>段落内容1.1</p>
<p>段落内容1.2</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/ai/2432">
                            <img src="https://img.php.cn/upload/ai_manual/001/246/273/176525036756428.png" alt="AdMaker AI">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/2432">AdMaker AI</a>
                            <p>从0到爆款高转化AI广告生成器</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="AdMaker AI">
                                <span>65</span>
                            </div>
                        </div>
                        <a href="/ai/2432" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="AdMaker AI">
                        </a>
                    </div>
                

<h1>标题二</h1>
<p>段落内容2.1</p>
<p>段落内容2.2</p>
<p>段落内容2.3</p>

我们的目标是将其重构为可折叠的

结构,使得每个

标题作为可折叠部分的摘要,其后的所有相关

段落作为可折叠的详细内容,直到遇到下一个

标题。期望的输出结构如下:

<details>
  <summary><h1>标题一</h1></summary>
  <p>段落内容1.1</p>
  <p>段落内容1.2</p>
</details>

<details>
  <summary><h1>标题二</h1></summary>
  <p>段落内容2.1</p>
  <p>段落内容2.2</p>
  <p>段落内容2.3</p>
</details>

这种转换无法通过简单的Vue模板绑定或计算属性直接实现,因为它涉及到对DOM元素的查找、创建、移动和替换,属于典型的原生DOM操作范畴。特别是在使用portable-text-to-vue这类库将富文本内容转换为Vue组件块时,这些块通常会渲染成一系列的HTML标签,此时进行DOM二次处理就显得尤为必要。

核心实现思路

为了实现上述DOM结构的重构,我们需要在Vue组件的特定生命周期钩子中执行J*aScript代码来操作DOM。

  1. 选择合适的时机: 由于我们需要在组件渲染后才能访问和操作其真实的DOM元素,因此Vue的mounted()生命周期钩子是执行此类操作的理想选择。
  2. 获取目标元素: 首先,需要获取所有作为分组起点的

    元素。

  3. 构建和移动: 遍历每个

    元素,为它创建一个新的
    结构,将

    移动到中。然后,识别该

    之后直到下一个

    (或文档末尾)的所有兄弟元素,并将它们移动到新的
    元素中。

  4. 清理: 移除原始的

    元素,因为其内容已经转移到新的结构中。

分步实现详解

以下是在Vue 2组件中实现此DOM重构的详细步骤和示例代码。

步骤一:获取所有目标H1元素

在mounted()钩子中,使用document.getElementsByTagName('h1')来获取页面中所有的

元素。由于getElementsByTagName返回的是一个实时的HTMLCollection,在对其进行循环并修改DOM时可能会导致索引问题,因此建议将其转换为数组进行处理。
mounted() {
  // 获取当前组件的根元素,或者特定容器元素
  const container = this.$el; 
  // 将HTMLCollection转换为数组,以便安全地遍历和修改DOM
  const h1Elements = Array.from(container.getElementsByTagName('h1'));

  // ... 后续操作
}

步骤二:为每个H1及其后续内容构建details结构

遍历h1Elements数组。对于每个h1元素,我们需要:

  1. 创建新的
    元素。
  2. 将当前h1元素移动到新创建的中。
  3. 添加到
    中。
  4. 将新创建的
    元素插入到原始h1元素之前。
    这样,新的结构就占据了h1原来的位置。

以上就是Vue 2中动态重构DOM结构:利用details和summary标签分组内容的详细内容,更多请关注其它相关文章!


# 将其  # seo实战密码 原版  # 沙盒关键词优化排名软件  # 谷歌seo很烧钱吗  # 门店营销推广引流管理  # 营销推广计划书模板图  # 网站seo一年  # 昌平百度seo  # 网站推广与优化方案  # 营销推广品牌建设思路  # seo学习熊掌号  # 这一  # 的是  # 性问题  # vue  # 到新  # 是在  # 可折叠  # 遍历  # 转换为  # 重构  # 组件渲染  # vue组件  # ai  # app  # html  # java  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Python Socket多播通信中指定源IP地址的实践指南  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  将JSON对象数组转置为键值对列表的实用指南  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情  微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】  优化Log4j2控制台输出性能:解决异步日志瓶颈  React项目中导航栏Logo自适应布局:避免裁剪与布局溢出  J*aScript教程:根据元素文本内容动态设置背景色  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  Pygame教程:解决用户输入与游戏状态更新不同步问题  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  晋江读书网页版在线登录 晋江读书电脑版官网  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  Mac怎么使用表情符号_Mac Emoji快捷键面板  解决Flask中Quill编辑器内容提交失败及TypeError的指南  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  b站怎么取消点赞_b站点赞取消操作方法  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  React列表渲染与独立状态管理:避免全局状态影响局部更新  《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  age动漫网站入口 age动漫官网直接访问入口  163邮箱登录密码 163邮箱忘记密码找回  QQ网页版官方账号入口 QQ网页版网页版登录指南  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  抖音从哪里进入网页版_抖音官方入口链接  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  Golang如何使用new_Go new分配内存机制讲解  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  mysql如何设置表访问权限_mysql表访问权限配置  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  Excel文件在线转换快速入口 Excel在线格式转换网站  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发 

搜索