第14章、内建组件和模块

14.1 KeepAlive 组件的实现原理

KeepAlive 一词借鉴了 HTTP 协议。

KeepAlive 组件可以避免组件被频繁的销毁/重建。本质是缓存管理,再加上特殊的挂载卸载逻辑。

卸载时将组件放入另一个容器中,再次挂载时再拿出来。对应生命周期为 activateddeactivated

我们创建内置组件 KeepAlive 后,需要在卸载和挂载时对它进行特殊处理。

const KeepAlive = {
__isKeepAlive: true,
setup(props, { slots }) {
// 用于缓存组件实例
const cache = new Map()
// currentInstance 前几章为了生命周期存的全局变量
// 记录组件的实例
const instance = currentInstance
// 从实例的属性中获取一些渲染器的内部方法
const { move, createElement } = instance.keepAliveCtx
// 创建隐藏容器
const storageContainer = createElement('div')
instance._deActivate = (vnode) => {
move(vnode, storageContainer)
}
instance._activate = (vnode) => {
move(vnode, container, anchor)
} return () => {
// 默认插槽
let rawVNode = slots.default()
// 不是组件直接渲染 因为非组件不能缓存
if (typeof rawVNode.type !== 'object') {
return rawVNode
} const cachedVNode = cache.get(rawVNode.type)
if (cachedVNode) {
rawVNode.component = cachedVNode.component
// 如果是缓存组件 后面就不需要再挂载初始化了
rawVNode.keptAlive = true
} else {
cache.set(rawVNode.type, rawVNode)
} rawVNode.shouldKeepAlive = true
rawVNode.keepAliveInstance = instance return rawVNode
}
},
}

patch 的组件挂载逻辑部分新加判断:

if (!n1) {
if (n2.keptAlive) {
n2.keepAliveInstance._activate(n2, container, anchor)
}
// 挂载
mountComponent(n2, container, anchor)
}

卸载也一样

function unmount(vnode) {
if (vnode.type === Fragment) {
// ...
} else if (typeof vnode.type === 'object') {
if (vnode.shouldKeepAlive) {
// 如果是keepalive组件 卸载时调用组件的deactive方法
vnode.keepAliveInstance._deActivate(vnode)
} else {
unmount(vnode.component.subTree)
}
return
}
// ...
}

同时在组件实例新增 keepAliveCtx,传入 movecreateElement 让组件在 activateddeactivated 时使用。

const instance = {
state,
props: shallowReactive(props),
isMounted: false,
subTree: null,
slots,
// 在组件实例中添加 mounted 数组,用来存储通过 onMounted 函数注册的生命周期函数
mounted: [],
// keepAlive组件实例下保存
keepAliveCtx: null,
}
const isKeepAlive = vnode.type.__isKeepAlive
if (isKeepAlive) {
instance.keepAliveCtx = {
move(vnode, container, anchor) {
insert(vnode.component, subTree.el, container, anchor)
},
createElement,
}
}

KeepAlive 组件还支持 includeexclude 功能,实现原理就是在判断是否缓存时加一个正则匹配。

缓存管理,需要限定缓存数量,在 Vue 中采取最近一次访问优先策略。

以及考虑如何在 KeepAlive 中支持自定义策略。

14.2 Teleport 组件的实现原理

通常情况下,组件渲染成真实 DOM 的层级结构与虚拟 DOM 相同,但是如果我们想要渲染到其他位置就无法实现。比如我们想要渲染一个蒙层,需要挂载到 body 下面。

实现方式,给组件增加标识,patch 挂载时挂载到指定的位置即可。为了方便 TreeShaking 把渲染逻辑封装到组件内部,这样如果用户没有使用到 Teleport 组件就不会加载相关代码。

14.3 Transition 组件的实现原理

原理:

  • 组件被挂载时,将动效附加到该 DOM 上
  • 组件被卸载时,不要立即卸载 DOM 元素,等到 DOM 上动效执行完再卸载

在挂载时我们有 enter-fromenter-to 两种,我们需要在开始时添加 enter-from 类名,然后在下一帧再添加 enter-to 触发动画。由于浏览器限制,我们要通过嵌套的 requestAnimationFrame 执行。

等到过渡完成,通过 transitionend 事件判断,并删除类。卸载同理。

《Vue.js 设计与实现》读书笔记 - 第14章、内建组件和模块的更多相关文章

  1. 【vue.js权威指南】读书笔记(第一章)

    最近在读新书<vue.js权威指南>,一边读,一边把笔记整理下来,方便自己以后温故知新,也希望能把自己的读书心得分享给大家. [第1章:遇见vue.js] vue.js是什么? vue.j ...

  2. 【vue.js权威指南】读书笔记(第二章)

    [第2章:数据绑定] 何为数据绑定?答曰:数据绑定就是将数据和视图相关联,当数据发生变化的时候,可以自动的来更新视图. 数据绑定的语法主要分为以下几个部分: 文本插值:文本插值可以说是最基本的形式了. ...

  3. SQL Server2012 T-SQL基础教程--读书笔记(1-4章)

    SQL Server2012 T-SQL基础教程--读书笔记(1-4章) SqlServer T-SQL 示例数据库:点我 Chapter 01 T-SQL 查询和编程背景 1.3 创建表和定义数据的 ...

  4. INSPIRED启示录 读书笔记 - 第14章 产品评审团

    制定更及时.更可靠的产品决策 制定决策通常是既耗时又费力的,产品公司需要一套机制让决策者和相关人员及时作出明智的产品决策.成立产品评审团是最好的解决途径 组织产品评审团的难点在于既要为高管制定产品决策 ...

  5. 《C和指针》 读书笔记 -- 第14章 预处理器

    1.相邻字符串常量被自动链接为一个字符串:"my""name"="myname" 2.##把位于两边的符号连接成一个符号: #define ...

  6. Java编程思想读书笔记--第14章类型信息

    7.动态代理 代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象.这些操作通常涉及与“实际”对象的通信,因此代理通常充当着中间人的角色. 什么是代理模式? ...

  7. APUE读书笔记-第14章-高级I/O

    14.1 引言 *高级I/O包括非阻塞I/O.记录锁.系统V流机制.I/O多路转换(select和poll函数).readv和writev函数以及存储映射I/O(mmap) 14.2 非阻塞I/O * ...

  8. C++ primer plus读书笔记——第14章 C++中的代码重用

    第14章 C++中的代码重用 1. 使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现).获得接口是is-a关系的组成部分.而使用组合,类可以获得实现,但不能获得接口. ...

  9. C++ primer plus读书笔记——第7章 函数——C++的编程模块

    第7章 函数--C++的编程模块 1. 函数的返回类型不能是数组,但可以是其他任何一种类型,甚至可以是结构和对象.有趣的是,C++函数不能直接返回数组,但可以将数组作为结构或对象的组成部分来返回. 2 ...

  10. Linux内核设计与实现 读书笔记 转

    Linux内核设计与实现  读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://bl ...

随机推荐

  1. XR实时云渲染:助力虚拟仿真实训教学呈现

    近年来以5G.云计算.大数据.物联网.人工智能.虚拟现实/增强现实为代表的新兴技术迅速发展加速创新,日益融入经济社会发展各领域全过程,世界主要国家和地区纷纷加快数字化转型战略布局. 虚拟仿真系统是一种 ...

  2. ABC349

    A link 其实,有人赢比赛,就有人输比赛,一加一减,不管进行多少场比赛,最后所有人的分数和一定是\(0\). 那么知道\(n-1\)个人的分数和,就可以知道第\(n\)个人的了. 点击查看代码 # ...

  3. RESTful服务与swagger

    一开始刚学springboot的时候 restful服务+swagger一点都看不懂,现在知识学了一些,再回头看这些东西就简单很多了. 自己跟视频做了一个零件项目,里面写了一些零零散散的模块,其中在视 ...

  4. MSPM0G3507外设DMA学习笔记

    概述 变量的存储 正常情况下,变量存储在SRAM中,如果要发送该变量的值到外设,需要调用内核操作,使SRAM中的数据送到外设. 此类型操作过多会导致占用CPU高,整体卡顿. DMA控制概述 DMA:D ...

  5. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-59 - 判断元素是否显示 - 上篇

    1.简介 有些页面元素的生命周期如同流星一闪,昙花一现.我们也不知道这个元素在没在页面中出现过,为了捕获这一美好瞬间,让其成为永恒.我们就来判断元素是否显示出现过. 在操作元素之前,可以先判断元素的状 ...

  6. Hession-free 的共轭梯度法的高效计算版本的部分代码(pytorch实现,实现一阶求导的一次计算重复使用)

    Hession-free 的共轭梯度法的高效计算版本的部分代码(pytorch实现,实现一阶求导的一次计算重复使用) Hession-free 的共轭梯度法在求解 H*v 的时候是先求一阶导,即雅可比 ...

  7. docker 容器(container)使用ssh服务登录一段时间无操作后自动断开问题解决

    如题,ssh登录建立好的docker容器,无操作一段时间后,发现ssh自动断开: 解决方法: 修改配置文件 /ect/ssh/sshd_config 在文件最后添加下面内容: PermitRootLo ...

  8. 记一次失败记录: MindSpore1.3.0 GPU 源码安装 —— Ubuntu18.04系统 (最终安装结果为失败)

    官网地址: https://www.mindspore.cn/install 系统:Ubuntu18.04 硬件: i7-9700k CPU 2060super nvidia显卡 由于考虑到minds ...

  9. 华为高性能计算(HPC)文档——技术支持>智能计算解决方案>高性能计算>HPC

    链接地址: https://support.huawei.com/enterprise/zh/server-solutions/hpc-pid-253585671 ================== ...

  10. PyTorch的TensorBoard用法示例

    原文: https://www.emperinter.info/2020/07/30/tensorboard-in-pytorch/ 缘由 自己上次安装好PyTorch以及训练了一下官方的数据,今天看 ...