Vue 3 的 reactive 数组为什么能感知 arr[0] 赋值、push 和 length 修改,而 Vue 2 需要特殊补丁?
围绕“Vue 3 的 reactive 数组为什么能感知 arr[0] 赋值、push 和 length 修改,而 Vue”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 Proxy 对索引与 length 的统一拦截及隐式 length 依赖。
Vue · 响应式原理面试题第 1 页,显示第 1–46 题,共找到 46 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
围绕“Vue 3 的 reactive 数组为什么能感知 arr[0] 赋值、push 和 length 修改,而 Vue”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 Proxy 对索引与 length 的统一拦截及隐式 length 依赖。
围绕“把纯静态路由表、常量字典或巨型不可变 JSON 全量 reactive 化,在 Vue 中主要浪费什么,应该怎么降级”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确多余代理与深层追踪带来内存/初始化成本,静态数据用 markRaw/shallowRef/普通常量。
围绕“在 Vue 的响应式 effect 中,await 之后再读取响应式状态为什么可能不会按直觉建立依赖”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断时要说明依赖收集只发生在 effect 同步运行窗口,异步恢复后上下文已变。
围绕“同一个 Vue effect 依赖的多个 ref 在一次同步代码块里连续修改,为什么通常只引起一次重新运行而不是每行”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 trigger 入队并由调度器去重批量执行,job 去重避免重复。
围绕“把带 #private 字段或依赖内部槽位的 class 实例放进 Vue reactive,为什么可能比放普通对象”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 Proxy 包装后私有品牌检查/内部方法 this 可能失败,建议 markRaw 或外层 ref。
围绕“在 Vue 的 computed 里直接 await 接口返回为什么常得到 Promise 或旧值,正确边界是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断时要说明 computed 同步返回值且不应承载异步副作用,异步数据应放进 ref 流程。
围绕“多个 Vue computed 串联 a→b→c 时,源 ref 变化后重算顺序为什么不能依赖“立即全部同步执行””给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确失效沿依赖传播但重算发生在读取时,调试日志顺序不等于拓扑提交。
说明 computed 依据实际读取的响应式依赖缓存结果,区分依赖变化、下一次读取、动态分支与下游更新,解释 Date.now、普通变量和原地绕过代理修改的边界。
computed 是否总比 methods 更快?用商品筛选和折扣试算说明响应式依赖缓存、重复读取、带参数计算以及非响应式时间值的边界,避免把所有函数都改成计算属性。
围绕“Vue computed/effect 在 if 分支里才读取某个响应式字段,分支切换后依赖集合会怎样变化”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确每次运行重建依赖,旧分支依赖在 cleanup 后移除以避免过期触发。
围绕“用 customRef 做带格式校验的输入状态时,track 与 trigger 应该放在 get/set 的哪一侧”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 get 返回前 track、有效写入后 trigger,拒绝非法值时不能误触发。
围绕“删除 Vue reactive 对象的键 delete state.foo 会触发哪些依赖,和把 foo 设为 un”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分 delete 影响 has/ownKeys/迭代依赖且不等同值变更。
围绕“为什么直接 const { count } = reactive({ count: 0 }) 后再改 count 不”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明解构拿到的是当前快照值而非响应式连接,修复用 toRefs/toRef 或保留 state.count。
围绕“如果手写最小 Vue 响应式,activeEffect、targetMap、dep 三个结构分别解决什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须定位当前执行者、对象到键到依赖集合的索引、依赖集合去重;不实现 scheduler、computed 或 ref。
围绕“多个 Vue 组合式函数共享同一个 effectScope 时,dispose 一次会怎样影响其中 computed”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断时要说明作用域统一回收其内 effects/computed 的依赖与缓存,适合插件/商店边界。
围绕“Vue 触发更新前如何判断值真的变了,NaN 与 +0/-0 这类边界为什么需要 hasChanged 语义”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确基于 Object.is 的变化检测避免 NaN 恒不等和零值符号误判。
围绕“对 Vue 的 reactive 对象执行 JSON.stringify 得到的是实时视图还是快照,为什么不能用它替”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确序列化在当次读取求值并生成普通字符串快照,不会维持依赖。
围绕“Vue 3 中给已创建的 reactive 对象 later 添加新键为什么会触发更新,而同类代码在 Vue 2 常”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 Proxy 可拦截未知键 set/defineProperty,Vue 2 需预先观测已有键。
围绕“Vue 3 的 reactive 包 Map/Set 时,读取 size、遍历和增删元素分别会建立或触发哪些依赖”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分键依赖、迭代依赖与 size 依赖在 add/delete/clear 下的触发。
围绕“什么时候应把第三方实例、DOM 节点或不可变配置放进 Vue 的 markRaw,而不是 reactive”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确跳过代理可避免内部槽位/循环引用/性能问题且失去响应式。
围绕“Vue 组合式函数要同时接受 3、ref(3)、() => 3 时,unref/toValue 的归一化边界怎么设计”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断时要说明值、ref、getter 的统一读取与是否建立依赖差异。
围绕“为什么在 Vue 的渲染或 effect 追踪期间同步修改刚读取的响应式状态容易形成循环触发”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明同一次同步执行中 get 收集后 set 立即 trigger 会重复调度。
围绕“访问 Vue reactive 的深层对象 state.a.b 时才创建内层代理,这种惰性代理对首次读取和内存有什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明未访问的子树不提前代理,访问后被缓存。
围绕“Vue computed 内部读取了普通模块级变量后,为什么该变量变化不会让 computed 自动失效”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断时要说明只有经 track 的响应式读取才登记依赖,模块常量需改 ref/reactive 或参数化。
围绕“定位“这个 Vue computed 为什么重算”时,onTrack/onTrigger 能提供哪两类证据,使用时机”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确开发调试下记录哪个依赖被读、哪个变更触发失效,生产不宜依赖。
Vue 3.5 的 script setup 解构 props 为什么可以保持响应式?区分编译器转换、普通 reactive 解构、watch 数据源和向组合式函数传参,并明确 Vue 3.4 及更早版本的默认行为差异。
围绕“通过 Vue reactive 代理调用对象方法时,方法里的 this 指向代理还是原对象,为什么这会暴露内部字段问”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断时要说明默认 receiver 多为 proxy 使方法内读写也被追踪,但依赖原始身份/私有槽位的对象要 markRaw。
Vue 3 为什么用 Proxy 实现 reactive?从新增属性、删除、数组索引和原始对象绕过代理等场景解释拦截能力,区分 JavaScript 代理机制与 Vue 的依赖收集调度。
说明同一原始对象的代理复用、代理与 raw 不相等、嵌套对象及不同响应式边界的区别,并讨论 Set、Map、业务 ID 和绕过代理修改的影响。
围绕“把 readonly(reactive) 的对象传给 computed,computed 还能追踪源字段变化吗,试图”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确读取仍建立依赖、源变化可失效,但经只读视图写入被拦截。
围绕“把 Vue 的 readonly 状态传给子组件后被原地修改,开发期警告能说明什么,不能说明什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确只读代理在开发期拦截 set 并告警,但不等于深冻结或运行时安全边界。
围绕“const box = ref({ a: { b: 1 } }) 时,box.value.a.b 的深改为什么默认仍”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 ref 对对象值会转成 reactive,使 box.value 的深层可追踪。
按深层对象属性、数组元素、Map 值与浅层对象区分 ref 解包,说明普通值赋值和新 ref 替换的不同效果,并提醒模板解包与 JavaScript 读取不能混为一谈。
围绕“Vue 响应式状态更新选“整对象替换”还是“原地 patch”,对 ref、reactive、shallowRef ”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答要按包装形态判断替换必然触发、reactive 深层 patch 可触发、shallowRef 深层 patch 不触发。
围绕“面对只替换顶层字段的大型配置树,Vue 的 shallowReactive 比 reactive 更合适时必须接受什”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确只代理第一层可减少嵌套成本,但深层变更不被追踪。
围绕“Vue 的 shallowRef 搭配 triggerRef 适合什么数据形态,为什么不能指望深层对象变更自动刷新”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断时要说明 .value 整体替换自动触发、深层原地修改需手动 triggerRef 且要谨慎。
围绕“为什么 const next = { ...state } 得到的多半不是 Vue 响应式状态,getter 属性在”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确展开读取当前值并丢失代理与描述符语义,新对象需重新 reactive。
围绕“把 Vue 的 reactive proxy 直接交给 structuredClone 或 postMessage ”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖判断时要说明代理函数/内部不可克隆,先 toRaw 或显式深拷贝为普通对象。
围绕“Vue reactive 使用 Symbol 作为键时,依赖追踪仍按 target-key 工作吗,序列化和模板可读”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 Symbol 键可被 track/trigger,但 JSON/枚举/模板展示与普通字符串键不同。
围绕“Vue 中调用 toRaw 解决对象相等或序列化前,需要评估哪些绕过响应式的风险”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确拿到原始对象可比较或传输,但后续读写不 track/trigger 且可能泄露可变源。
从单个字段、多个可枚举字段和可选属性说明 toRef 与 toRefs 的输入边界,补充 Vue 3.3 getter 规范化、只读 props 与直接复制字段值的区别。
围绕“用 track/trigger 描述 Vue 3 响应式时,getter 和 setter 各自必须记录或通知什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 get 时按 target-key 收集当前 effect,set 时按变化派发。
围绕“在通用工具函数里收到未知值,Vue 的 isRef/isReactive/isReadonly/isProxy 应如”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 isProxy 覆盖 reactive/readonly 系、isRef 看盒模型、isReadonly 区分只读变体。
围绕“Vue 依赖追踪用 WeakMap 管 targetMap,为什么这有助于响应式对象被垃圾回收”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 target 作弱键避免依赖表强引用对象,键仍随对象生命周期。
从 JavaScript 值传递与属性拦截解释 ref 的作用,说明原始值、对象整体替换、组合函数参数和模板解包的边界,避免把 ref 误认为只能保存基本类型。
用摄氏温度与华氏温度映射说明可写 computed 的来源、转换和归一化规则,区分 setter 写回源状态与派生缓存,并解释异步保存、只读 props 和 getter 副作用的边界。