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

php中文网
发布: 2025-12-07 19:32:02
原创
230人浏览过

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/1401">
                            <img src="https://img.php.cn/upload/ai_manual/000/000/000/175680033362448.jpg" alt="标贝悦读AI配音">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/1401">标贝悦读AI配音</a>
                            <p>在线文字转语音软件-专业的配音网站</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="标贝悦读AI配音">
                                <span>66</span>
                            </div>
                        </div>
                        <a href="/ai/1401" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="标贝悦读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组件的特定生命周期钩子中执行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 2中动态重构DOM结构:利用details和summary标签分组内容的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号