type
status
date
slug
summary
tags
category
icon
password
源码所在的目录:
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc466f1d4-a794-4e9f-bdf9-13b19f8600bc%2Fbc31cc04-a137-449f-9ce2-6bd324ce57ed%2FUntitled.png?table=block&id=5cd6d625-55b7-4f66-94aa-0beb9ce42666)
源码大概做了什么:
核心函数:
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc466f1d4-a794-4e9f-bdf9-13b19f8600bc%2Fe7ef4e77-eaf7-4dec-b651-04f4a510e38f%2FUntitled.png?table=block&id=eb1b4dfc-8d98-408c-92af-505aaa04089f)
可以看到keep alive是通过setup实现的
它的返回值
返回的是一个渲染函数 内部拿到默认插槽 并且检查是否只有一个子节点 最后将这个node返回 返回的还是我们的组件 keepalive是一个抽象的组件
具体是哪里缓存的呢?
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc466f1d4-a794-4e9f-bdf9-13b19f8600bc%2F74f43a59-9075-4aff-bbdd-0b29dff31257%2FUntitled.png?table=block&id=dd72df6e-e814-46e8-a75a-479672d6e7de)
setup中定义了相关缓存变量 其中cache为map结构的缓存 key为set结构
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc466f1d4-a794-4e9f-bdf9-13b19f8600bc%2F3b24d1eb-ecc8-46e7-a6ab-5082e9a229ae%2FUntitled.png?table=block&id=372c7cf0-df16-401a-be06-35dfe706083c)
定义了pendingCacheKey这个变量来判断是否要缓存 初始为null
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc466f1d4-a794-4e9f-bdf9-13b19f8600bc%2Fe97e8677-130c-4599-8cda-98e429d831df%2FUntitled.png?table=block&id=f9bb1e1b-7720-4a89-8378-e443ccaa6e39)
是在render函数中赋值的 所以首次不缓存 会有onmounted生命周期 render完成后 进行赋值和缓存
啥时候缓存的
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc466f1d4-a794-4e9f-bdf9-13b19f8600bc%2F3559f746-0b3c-4113-ad78-4d54709b6c8e%2FUntitled.png?table=block&id=90412524-9529-405b-b6a8-2e18a6e7e0ef)
缓存策略是怎么样的
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc466f1d4-a794-4e9f-bdf9-13b19f8600bc%2F49b41bc6-50b5-46c3-8ede-ed007b74e8a8%2FUntitled.png?table=block&id=f1eeb9aa-2100-4cd5-9ed3-e9eef497fdbb)
LRU算法
生命周期相关
开启keep-alive 生命周期的变化
初次进入时: onMounted> onActivated
退出后触发 deactivated
再次进入:
只会触发 onActivated
事件挂载的方法等,只执行一次的放在 onMounted中;组件每次进去执行的方法放在 onActivated中
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc466f1d4-a794-4e9f-bdf9-13b19f8600bc%2F22848ae5-2edc-40ff-821a-83cf8661e183%2FUntitled.png?table=block&id=e3914759-51e5-4f64-afcc-858e92e7d71a)
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc466f1d4-a794-4e9f-bdf9-13b19f8600bc%2F5e11ae43-4eda-4203-a069-57c044a744ef%2FUntitled.png?table=block&id=282c78c0-d8af-4ca5-be7b-47f62a574bab)
首先会做一个patch因为会有props改变的情况 然后执行子组件的生命周期 但deactivate不是真正的卸载 而是做了一个move操作存到临时容器
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc466f1d4-a794-4e9f-bdf9-13b19f8600bc%2F6f365de8-deb1-4561-a5fc-6bebadc2cb1f%2FUntitled.png?table=block&id=20e55451-4c33-4627-b222-1e69e0633ac1)
创建的容器
其他
对props的处理
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fc466f1d4-a794-4e9f-bdf9-13b19f8600bc%2F8bf9f152-da38-4851-affa-42c14c4479f2%2FUntitled.png?table=block&id=56ae44ca-7479-4591-affa-7a78bf8fb0bd)
- 作者:MasterYe
- 链接:https://www.masterye.xyz//article/vue-keepalive
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。