15_卸载操作

news/2024/10/24 5:47:29/

在之前我们就提到,首次渲染之后,后续如果再调用 render 函数时,传递的 vnode 为 null 则表示是卸载。

当时我们是直接通过执行 container.innerHTML = ‘’ 来实现的,但是这样做会有以下几个问题,如下:

  • 容器内可能是由某个或者多个组件渲染的,当卸载操作发生时,应该正确的调用这些组件的 beforUnmount、unmounted 等生命周期函数。
  • 即使内容不是由组件渲染的,有的元素存在自定义指令,我们应该再在卸载操作发生时正确的执行这些对应指令的钩子函数。
  • 使用 innerHTML 清空容器的还有一个缺陷是,它并不会移除绑定在 DOM 元素上的事件处理函数

正确的卸载方式应该是,根据 vnode 对象获取对应与其相关联的真实 DOM 元素,然后使用原生 DOM 操作方式将该元素移除。为此,我们需要再 vnode 与真实 DOM 元素之间建立联系,修改 mountElement 函数,如下:

javascript">function mountElement(vnode, container) {// 让 vnode.el 引用真实的 dom 元素const el = (vnode.el = hostCreateElement(vnode.type))// ... 省略其他代码
}

这样建立联系之后,当卸载的时候,只需要根据 vnode.el 属性即可获取真实的 dom 元素,然后在将其从父元素中移除,如下:

javascript">function render(vnode, container) {if (vnode) {patch(container._vnode, vnode, container)} else {// 卸载操作if (container._vnode) {// 获取 vnode 关联的真实 domconst { el } = container._vnode// 获取 el 的父元素const parent = el.parentNode// 调用父元素的 removeChild 方法if (parent) {parent.removeChild(el)}}container._vnode = vnode}
}

根据之前的设计方案,这个卸载子元素的操作,会经常用到,我们将其提取出来,封装到 unmount 函数中,如下:

javascript">function unmount(vnode) {const { el } = vnodeconst parent = el.parentNodeif (parent) {parent.removeChild(el)}
}

http://www.ppmy.cn/news/1541526.html

相关文章

关于使用 C# 处理水位数据多种格式的统一转换

关于使用 C# 处理水位数据多种格式的统一转换 1、前言2、水位数据的多种格式3、水位数据多种格式的统一转换程序展示4、水位数据多种格式的统一转换 C# 代码4.1、声明引用命名空间4.2、多种格式的统一转换 C# 代码4.3、多种格式的统一转换 C# 代码,文件输出保存 1、…

简单的 curl HTTP的POSTGET请求以及ip port连通性测试

简单的 curl HTTP的POST&GET请求以及ip port连通性测试 1. 需求 我们公司有一个演示项目,需要到客户那边进行项目部署,项目部署完成后我们需要进行项目后端接口的测试功能,但是由于客户那边么有条件安装类似于postman这种的测试工具&am…

STM32CubeMX软件界面不清晰调整方法

STM32CubeMX软件界面不清晰调整方法 添加系统环境变量 变量名: J2D_D3D 变量值: false 结果 貌似没有多大变化 添加上述系统环境变量后界面变化如下(没什么大变化) 参考链接 STM32CubeMX软件界面花屏,混乱的解决方案。 彻底解决STM32CUBEMX画面撕裂/重影问题

【Qt】控件——Qt显示类控件、常见的显示类控件、显示类控件的使用、Label、LCD Number、ProgressBar、Calendar Widget

文章目录 Qt4. Qt显示类控件LabelLCD NumberProgressBarCalendar Widget Qt 4. Qt显示类控件 Label QLabel 可以用来显示文本和图片。 属性说明textQLabel 中的文本textFormat文本的格式:Qt::PlainText:纯文本 Qt::RichText:富文本&#xf…

FileLink跨网文件交换平台——能源化工行业的安全传输解决方案

在现代能源化工行业中,数据的快速、安全传输至关重要。随着项目的复杂性和跨地域合作的增加,传统文件传输方式已无法满足日益增长的需求。为此,FileLink跨网文件交换平台应运而生,成为能源化工行业高效、安全的传输解决方案。 Fil…

npm run serve 提示异常Cannot read property ‘upgrade‘ of undefined

npm run serve 提示Cannot read property ‘upgrade’ of undefined 一般是proxy的target代理域名问题导致的,如下: 解决方案: proxy: { “/remoteDealerReportApi”: { target: ‘http://demo-.com.cn’, //此域名有问题,会导致…

数据库安全:常见数据库安全攻击手段及防范措施

数据库安全: 常见数据库安全攻击手段及防范措施 在当今数字化时代,数据库存储着大量的关键信息,包括用户数据、财务信息、商业机密等。因此,数据库安全至关重要。了解常见的数据库安全攻击手段以及相应的防范措施,可以帮助我们更好地保护数据库免受攻击。 一、常见数据库…

MySQL笔试面试题之AI答(2)

文章目录 6. 如何通过 Shell 登入 MySQL?7. MySQL如何列出所有数据库?8. 如何MySQL切换到某个数据库并在上面工作?一、登录到 MySQL二、查看所有数据库(可选)三、切换到目标数据库四、在目标数据库上工作五、注意事项 …