Vue3.0 学习总结

328 阅读3分钟
  1. Vue 3.0 性能提升主要是通过哪几方面体现的?
  • 响应式系统方面,初始化的时候不再遍历对象的所有属性,使用Object.defineProperty 进行响应式处理,而是在需要使用响应式对象属性的时候直接定义,底层使用Proxy对象进行响应式处理,因此在初始化时性能有了较大的提升
  • 在编译方面,Vue3 对静态节点做了提升,只有在初始化时,会被调用一次,更新的时候diff 算法比较新旧Vnode就会跳过静态节点。给动态节点打上patch tag 标志,缓存事件处理函数,减少不必要的更新
  • 在打包方面,按需导入,tree shaking 只针对有import 的模块才会进行打包,减少了打包的体积
  1. Vue 3.0 所采用的 Composition Api 与 Vue 2.x使用的Options Api 有什么区别?

    vue2 的options API 是描述 组件的 data, props, methods 等 属性的一个对象,相同的业务功能逻辑,分散在不同的选项中去, 不适合业务功能复杂的大型系统中。

    vue3 使用的composition api 是基于函数的,将所有的相同的功能逻辑都放在同一个函数中,便于开发,定位问题,更易于维护

  2. Proxy 相对于 Object.defineProperty 有哪些优点?

    两者都具备访问器函数 get 和 set ,Proxy 能够监听属性的删除, 监听数组的索引和length,对数组的push, pop, unshift,shift等,无需再进行 拦截原型上的方法,重新定义这些数组方法

  3. Vue 3.0 在编译方面有哪些优化?

    • Vue3 对静态节点做了提升,只有在初始化时,会被调用一次,更新的时候diff 算法比较新旧Vnode就会跳过静态节点
    • 动态节点打上patch tag 标志
    • 缓存事件处理函数,减少不必要的更新
    • 支持fragments, 就可以在模板的top-level定义多个元素节点
  4. Vue.js 3.0 响应式系统的实现原理?

    vue3 是基于ES6 的Proxy 实现响应式,对外暴露了reactive(), ref(), toRefs() 三个方法,根据使用场景的需要, 来选择三者中之一来定义一个响应式对象。因此,要回答这个问题,需要懂得这三个函数实现原理

    reactive() 只接收一个对象tagert作为参数,返回的是一个Proxy 对象,通过proxy 对象的处理器handler 来对target 的属性访问进行拦截并收集依赖,当target 的属性被修改或删除的时候会触发更新

    ref () 可以接收一个原始值或对象作为参数,返回一个Ref对象,该对象具有 get value () 和 set value () 访问器,在get 中收集依赖,在set 中触发更新

​ toRefs() 只接收一个响应式对象Reactive , 遍历对象的所有属性,将每个属性都转化成一个类似Ref 对象,但由于Reactive对象本身具备响应式,因此这里不需要再进行依赖收集和触发更新,通过toRefs 的转换 Reactive 对象能够解构