news 2026/5/1 6:13:54

模态框与DOM,及React和Vue中的优化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
模态框与DOM,及React和Vue中的优化

为避免层级、布局和事件体系导致的副作用(例如受父元素的CSS影响)

模态框通常挂在 document.body 或根节点下

直接 DOM 操作

首先我想的是

const modal = document.createElement('div') modal.className = 'modal' document.body.appendChild(modal)

然后配置 z-index 置顶、 position: fixed 覆盖全页面

但是直接原生 DOM 会导致 重排、重绘 ,性能耗散!

所以在 React 和 Vue 的框架层面做了处理,需要让模态框挂载位置正确的同时能走diff判断进行性能优化,防止重复 mount,unmount 导致的销毁与重建,还会减少 CLS 提升 SEO

React - Portal传送门

ReactDOM.createPortal( <Modal />, document.body )

在组件关系逻辑树 Fiber Tree 中,管理组件关系和生命周期等等

模态框作为一个组件即一个 Fiber 节点进行插入

App └── Page └── Modal

但是在 DOM 中模态框并不是Page的子组件,而是直接挂在 body 下面的

<body> ├── #root │ └── Page └── Modal

Portal 改变了 DOM 的插入位置

这样就实现了 模态框仍然会在 React Render 中进行 虚拟diff 进行性能优化

Vue - Teleport瞬移

直接写进了语法层

<Teleport to="body"> <Modal v-if="open" /> </Teleport>

本质和 React Portal 基本一致

  • 虚拟节点标记 teleport
  • patch 阶段插入到指定容器
  • diff 范围仅限在 Teleport 子树中

直接JS操作

那么其实我们要优化的就是避免重复的创建

所以可以通过单例模式在全局作用域下面进行 let 的内存管理,防止重复的GC回收和创建导致的重排重绘

let modalEl function getModal() { if (!modalEl) { modalEl = document.createElement('div') modalEl.className = 'modal' document.body.appendChild(modalEl) } return modalEl }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 20:19:18

java计算机毕业设计人力资源管理信息系统 基于SpringBoot的智能人事综合服务平台 面向中小企业的员工全生命周期数字管理系统

计算机毕业设计人力资源管理信息系统zlrqe9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。纸质档案塞满铁皮柜、Excel表格越改越乱、离职交接靠“口口相传”——这是多数小微企业…

作者头像 李华
网站建设 2026/4/28 19:49:09

OCLP-Mod:老旧Mac设备macOS兼容性终极解决方案

OCLP-Mod&#xff1a;老旧Mac设备macOS兼容性终极解决方案 【免费下载链接】OCLP-Mod A mod version for OCLP,with more interesting features. 项目地址: https://gitcode.com/gh_mirrors/oc/OCLP-Mod OCLP-Mod作为基于OpenCore引导加载器的增强版本&#xff0c;为被苹…

作者头像 李华
网站建设 2026/4/19 9:00:56

算法题 设计链表

设计链表 问题描述 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性&#xff1a;val 和 next。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要一个属性 prev 以指示链表中的上一个节点…

作者头像 李华
网站建设 2026/4/27 3:35:16

Linux pipe匿名管道进程间通信

extern int pipe (int __pipedes[2])上面是函数原型 传入一个字符数组&#xff0c;创建两个文件描述符&#xff0c;[0]为读端[1]为写端下面给一个代码案例&#xff0c;一步步解析过程#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include &…

作者头像 李华
网站建设 2026/4/21 22:29:54

DBeaver数据导出终极指南:轻松导出各种数据库格式

DBeaver数据导出终极指南&#xff1a;轻松导出各种数据库格式 【免费下载链接】dbeaver 项目地址: https://gitcode.com/gh_mirrors/dbe/dbeaver DBeaver作为一款功能强大的开源数据库管理工具&#xff0c;其数据导出功能能够帮助用户快速、准确地将数据库中的数据导出…

作者头像 李华