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


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

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

理解需求与挑战

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

标题,后面紧跟着多个

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

标题一

段落内容1.1

段落内容1.2

标题二

段落内容2.1

段落内容2.2

段落内容2.3

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

结构,使得每个

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

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

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

标题一

段落内容1.1

段落内容1.2

标题二

段落内容2.1

段落内容2.2

段落内容2.3

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

核心实现思路

为了实现上述DOM结构的重构,我们需要在Vue组件的特定生命周期钩子中执行JavaScript代码来操作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  # javascript  # java  # html  # app  # ai  # vue组件  # 组件渲染 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Win11怎么压缩文件 Win11自带压缩解压功能使用【教程】  如何在Golang中修改数组元素_通过指针实现原地更新  Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】  Python性能剖析高级教程_cProfileLineProfiler优化案例解析  PHP主流架构怎么处理表单验证_规则与自定义【技巧】  Python深度学习实战教程_神经网络模型构建与训练  c++如何使用std::bitset进行位图算法_c++ 快速查找与大规模数据排重【方法】  MySQL 中使用 IF 和 CASE 实现查询字段的条件映射  Win11怎么更改鼠标指针方案_Windows11自定义鼠标光标样式与大小  如何在 Go 后端安全获取并验证前端存储的 JWT?  如何在 ACF 中正确更新嵌套多层的 Group 字段子字段  如何解决Windows时间不准的问题?(自动同步设置)  Windows 11无法安全删除U盘提示设备正在使用中怎么办_Windows 11找出占用设备进程  如何诊断并终止卡死的 multiprocessing 子进程  如何在 Go 中创建包含 map 的 slice(嵌套数据结构)  Windows怎样关闭Edge新标签页广告_Windows关闭Edge新标签页设置【步骤】  Win11蓝牙开关不见了怎么办_Win11蓝牙驱动丢失修复教程【方法】  Win11如何添加/删除输入法 Win11切换中英文输入法快捷键【设置】  Win10电脑怎么设置网络名称_Windows10注册表NetworkList修改  Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】  Win11怎么设置默认视频播放器_Windows 11关联媒体文件打开方式【步骤】  Linux如何使用grep搜索文件内容_Linux下正则表达式匹配与查找技巧【指南】  Windows怎样拦截WPS弹窗广告_Windows拦截WPS弹窗广告设置【步骤】  Python lxml的etree和ElementTree有什么区别  如何在 Go 开发中正确处理本地包导入与远程模块路径的一致性问题  Win10系统怎么查看端口状态_Windows10 CMD查看网络连接  Windows10如何更改系统字体大小_Win10辅助功能文本缩放设置  Win11视频默认播放器怎么改_Win11关联第三方播放器【步骤】  Win11怎么硬盘分区 Win11新建磁盘分区详细教程【步骤】  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  c++中如何计算坐标系中两点间距离_c++勾股定理求距离  Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】  如何在 ACF 中正确更新嵌套多层 Group 字段内的子字段  Win11怎么设置ip地址_Windows 11手动配置网络IP教程【详解】  Win10如何卸载自带Edge_Win10彻底卸载Edge浏览器教程【攻略】  Win11文件夹预览图不显示怎么办_Win11缩略图缓存重建修复【教程】  Windows10系统怎么查看防火墙状态_Win10安全中心网络保护  Windows怎样关闭锁屏广告_Windows关闭锁屏广告方法【教程】  C++如何使用std::async进行异步编程?(future用法)  Windows 11怎么设置默认解压软件_Windows 11为ZIP/RAR文件指定默认打开程序  Win11怎么关闭用户账户控制UAC_Windows11更改通知设置等级  Python文本编码与解码_跨平台解析说明【指导】  如何有效拦截拼接式恶意域名的垃圾信息  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  Windows 10自带杀毒软件在哪_Windows 10打开和使用Windows安全中心  海外搜索引擎推广效果怎么样,怎么分析效果!  Win11怎么设置快速访问_Windows11文件资源管理器主页  如何在Golang中实现文件下载_Golang文件传输与内容类型处理方法  C++如何使用std::transform批量处理容器元素?(代码示例)  mac怎么看硬盘大小_MAC查看磁盘存储空间与文件占用【详解】 

 2025-12-07

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

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

点击免费数据支持

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

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@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.