1.Vue3比Vue2有什么优势?
- 性能更好
- 体积更小
- 更好的支持TS
- 更好的代码组织
- 更好的逻辑抽离
- 更多新功能
2.描述Vue3生命周期
- Options API
- beforeDestroy 改为 beforeUnmount
- destroyed 改为 unmounted
- Compositon API
- setup整合了beforeCreate和created
- onBeforeMount
- onMounted
- onBeforeUpdate
- onUpdated
- onBeforeUnmounte
- onUnmounted
3.如何看待Composition API和 Options API?
- Compositon API
- 更好的代码组织:逻辑相关代码在一起
- 更好的逻辑复用:逻辑复用,抽离
- 更好的类型推导
- 不建议共用, 会引起混乱
- 小型项目,逻辑简单,使用 Options API
- 中大型项目,逻辑复杂,使用 Composition API
4.如何理解ref、toRef 和 toRefs?
- 用reactive做对象的响应式, 用ref做值类型的响应式
- setup中返回toRefs(state), 或 toRef(state,'xxx')
- ref的变量命名都用xxxRef
- 合成函数返回响应式对象时,使用toRefs
- 为什么需要ref?
- 返回值类型,会丢失响应式
- 在setup, computed,合成函数都有可能返回值类型
- 为什么需要.value
- ref是一个对象(不丢失响应式),value存储值
- 通过.value属性的get和set实现响应式
- 用于模板、reactive时,不需要.value,其他情况都需要
- 为什么需要toRef和 toRefs
- 初衷:在不丢失响应式的情况下,对对象进行解构和扩散(直接使用属性名字,不用state.xx)
- 前提:针对的是响应式对象(reactive封装的)非普通的对象
- 注意:不创造响应式,而是延续响应式
5.Vue3升级了哪些重要的功能?
- createAPP: new Vue() -> Vue.createApp().use
- emits属性
- 生命周期
- 多事件: onclick里面调用多个事件
- 移除.sync
- Fragment: template中可以有多个节点
- 异步组件写法: 引入defineAsyncComponent
- 移除filter
- Teleport: 把一些组件放在body
<Teleport to='body'>
- Suspense: 实现异步loading,两个slot
- Composition API:
- reactive
- ref相关
- readonly
- watch和watchEffect
- setup
- 生命周期钩子函数
6.Composition API如何实现代码逻辑的复用?
- 抽离逻辑代码到一个函数
- 函数命名约定为 useXXX格式(与React Hooks也是)
- 在setup中用useXXX函数
- 案例:获取鼠标定位 useMousePosition
7.Vue3如何实现响应式?
- 回顾 Object.defineProperty
- 缺点:深度监听,一次性监听完成
- 缺点:没有新增,删除属性,Vue.set Vue.delete
- 缺点:无法原生监听数组
- Proxy--Reflect
- Reflect的作用
- 和Proxy能力一一对应
- 规范化、标准化、函数式
- 替代Object上的工具函数
- Proxy
- 深度监听、性能更好
- 可监听 新增、删除的属性
- 可监听数组的变化
- Proxy能规避 Object.defineProperty的问题
- Proxy无法兼容所有浏览器,无法polyfill
8.watch 和 watchEffect的区别是什么?
- 两者都可以监听data属性变化
- watch需要明确监听哪个属性
- watchEffect会根据其中的属性,自动监听其变化
9.setup中如何获取组件的实例?this
- 在setup和其他的Composition API中没有this
- 可以通过getCurrentInstance获取当前实例
- 若使用Options API可照常使用this
10.Vue3为何比Vue2快?
- Proxy响应式
- PathFlag 静态标记
- 编译模板时,给动态节点做标记
- 标记,分为不同的类型:如text,props
- diff算法时,可以区分静态节点,以及不同类型的动态节点
- hoistStatic
- 将静态节点的定义,提升到父级作用域,缓存起来
- 多个相邻的静态节点,会被合并起来
- 典型的拿空间换时间的优化策略
- catchHandler 缓存事件
- SSR优化
- 静态节点的输出,绕过vdom
- 动态节点,还是需要动态渲染
- tree-shaking
- 编译时,根据不同情况,引入不同的API
11.Vite是什么?
- vite是前端打包工具,web构建工具
- 借助vue3发展比较快,和webpack发起PK
- 优势:开发环境下,无需打包,启动非常快
- 开发环境使用ES6 Module, 不需打包, 启动非常快
<script type='module'></script>- 生成环境使用rollop,并不会快很多
12.Composition API 和 React Hooks的对比
- 前者setup只会被调用一次,后者函数会被多次调用
- 前者不需使用useMemo|useCallback. 因为setup只会调用一次
- 前者不需考虑调用顺序,后者需要保证hooks的顺序一致
- 前者reactive+ref 相当于后者 useState