第 5 卷
• 解决状态混乱问题:在大型应用中,若组件状态分散管理,会导致状态来源不明确、修改不可控、
数据不一致等问题,Vuex通过集中式管理,让状态变化可预测、可追溯;
• 提升开发效率:统一的状态管理规范,让团队协作更高效,新开发者可快速理解状态的流转逻辑,
无需关注组件间的通信细节;
• 增强应用可维护性:状态与组件解耦,当业务逻辑变更时,只需修改Vuex的Action/Mutation,无
需修改多个组件的逻辑,降低维护成本;
• 支持高级特性:内置支持状态持久化(配合插件)、模块化拆分、命名空间隔离等高级特性,满足
大型应用的复杂需求。
14. Vuex与localStorage在状态管理的不同用途和特性对比
Vuex和localStorage都可用于“存储数据”,但两者的设计初衷、特性和用途有本质区别,核心对比如下:
一、核心特性对比
| 对比维度 | Vuex | localStorage |
|---|---|---|
| 存储类型 | 内存存储(临时存储) | 本地存储(持久化存储,存储 |
在浏览器磁盘中)
| 响应式 | 支持(基于Vue响应式系统, | 不支持(普通字符串存储,数 |
|---|---|---|
| 数据变化驱动视图更新) | 据变化不会触发视图更新) | |
| 存储格式 | 支持JavaScript任意类型(对 | 仅支持字符串类型(需通过 |
| 象、数组、函数等) | JSON.stringify/JSON. |
parse 转换对象/数组)
作用域仅当前应用会话(页面刷新/同源域名下共享(页面刷新/ 关闭后,数据丢失)关闭后,数据仍保留,除非手
动删除/过期)
| 修改方式 | 统一通过Mutation | 直接通过 |
|---|---|---|
| (Vuex2/3)/直接修改 | localStorage.setItem/ | |
| (Vuex4),可追踪 | localStorage.removeIt |
em 修改,无统一管控
性能内存操作,读写速度极快磁盘IO操作,读写速度慢于 Vuex
二、不同用途
Vuex 的核心用途
- 应用全局状态的临时管理:存储应用运行时的共享状态(如用户登录状态、全局导航配置、购物车
临时数据、页面切换状态等);
- 组件间跨层级通信:解决跨组件、跨页面(路由切换)的状态共享问题,无需手动传递数据;
- 状态变更的统一管控:适用于需要追踪状态变化、有复杂异步逻辑(如接口请求后更新全局状态)
的场景;
- 临时状态存储:仅在应用运行期间有效,页面刷新后无需保留的数据(如临时筛选条件、弹窗显示
状态等)。
localStorage 的核心用途
- 状态持久化存储:存储需要跨会话保留的数据(如用户登录令牌(token)、用户偏好设置(主
题、语言)、本地缓存的列表数据等);
- 减轻服务器压力:缓存不常变化的静态数据(如城市列表、商品分类),避免每次页面加载都从服
务器请求;
- 本地数据备份:存储一些非核心数据,作为服务器数据的本地备份,提升应用离线可用性;
- 跨页面(同源)数据共享:在同源域名下的不同页面(非单页应用)之间共享数据(单页应用优先
使用Vuex)。
三、最佳实践
• 两者结合使用:Vuex负责运行时状态管理,localStorage负责状态持久化,例如:
- 用户登录后,将token存入localStorage(持久化),同时将用户信息存入Vuex(供组件快速访
问);
- 应用初始化时,从localStorage中读取token和用户信息,注入到Vuex中,恢复应用状态;
• 避免滥用:
- 不使用Vuex存储无需共享的组件私有状态(直接存在组件 data 中即可);
- 不使用localStorage存储敏感数据(如用户密码,易被XSS攻击窃取)和大容量数据(影响读写性
能);
- 不依赖localStorage实现响应式(需手动监听localStorage变化,再更新Vuex状态,驱动视图更
新)。
- 编译与渲染:template编译分解析-优化-生成三步,视图更新是异步的,依赖异步更新队列;
- 响应式核心:Vue2用Object.defineProperty(有缺陷),Vue3用Proxy(功能更强),依赖收集
仅在Effect执行时触发;
- 核心组件/API:keep-alive缓存组件实例,$nextTick获取更新后DOM,v-model是单向绑定+事件
监听的语法糖;
- 状态管理:Vuex是集中式单向数据流,localStorage是持久化存储,两者常结合使用,各司其职。
- Vuex状态管理与使用全局对象进行状态管理有什么本质区别和优势?
一、本质区别
- 状态响应式支持:
- Vuex:基于Vue原生响应式系统(Vue2:Object.defineProperty;Vue3:reactive)实现,状态
变化可自动驱动视图更新,无需手动处理DOM;
- 全局对象:普通JavaScript对象(如 window.globalState = {}),不具备响应式能力,状
态变化后需手动触发DOM更新,或额外封装响应式逻辑。
- 状态修改管控:
- Vuex:通过严格的“单向数据流”规范管控状态修改,仅能通过Mutation(Vue2/3)或统一API修
改,状态变更可追踪、可回溯;
- 全局对象:无任何修改限制,可在应用任意位置直接修改属性(如 globalState.user =
'new'),状态来源混乱,调试困难。
- 生态集成与工具支持:
- Vuex:深度集成Vue生态,支持Vue Devtools调试(查看状态历史、回溯操作),兼容Vue的生命
周期、组件通信等特性;
- 全局对象:与Vue生态无原生集成,调试需手动打印日志,无法关联组件渲染与状态变化的关系。
- 模块化与扩展性:
- Vuex:原生支持模块化(Module)拆分,支持命名空间隔离,可应对大型应用的复杂状态管理需
求;
- 全局对象:需手动拆分和维护模块(如 globalState.userModule、
globalState.cartModule),无原生隔离机制,易出现命名冲突和逻辑耦合。
二、Vuex的核心优势
全站分卷索引 · 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 卷