目录
一、引言:
1. 性能提升:
打包大小减少41%
初次渲染快55%, 更新渲染快133%
内存减少54%
2. 推荐Composition API
简而言之,就是把同一个组件的数据和逻辑函数都放在一块(setup中)集中管理,不像vue2的options API 把各个不同的 function 分散写在统一的methods、watch和computed中,在需要修改的时候得上下横跳一一去找。
使用Proxy
代替defineProperty
实现响应式;重写虚拟DOM
的实现和Tree-Shaking
3. 开始支持 TS
4. 使用 vite 创建,优势在于:
- 开发环境中,无需打包操作,可快速的冷启动。
- 轻量快速的热重载(HMR)。
- 真正的按需编译,不再等待整个应用编译完成。
5. 移除部分方法:$on事件总线,.sync修饰符,过滤器filter等;生命周期钩子调整
二、组合式API
setup
- 理解:Vue3.0中一个新的配置项,值为一个函数。
setup
是所有Composition API(组合API)“ 表演的舞台 ”。- 组件中所用到的:数据、方法等等,均要配置在
setup
中。 setup
函数的两种返回值:- 若返回一个对象,则对象中的属性、方法, 在模板中均可以直接使用。(重点)
- 若返回一个渲染函数:则可以自定义渲染内容。(了解)
注意点:
- 尽量不要与Vue2.x配置混用
- Vue2.x配置(data、methos、computed...)中可以访问到setup中的属性、方法。
- 但在setup中不能访问到Vue2.x配置(data、methos、computed...)。
- 如果有重名,
setup
优先。
setup
不能是一个async
函数,因为返回值不再是对象, 而是promise
, 模板看不到return对象中的属性。(后期也可以返回一个Promise实例,但需要Suspense和异步组件的配合)
三、响应式
a. 原理对比
Vue2的响应式实现原理
对象类型:通过
Object.defineProperty()
对属性的读取、修改进行拦截(数据劫持)。数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。
存在问题
- 新增属性、删除属性, 界面不会更新。
- 直接通过下标修改数组, 界面不会自动更新。
解决方案
- 使用
Vue.set
、Vue.delete
或者vm.$set
、vm.$delete
这些API
- 使用
Vue3的响应式实现原理
b. vue3响应式API
1.ref
函数
- 作用: 定义一个响应式的基本类型数据
- 语法:
const xxx = ref(initValue)
- 创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。
- JS中操作数据:
xxx.value
- 模板中读取数据: 不需要
.value
,直接:<div>{{xxx}}</div>
- 备注:
- 接收的数据可以是:基本类型、也可以是对象类型。
- 基本类型的数据:响应式依靠的是类上的
getter
与setter
完成的 - 备注:
ref
也可以用来定义对象(或数组)类型数据, 它内部会自动通过reactive
转为代理对象。
2.reactive
函数
- 作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用
ref
函数) - 语法:
const 代理对象= reactive(源对象)
接收一个对象(或数组),返回一个代理对象(Proxy
的实例对象,简称proxy
对象) reactive
定义的响应式数据默认(强制)深层次- 内部基于 ES6 的
Proxy
实现,通过代理对象操作源对象内部数据进行操作。
3.toRef与toRefs
函数
作用:创建一个
ref
对象,其value值指向另一个对象中的某个属性。语法:
const name = toRef(person,'name')
应用: 要将响应式对象中的某个属性单独提供给外部使用时。
toRefs:
与toRef
功能一致,但可以批量创建多个 ref 对象,语法:toRefs(person)
4.toRow与markRaw
toRaw
- 作用:将一个由
reactive
生成的响应式对象转为普通对象。 - 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。
- 作用:将一个由
markRaw
- 作用:标记一个对象,使其永远不会再成为响应式对象。
- 应用场景:
- 有些值不应被设置为响应式的,例如复杂的第三方类库等。
- 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。
5.readonly与shallowReadonly
- 应用场景: 不希望数据被修改时。
readonly
: 让一个响应式数据变为只读的(深只读)。shallowReadonly
:让一个响应式数据变为只读的(浅只读)。
6. 响应式数据的判断
isRef
: 检查一个值是否为一个ref
对象isReactive
: 检查一个对象是否是由reactive
创建的响应式代理isReadonly
: 检查一个对象是否是由readonly
创建的只读代理isProxy
: 检查一个对象是否是由reactive
或者readonly
方法创建的代理
四、其他
1. teleport
一种将我们的组件html结构移动到指定位置的技术。
允许我们控制在DOM
中哪个父节点下渲染了HTML
,而不必求助于全局状态或将其拆分为两个组件。
2. Fragment
在Vue3中:组件可以没有根标签, 内部会将多个标签包含在一个Fragment
虚拟元素中
减少标签层级, 减小内存占用
3. Suspense
等待异步组件时渲染一些g过渡内容(loading...),优化用户体验