Vue3概述
Vue
Vue是一套用于构建用户界面的渐进式框架
Vue的优点
- 自底向上逐层运用
- 只关注视图层,易上手
- 易与第三方库或现有项目整合
- 能驱动复杂的单页面项目
Vue是MVVM(Model-View-ViewModel)架构
- View:视图层(UI用户界面)
- ViewModel:业务逻辑层(一切JS可视为业务逻辑)
- Model:数据层(存储数据、对数据的处理)
Vue2 vs Vue3
- 声明式API(Options API)写的比较分散,Vue2的写法
- 组合式API(Composition API)可以把连贯的逻辑写在一起,或者封装成hook
Vue3新特性
重写双向数据绑定
Vue2
基于Object.defineProperty()
实现
需要使用一个备份对象
需要for in循环,才能给原对象每个属性都加响应式
无法监听数组变化,需要重写数组方法才能实现响应式(但实现的不完全)
代码复杂
原数据新增的属性不带响应式
原数据删除属性时不删除对应响应式
无法处理索引和length属性
1
2
3
4
5
6
7
8
9
10
11
12
13const obj = {property: 114514}
const _obj = {}
Object.defineProperty(_obj, 'property', {
get() {
console.log('有人读取property属性了')
return property in obj? obj.property: 0
},
set(value) {
console.log('有人修改property属性了,且值是'+value)
obj.property = value
}
})
Vue3
基于Proxy实现(ES6新增)
丢掉麻烦的备份数据
省去for in循环
监听数组变化
代码简化
监听动态新增的属性
监听删除的属性
监听数据的索引和length属性
1
2
3
4
5
6
7
8
9
10let proxyObj = new Proxy(obj, {
get: function(target, property) {
console.log('有人读取property属性了')
return prop in target? target[prop]: 0
},
set: function(target, property, value) {
console.log('有人修改property属性了,且值是'+value)
target[prop] = value
}
})
VDOM性能瓶颈的解决
Vue2中,每次更新diff都是全量对比
Vue3中只对比带有标记的,减少了非动态内容的对比消耗(能感受diff优化的工具)
支持Fragments
文档碎片Fragments,表示一个没有父级文件的最小文档对象,被视作轻量版Document。
它不是真实DOM树的一部分,变化不触发DOM重绘、不导致性能问题。
Fragments主要解决DOM元素的插入问题,例如:需插入多个节点时,先创建一个Fragment,把节点依次添加到Fragment上,再把Fragment添加到页面Document上,这样只会产生一次重绘;而如果直接把DOM节点依次添加到Document,就会引发多次重绘。
- Vue2:Template中只能有一个父节点,其他节点要被包在里面
- Vue3:Template里可以有多个节点,并支持了tsx和jsx写法(类似react),还新增了Suspense和teleport两个内置组件,和多v-model用法
支持Tree-shaking
Tree-shaking:代码运行结果保持不变的前提下,去掉无用代码。
- Vue2:无论使用什么功能,最终都会出现在生产代码中,Vue实例在项目中是单例的,捆绑程序无法检测到该对象的哪些属性在代码中被使用到
- Vue3:将全局API进行分块,如果不使用某些功能,就不会被包含在基础包中(不会被打包)
新增Composition API
在此基础上还有Setup语法糖式编程
评论