ref 和 reactive
reactive
的实现:reactive 通过 Proxy 对对象或数组的每个属性进行深度代理,实现响应式。这种设计使得 reactive 能自动追踪所有嵌套属性的变化,但由于 Proxy 无法直接处理基本数据类型(如 number 、 string 、 boolean ),因此, reactive 不适用于基本数据类型。ref
的实现:为了实现基本数据类型的响应式,Vue 设计了 ref。ref 会将基本数据类型封装为一个包含 value 属性的对象,通过 getter 和 setter 实现响应式依赖追踪和更新。当访问或修改 ref.value 时,Vue 内部会触发依赖更新。此外,对于复杂数据类型(如对象或数组),ref 的内部实现会直接调用 reactive,将复杂数据类型变为响应式。
建议使用 ref
vue3 和 vue2 的区别
- 增加组合式 API(Composition API)
- 基于 Proxy 实现响应式
- 完全用 TypeScript 重写
- 多个根节点,组件模板不再强制要求单个根元素
- 支持多个 v-model 绑定
- 生命周期钩子变化
- off, $once 实例方法被移除
- 移除过滤器 (filters),推荐使用方法或计算属性代替
- 编译优化:更高效的代码分割和 Tree Shaking 技术,减少打包体积
Vue3 diff 算法做了哪些优化?
- Patch Flag:在编译模板时,标记节点的哪些部分可能会发生变化,运行时根据标记跳过无关属性的比较
- 静态提升:将纯静态节点提升为常量,静态内容完全跳过 Diff 过程,后续更新时直接复用
- 最长递增子序列算法:Vue3 利用最长递增子序列(LIS)算法来优化对比流程。通过找到新旧节点之间的最长递增子序列,Vue3 可以减少移动操作,从而提高更新效率。
- 事件缓存:自动缓存内联事件处理器,避免每次渲染重新创建新函数
watch 和 watchEffect 的区别
依赖追踪方式
- watch :需要显式声明依赖,监听指定的数据源;可以监听多个数据源或进行深度监听。
- watchEffect :会自动追踪 作用域内所有的响应式依赖,不需要显式声明依赖。
执行时机
- watch :在监听的响应式数据变化后执行。
- watchEffect :在 组件挂载时 立即执行一次副作用,并在 依赖发生变化时 再次执行。