当前位置: 首页 > news >正文

15_卸载操作

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

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

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

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

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

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

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 函数中,如下:

function unmount(vnode) {const { el } = vnodeconst parent = el.parentNodeif (parent) {parent.removeChild(el)}
}
http://www.lryc.cn/news/468795.html

相关文章:

  • ONLYOFFICE 文档8.2版本已发布:PDF 协作编辑、改进界面、性能优化等更新
  • redis的string是怎么实现的
  • 基于STM32设计的智能婴儿床(华为云IOT)(244)
  • html+css+js实现Notification 通知
  • 【Linux】拆分详解 - 常见指令和权限理解
  • UniHttp 框架,请求http接口
  • C++20中头文件ranges的使用
  • 设计一个html+css+js的注册页,对于注册信息进行合法性检测
  • 语音识别——使用Vosk进行语音识别
  • element ui中el-image组件查看图片的坑
  • LabVIEW水质监测系统
  • SpringMVC之 文件上传和下载
  • LeetCode Hot 100:二分查找
  • 打包方式-jar和war的区别
  • 【论文+源码】基于spring boot的垃圾分类网站
  • 【C++ STL 模板类】pair 键值对
  • paddleocr使用FastDeploy 部署工具部署 rknn 模型
  • Apple Vision Pro市场表现分析:IDC最新数据揭示的真相
  • Mybatis-04.入门-JDBC
  • 拥抱云开发的未来:腾讯云数据库、云模板与AI智能化的应用场景探索
  • 新手铲屎官求推荐,噪音低的宠物空气净化器应该用哪款
  • 玄机平台-应急响应-webshell查杀
  • LeetCode Hot 100:图论
  • tracert和ping的区别
  • 回归、分类模型的评估指标
  • k8s中如何将pod的标准输出日志输出到一个文件
  • 软件工程文档规范要点总结
  • Django 序列化serializers
  • 混个1024勋章
  • Java Spring Boot 项目开发示例指南