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


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/2101">
                            <img src="https://img.php.cn/upload/ai_manual/000/000/000/175680079922248.png" alt="Keeva AI">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/2101">Keeva AI</a>
                            <p>AI一键生成数字人营销视频</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="Keeva AI">
                                <span>245</span>
                            </div>
                        </div>
                        <a href="/ai/2101" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="Keeva AI">
                        </a>
                    </div>
                

<h1>标题二</h1>
<p>段落内容2.1</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</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><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</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标签分组内容的详细内容,更多请关注其它相关文章!


# javascript  # 白云网站seo优化排名  # 甘肃视频网站优化  # 广东省网站建设怎么选  # 刷关键词排名闪现易速达  # 西部网站建设开发方案  # 蓟州区家居营销推广中心  # 文本框  # 表单  # 中文网  # 将其  # 到新  # 是在  # 可折叠  # 遍历  # 转换为  # 重构  # 组件渲染  # vue组件  # ai  # app  # html  # java  # vue  # CC漫画网站建设  # 韩国社交平台seo  # 顺昌正规seo介绍公司  # 广州国内网站建设 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: Win11怎么开启HDR_Windows 11显示器画质增强设置  Pydantic 中“schema”字段命名冲突的解决方案  c++中的const关键字用法大全_c++ const正确使用指南  腾讯QQ邮箱官方入口 QQ邮箱网页版登录平台  手机耗电快是什么原因 延长手机电池续航时间的设置方法【详解】  《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊  如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐  《搜书吧》阅读书籍方法  海外搜索引擎推广效果怎么样,怎么分析效果!  顺丰官方查单号入口 顺丰快递单号查询官网入口  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  Three.js中动态更换3D模型纹理的教程  多闪电脑版下载_多闪PC端模拟器使用  米侠浏览器插件无法启用怎么办 米侠浏览器扩展兼容性修复  iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南  《杖剑传说》食谱大全  动漫之家观看全集库 动漫之家免费资源网地址  晨报|开发商暗示《空洞骑士:丝之歌》DLC开发中 《合金装备4》有望重制  《星露谷物语》克林特好感度事件介绍  解决SQLAlchemy模型跨文件关联的Linter兼容性指南  优化长HTML属性值:SonarQube警告与实用策略  PHP实现等比数列:构建数组元素基于前一个值递增的方法  百度网盘如何设置上传限额  一点万象签到领积分指南  TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法  Yandex世界探索 最新官方免登录入口全知道  怎么恢复删除的电脑文件_数据恢复软件使用教程  192.168.1.1路由器后台入口 192.168.1.1默认登录入口  C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别  Windows自带的便笺数据如何备份_防止数据丢失的便利贴迁移教程【干货】  如何编写一个符合 composer 规范的 post-install-cmd 脚本?  小米手机截图后如何查看历史_小米手机截图历史记录查看方法  Animex动漫社社登录官网 Animex动漫社资源社入口直达  《下一站江湖2》独孤剑诀习得方法  《知到》打卡课程方法  b站网页版入口 哔哩哔哩官方网站直接进入  微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程  Teambition网盘如何共享文件  视频号视频怎么免费保存到相册?保存到相册需要注意什么?  MongoDB聚合管道:高效统计列表中各项的文档数量  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  《大润发优鲜》充值方法介绍  抖音号升级成企业资质怎么弄?有什么好处?  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  《花瓣》创建专辑方法  iPhone 13 mini如何清理Safari缓存_iPhone 13 mini浏览器缓存清理方法  iPhone14无法连接蓝牙设备如何解决  J*aScript模拟悬停与点击:自动化网页动态元素交互指南  三角洲行动2025年9月10日摩斯密码分享  Pandas中基于动态偏移量实现DataFrame列值位移的策略 

 2025-12-07

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.