Vue3比Vue2有什么优势?
- 性能更好
- 体积更小
- 更好的ts支持
- 更好的代码组织
- 更好的逻辑抽离
- 更多新功能
描述Vue3生命周期
Options API生命周期
- beforeDestroy改为beforeUnmount
- destroyed改为unmounted
- 其他沿用Vue2的生命周期
Composition API生命周期
setup相当于是beforeCreate和Created,其他的和Options API一样的
如何看待Composition API和Options API?
Composition API带来了什么?
- 更好的代码组织
- 更好的逻辑复用(有一道专门的面试题)
Composition API和Options API如何选择?
- 不建议共用,会引起混乱
- 小型项目、业务逻辑简单,用Options API
- 中大型项目、逻辑复杂,用Composition API
别误解Composition API
- Composition API属于高阶技巧,不是基础必会
- Composition API是为解决复杂业务逻辑而设计
- Composition API就像Hooks在React中的地位
如何理解ref toRef 和 toRefs?
- 是什么
- 最佳使用方式
- 进阶,深入理解
ref
- 生成值类型的响应式数据
- 可用于模板和reactive
- 通过.value修改值
toRef
- 针对一个响应式对象(reactive封装)的prop
- 创建一个ref,具有响应式
- 两者保持引用关系
- toRef如果用于普通对象(非响应式对象),产出的结果不具备响应式
toRefs
- 将响应式对象(reactive封装)转换为普通对象
- 对象的每个prop都是对应的ref
- 两者保持引用关系
最佳使用方式
- 用reactive做对象的响应式,用ref做值类型响应式
- setup中返回toRefs(state),或者toRef(state,'xxx')
- ref的变量命名都用xxxRef
- 合成函数返回响应式对象时,使用toRefs
进阶,深入了解
- 为何需要Ref?
- 返回值类型,会丢失响应式
- 如在setup、computed、合成函数,都有可能返回值类型
- Vue如不定义ref,用户将自造ref,反而混乱
- 为何需要.value?
- ref是一个对象(不丢失响应式),value存储值
- 通过.value属性的get和set实现响应式
- 用于模板、reactive时,不需要.value,其他情况都需要
function computed(getter){
const ref = {
value:null
}
setTimeout(()=>{
ref.value = getter()
},1500);
return ref;
}
let a = {};
a = computed(()=>100);
- 为何需要toRef toRefs?
- 初衷:不丢失响应式的情况下,把对象数据分解/扩散
- 前提:针对的是响应式对象(reactive封装的)非普通对象
- 注意:不创造响应式,而是延续响应式
Vue3升级了哪些重要的功能?
参考:v3.cn.vuejs.org/guide/migra…
Composition API如何实现代码逻辑复用?
- 抽离逻辑代码到一个函数
- 函数命名约定为 useXxxx格式(React Hooks也是)
- 在setup中引用useXxxx函数
Vue3如何实现响应式?
回顾Vue2.x的Object.defineProperty
- 深度监听需要一次性递归
- 无法监听新增属性/删除属性,需要Vue.set和Vue.delete解决
- 无法原生监听数组,需要特殊处理
Vue3 如何用Proxy实现响应式
- 深度监听,性能更好
- 可监听,新增/删除属性
- 可监听数组变化
Reflect作用
- 和Proxy能力一一对应
- 规范化、标准化、函数式
- 替换掉Object上的工具函数
- Proxy能规避Object.defineProperty的问题
- Proxy无法兼容所有浏览器,无法polyfill
v-model参数的用法
watch和watchEffect的区别是什么?
- 两者都可监听data属性变化
- watch需要明确监听哪个属性
- watchEffect会根据其中的属性,自动监听其变化
setup中如何获取组件实例?
- 在setup和其他Composition API中没有this
- 可通过getCurrentInstance获取当前实例
- 若使用Options API可照常使用this
Vue3如何比Vue2快?
- Proxy响应式
- PatchFlag
- 编译模板时,动态节点做标记
- 标记,分为不同的类型,如TEXT SPORTS
- diff算法时,可以区分静态节点,以及不同类型的动态节点
- hoistStatic
- 将静态节点的定义,提升到父作用域,缓存起来
- 多个相邻的静态节点,会被合并起来
- 典型的拿空间换时间的优化策略
- cacheHandler
- 缓存事件
- SSR优化
- 静态节点直接输出,绕过了vdom
- 动态节点,还是需要动态渲染
- tree-shaking
- 编译时,根据不同的情况,引入不同的API
Vite是什么?
- 一个前端打包工具,Vue作者发起的项目
- 借助Vue的影响力,发展较快,和webpack竞争
- 优势:开发环境使用ES6 Module,无需打包(webpack需要将es6编译为es5) ---- 非常快
- 生产环境使用rollup,并不会快很多
Composition API和React Hooks的对比
- 前者setup只会被调用一次,而后者函数会被多次调用
- 前者无需useMemo useCallback,因为setup只调用一次
- 前者无需顾虑调用顺序,而后者需要保证hooks的顺序一致
- 前者reactive + ref比后者useState,要难理解