1 . 更好的 逻辑复用 与 代码组织 ( composition
组合式 api
)
2 . 更好的 检测类型 ( 类型推导 Typescript
支持 )
TypeScript
编译器会自动推测变量的类型。TypeScript
写的 ( TypeScript
可以让代码更加稳定, 更好的检测类型! )1 . 数据响应式 原理重新实现 ( ES6 的 proxy
替代了 ES5 的 Object.defineProperty
)
2 . 虚拟 DOM
- 新算法 (更快 更小)
3 . 提供了 composition api
, 可以更好的逻辑复用
4 . template
模板可以有多个根元素
5 . 源码用 typescript
重写, 有更好的 类型推导 (类型检测更为严格, 更稳定)
小结: vue3 性能更高, 体积更小, 更利于复用, 代码维护更方便
Composition API
options API
vue2 采用的就是 optionsAPI
优点 : 易于学习和使用
, 每个代码有着明确的位置
缺点 : 相似的逻辑, 不容易复用, 在大项目中尤为明显
注意 : 虽然 optionsAPI
可以通过 mixins
提取相同的逻辑, 但是并不好维护
Composition API
vue3 新增的就是 compositionAPI
compositionAPI
是基于 逻辑功能 组织代码的, 一个功能 api 相关放到一起
即使项目大了, 功能多了, 也能快速定位功能相关的 api
大大的提升了 代码可读性
和 可维护性
注意 : vue3 推荐使用 composition API
, 也保留了 options API
composition API
, 用 vue2 的写法也 完全兼容setup
函数composition
的使用, 需要配置一个 setup
函数
setup
函数特点
setup
函数是一个新的组件选项, 作为组件中 compositionAPI
的起点setup
会在 beforeCreate
钩子函数之前执行template
模版中需要使用的数据和函数,需要在 setup
返回
在 template
中使用
{{msg}}
注意 : setup
中不能使用 this
, this
指向 undefined
reactive
函数setup
中默认普通的数据不是响应式的, 需要用 reactive
函数
作用 : 将复杂类型数据, 转换成响应式数据 ( 返回该对象的响应式代理 )
注意 :
setup
需要有返回值, 只有返回的值才能在模板中使用reactive
函数需要按需导入才能使用
import { reactive } from 'vue'
setup ()
中
setup () {
const obj = reactive({
name: 'zs',
age: 18
})
return {
obj
}
template
模板中
{{ obj.name }}
{{ obj.age }}
ref
函数reactive
处理的数据, 必须是 复杂类型, 如果是 简单类型 无法处理成响应式, 所以有 ref
函数
作用 : 对传入的数据(一般简单数据类型),包裹一层对象, 转换成响应式。
ref 函数注意点
ref
函数接收一个的值, 返回一个 ref
响应式对象
value
: 可以获取ref响应式对象的值setup
函数中, 通过 value
属性,才可以访问到 ref
对象的值const arr = ref([])
setup ()
中
template
模板中
{{ money }}
注意 : 对象一般使用 reactive
,其他用 ref
toRef
函数setup
中直接定义的数据 , 不是响应式数据 reactive
函数 , 放的是复杂数据类型
作用 : 使用 toRef函数 , 将 reactive 函数的响应式对象中的指定属性转换为响应式数据
语法 : toRef(参数1, 参数2)
setup ()
中
template
模板中
toRefs
函数作用 : 对一个 响应式对象 的所有内部属性, 都做响应式处理, 保证展开或者解构出的数据也是响应式的( 一般配合 reactive
使用)
注意 : 对一个响应数据, 进行 解构 或者 展开, 会丢失他的响应式特性
注意 :
setup ()
中
template
模板中
{{ money }}
{{ car }}
{{ name }}
computed
函数computed 函数调用时, 要接收一个处理函数, 处理函数中, 需要返回计算属性的值
computed 是一个函数, 使用前也需要导入
import {computed} from 'vue'
基本用法
完整用法
get()
, set()
get()
方法就会被执行set()
// 2. 传入一个对象, 包括get和set
const nextAge = computed({
get() {
return +age.value + 1
},
set(value) {
age.value = value - 1
}
})
template
模板中