• vue相关基础知识


    vue $nextTick()

      等待下一次dom更新刷新的方法

      使用场景:1、created中想要获取dom时  2、响应式数据变化后获取dom更新状态,比如希望获取列表更新后的高度

    keep-alive

      1、开发中缓存组件使用keep-alive组件,是vue内置组件,keep-alive包裹动态组件component时,会缓存不活动的组件实例,而不是销毁

      这样的组件切换过程中将状态保留在内存中,防止重复渲染

      2、结合属性include和exclude可以明确指定缓存那些组件或排除缓存指定组件。vue3中结合vue-router时发送变化较大,之前是keep-alive

      包裹router-view,现在需要反过来用router-view包裹keep-alive

      3、缓存后如果想获取数据,解决方案有一下两种

          beforeRouteEnter

          actived:在keep-alive缓存的组件被激活时,会执行actived钩子

      4、keep-alive是一个通用组件,内部定义了一个map,缓存创建过的组件实例,返回的渲染函数内部会查找内嵌的component组件对应的组件vnode

      如果该组件在map中存在就直接返回他,由于component的is属性是个响应式数据,因此只要它变化,keep-alive的render函数就会重新执行


     

    Vue实例挂载过程发生了什么

      1、挂载过程是指app.mount()过程,这个是个初始化过程,整体上做了两件事,初始化和建立更新机制

      2、初始化会创建组件实例、初始化组件状态、创建各种响应式数据

      3、建立更新机制这一步会立即执行一次组件更新函数,这会首次执行组件渲染函数并执行patch将前面获得vnode转换为dom;同时首次执行渲染函数会

      创建他内部响应式数据和组件更新函数之间的依赖关系,这使得以后数据变化时会执行对应的更新函数

    Vue3设计目标好优化点

      1、改进点:易用性、框架性能、扩展性、可维护性、开发体验

      2、易用性方面主要是API简化,例如v-model在3中变成了2中v-model和sync的结合体,用户不用区分两者不同,也不用选择困难。类似的简化还有用于渲染函数内部生成VNode的h(type,props,children)

      )'其中props不用区分属性、特性、事件等,框架替我们判断,易用性大增

      3、开发体验方面,新组件teleport传送门、fragments、suspense等都会简化特定场景的代码编写 SFC Composition API语法提升开发体验

      4、扩展性方面提升如独立的reactivity模块,custom renderer API等

      5、可维护性主要是Composition API更容易编写高复用性的业务逻辑,还有对TS支持的提升

      6、性能方面的改进也比较显著,例如编译期优化,基于proxy响应式系统

    proxy和defineProperty的区别

      区别一:defineProperty 是对属性劫持,proxy 是对代理对象

      区别二:defineProperty 无法监听对象新增属性,proxy 可以

      区别三:defineProperty 无法监听对象删除属性,proxy 可以

      区别四:defineProperty 不能监听数组下标改变值的变化,proxy 可以且不需要对数组的方法进行重载

    vue常见优化方法

      1、最常见的路由懒加载:有效拆分App尺寸,访问时才异步加载

      const router=createRouter({

        routes:[

          //借助webpack的import()实现异步组件

          {path:'/foo',component:()=>import('./Foo.vue')}

        ]

      })

      2、keep-alive缓存页面:避免重复创建组件实例,且能保留缓存组件状态

      3、使用v-show复用dom:避免重复创建组件

      4、v-once和v-memo:不再变化的数据使用v-once

      5、长列表性能优化:如果是大数据长列表,可采用虚拟滚动,只渲染部分区域内容(vue-virtual-scroller/vue-virtual-grid)

      6、事件的销毁

      7、图片懒加载

      8、SSR服务端渲染


     

    Vue组件为什么只有一个根节点

      1、2中组件确实只能有一个根节点,但3中组件可以多根节点

      2、之所以需要这样是因为vdom是一个单根树形结构,patch方法在遍历的时候从根节点开始遍历,它要求只有一个根节点。组件也会转换为一个vdom,自然应该满足这个需求

      3、3中之所以可以写多个根节点,是因为引入了Fragment的概念,这是一个抽象的节点,如果发现组件的多根的,就创建一个Fragment节点,把多个根节点作为它的children,将来patch的时候,如果发现是一个Fragment节点,则直接遍历children创建或更新


     

    vue-loader是什么

      1、是用于处理单文件组件(SFC,Single-File Component)的webpack loader

      2、因为有了vue-loader,就可以在项目中编写SFC格式的Vue组件,可以把代码分割为