面试题答案
一键面试数据更新检测机制
- Vue 2:
- 使用Object.defineProperty() 进行数据劫持,对对象的每个属性进行遍历并定义getter和setter方法。这种方式无法监听数组的变化,需要对数组的一些方法(如push、pop等)进行重写来触发视图更新。
- 对于对象新增属性或删除属性,Vue 2无法直接检测到,需要使用
Vue.set
和Vue.delete
方法来触发响应式更新。
- Vue 3:
- 采用Proxy替代Object.defineProperty()。Proxy是对整个对象进行代理,而不是对对象的每个属性进行劫持,因此可以原生监听数组变化。
- 对于新增和删除属性,Proxy可以直接监听,不需要特殊的方法,这使得数据变化检测更加灵活和高效。
渲染优化
- Vue 2:
- Vue 2的虚拟DOM(Virtual DOM)在更新时,会对比新旧VNode树的差异,然后进行补丁(patch)操作来更新真实DOM。但在一些复杂场景下,可能会产生较多不必要的对比。
- 没有对静态内容进行特别高效的处理,每次更新都可能涉及静态部分的重新渲染。
- Vue 3:
- Vue 3的虚拟DOM对比算法进行了优化,采用了更高效的Diff算法,减少了不必要的对比操作,提升了更新效率。
- 引入了静态提升(Static Hoisting),将模板中的静态节点提升到模块作用域,只在初始化时创建一次,避免了每次渲染时重复创建。还通过树摇(Tree Shaking)机制,在打包时去除未使用的代码,进一步优化体积和性能。另外,Fragment(片段)支持使得渲染时无需额外创建DOM节点包裹,减少了DOM层级,提升了渲染性能。