第 4 卷
◦ 当组件首次进入 keep-alive 时,执行组件的创建生命周期( created、 mounted),
◦ 当组件被切换(隐藏)时,Vue不会销毁组件实例,而是将其从DOM中移除,组件状态保留在
cache 中;
- 组件激活:
◦ 当组件再次被切换(显示)时,从 cache 中取出对应的组件实例VNode,重新渲染到DOM
中,执行 activated 生命周期(Vue2/Vue3均支持);
- 若组件不在 cache 中,则重新创建组件实例并缓存;
- 缓存控制:
- include:字符串/正则/数组,只有名称匹配的组件才会被缓存;
- exclude:字符串/正则/数组,名称匹配的组件不会被缓存;
◦ max:数字,设置缓存上限,当缓存数量超过 max 时,按照LRU策略删除最久未使用的组件
缓存;
- 生命周期钩子:
◦ 缓存组件新增两个生命周期: activated(组件激活时触发)、 deactivated(组件失
活时触发);
- 缓存组件不会执行 unmounted / destroyed,除非手动清除缓存或超过 max 被淘汰。
三、具体缓存的内容
keep-alive 缓存的是组件的实例对象(VNode实例)及其内部状态,具体包括:
- 组件的响应式数据( data、 props、 computed 等);
- 组件的DOM结构(虚拟DOM节点,无需重新生成);
- 组件的生命周期状态(已执行的生命周期钩子记录);
- 组件内部的子组件实例、指令实例等;
- 不缓存的内容:组件的临时状态(如非响应式数据、DOM事件的临时绑定,若需保留需手动处
理)。
12. $nextTick方法:原理与用途
一、 $nextTick的核心原理
$nextTick(Vue2)/ nextTick(Vue3)是Vue提供的异步方法,用于在视图更新完成后执行回调函数,其原理与Vue的异步更新队列紧密相关:
- 当Vue的异步更新队列执行完毕,视图已完成更新,此时 $nextTick 的回调函数才会执行,确保
回调中能获取到更新后的DOM;
- 底层实现(优先级从高到低):
- Vue2/Vue3:优先使用 Promise.then(微任务);
◦ 兼容处理:若环境不支持Promise,使用 MutationObserver(微任务),再降级为
setTimeout(宏任务)。
二、 $nextTick的常见用途
- 获取更新后的DOM元素:
- 场景:修改数据后,需要立即获取DOM元素的尺寸、内容或操作DOM;
◦ 示例:
Code block
1this.msg = '更新后的数据' 2// 此时DOM未更新,获取不到最新内容
| 3 | console.log(document.getElementById('box').innerText)//旧值 |
|---|---|
| 4 | this.$nextTick(() => { |
| 5 | //视图已更新,可获取最新DOM内容 |
| 6 | console.log(document.getElementById('box').innerText)//新值 |
| 7 | }) |
- 在组件切换/渲染后执行逻辑:
◦ 场景:使用 v-if 控制组件显示隐藏,需要在组件显示后执行初始化逻辑(如第三方插件初始
化);
- 批量修改数据后统一执行回调:
◦ 场景:同一事件循环中多次修改数据,需要在所有数据更新、视图渲染完成后,执行统一的逻
辑(如提交表单、发送请求);
- 解决视图更新延迟导致的问题:
- 场景:如滚动条位置恢复、表单焦点设置等,需要在视图更新后操作,否则会失效;
- Vue3组合式API中使用:
◦ Vue3中取消了组件实例的 $nextTick,需手动导入 nextTick 函数使用:
5await nextTick()
6console.log(document.getElementById('box').innerText) // 新值 7}
13. Vuex的工作原理 & 角色与重要性
一、 Vuex的工作原理
Vuex基于单向数据流设计,核心是实现全局状态的统一管理,其工作流程如下(闭环流程):
- State:全局唯一的状态容器,存储应用的所有全局状态,通过 Vue(Vue2)/ reactive
(Vue3)实现响应式;
- 组件触发Action:组件通过 this.$store.dispatch('actionName', payload) 分发
Action(可异步操作,如接口请求);
- Action提交Mutation:Action内部通过 context.commit('mutationName', payload)
提交Mutation(Action本身不修改状态,仅处理异步逻辑);
- Mutation修改State:Mutation是唯一能修改State的入口,接收State和payload,同步修改
State(必须同步,便于Devtools追踪状态变化);
- State更新驱动视图更新:State是响应式的,当State被修改后,依赖State的组件会自动重新渲
染,更新视图;
- Getter派生状态:组件通过 this.$store.getters.getterName 获取派生状态(类似计算
属性,缓存结果,依赖变化时重新计算);
- Module拆分:对于大型应用,通过Module将全局状态拆分为多个子模块,每个模块拥有独立的
State、Getter、Mutation、Action,支持命名空间隔离。
二、 Vuex在状态管理中的角色和重要性
- 核心角色
• 全局状态容器:充当应用全局状态的“仓库”,集中存储所有组件共享的状态(如用户信息、全局
配置、购物车数据等);
• 状态管理中枢:统一管理状态的读取、修改流程,避免组件间直接修改状态,实现“单向数据
流”,便于状态追踪和调试;
• 组件通信桥梁:解决多层嵌套组件(跨层级、跨组件)通信的繁琐问题,组件无需通过
props / emit 逐层传递数据,直接通过 $store 访问全局状态;
• 状态变更追踪:集成Vue Devtools,可实时查看State的变化记录、回溯状态修改流程,便于排查
全站分卷索引 · 12 卷
- 1第 1 卷
- Vue 核心知识点深度解析
- 1. Vue3核心源码精读
- • 核心架构:分为响应式系统( reactivity)、编译系统( compiler)、运行时系统
- • 响应式核心:基于 Proxy 实现响应式,源码核心在 @vue/reactivity 包,包含 effect
- • 组件渲染:采用 VNode(虚拟DOM)描述节点,通过 createVNode 创建虚拟节点, patch
- • 组合式API: setup 函数作为入口, ref(原始类型响应式)、 reactive(对象类型响应
- • 编译优化:引入 PatchFlags(补丁标记)和 StaticNode(静态节点),编译阶段标记动态
- 2. Vuex核心源码精读
- • 核心架构:基于单向数据流设计,核心模块包括 Store(核心类,实例化时初始化状态)、
- • 核心原理:
- 3. Pinia核心源码精读
- • 核心原理:
- 2第 2 卷
- 6. Vue中的依赖收集:触发场景与机制
- 一、依赖收集的触发场景
- 二、依赖收集的核心机制
- • 每个响应式对象的每个属性,对应一个 Dep 类(依赖容器),存储该属性对应的 Watcher
- • 采用“靶心-属性-副作用”的映射关系: WeakMap<响应式对象, Map<属性名,
- • 访问属性时,触发 Proxy 的 get 拦截,调用 track 函数,沿上述映射关系,将当前活跃
- 7. Object.defineProperty的缺点 & Vue3选择Proxy的原因
- 一、Object.defineProperty的潜在缺点/限制
- ◦ 该API只能对已存在的属性进行拦截( get / set),无法感知对象新增属性(如
- ◦ Vue2中需通过 Vue.set / this.$set、 Vue.delete / this.$delete 手动触发响应式
- ◦ Vue2中通过重写数组的7个变异方法(push、pop、shift、unshift、splice、sort、reverse)
- ◦ 若要实现对象全属性响应式,需递归遍历对象的所有属性(包括嵌套对象),对每个属性调用
- 3第 3 卷
- ◦ 示例: <input v-model="msg"> 会被编译为 <input :value="msg"
- 二、不同场景的实现细节
- • 表单元素: v-model 根据元素类型自动匹配属性和事件(文本框: value + input;复选
- • 自定义组件: v-model 是 modelValue prop 和 update:modelValue 事件的语法糖,父
- 9. Vue数据变化时视图的更新机制(即时/异步)
- 一、核心原因
- 二、视图更新的具体机制
- ◦ Vue2:基于 Promise.then(微任务)实现异步队列,兼容环境下会降级为 setTimeout
- ◦ Vue3:基于 queuePostFlushCb 函数,优先使用 Promise.then,其次是
- 10. Vue对象/数组的属性变化监听实现原理
- 一、对象属性变化的监听原理
- 二、数组属性变化的监听原理
- 4第 4 卷
- ◦ 当组件首次进入 keep-alive 时,执行组件的创建生命周期( created、 mounted),
- ◦ 当组件被切换(隐藏)时,Vue不会销毁组件实例,而是将其从DOM中移除,组件状态保留在
- ◦ 当组件再次被切换(显示)时,从 cache 中取出对应的组件实例VNode,重新渲染到DOM
- ◦ max:数字,设置缓存上限,当缓存数量超过 max 时,按照LRU策略删除最久未使用的组件
- ◦ 缓存组件新增两个生命周期: activated(组件激活时触发)、 deactivated(组件失
- 三、具体缓存的内容
- 12. $nextTick方法:原理与用途
- 一、 $nextTick的核心原理
- ◦ 兼容处理:若环境不支持Promise,使用 MutationObserver(微任务),再降级为
- 二、 $nextTick的常见用途
- ◦ 示例:
- ◦ 场景:使用 v-if 控制组件显示隐藏,需要在组件显示后执行初始化逻辑(如第三方插件初始
- 5第 5 卷
- • 解决状态混乱问题:在大型应用中,若组件状态分散管理,会导致状态来源不明确、修改不可控、
- • 提升开发效率:统一的状态管理规范,让团队协作更高效,新开发者可快速理解状态的流转逻辑,
- • 增强应用可维护性:状态与组件解耦,当业务逻辑变更时,只需修改Vuex的Action/Mutation,无
- • 支持高级特性:内置支持状态持久化(配合插件)、模块化拆分、命名空间隔离等高级特性,满足
- 14. Vuex与localStorage在状态管理的不同用途和特性对比
- 一、核心特性对比
- 二、不同用途
- 三、最佳实践
- • 两者结合使用:Vuex负责运行时状态管理,localStorage负责状态持久化,例如:
- • 避免滥用:
- 一、本质区别
- 二、Vuex的核心优势
- 6第 6 卷
- 7第 7 卷
- 8第 8 卷
- 9第 9 卷
- 10第 10 卷
- 11第 11 卷
- 12第 12 卷