https://composition-api.vuejs.org/zh/api.html
(1)使用vue-cli创建
## 安装或者升级
npm install -g @vue/cli
## 保证 vue cli 版本在 4.5.0 以上
vue --version
## 创建项目
vue create my-project
(2)使用vite创建【npm init vite-app 项目名称】
setup是新的option, 所有的组合API函数都在此使用, 只在初始化时执行一次
【setup执行时机】
在beforeCreate之前执行(一次), 此时组件对象还没有创建;
setup中,this是undefined, 不能通过this来访问data/computed/methods / props,其实所有的composition API相关回调函数中也都不可以。
【setup的返回值】
setup返回值是一个对象,内部的属性和方法是给html模板使用的。
setup中的对象内部的属性和data函数中的return对象的属性都可以在html模板中使用。
setup中返回对象中的属性会与data函数返回对象的属性合并成为组件对象的属性,返回对象中的方法会与methods中的方法合并成功组件对象的方法
在vue3中尽量不要混合使用data和setup及methods和setup。methods中可以访问setup提供的属性和方法, 但在setup方法中不能访问data和methods
setup不能是一个async函数: 因为返回值不再是return的对象, 而是promise, 模板看不到return对象中的属性数据。
【setup的参数】
setup(props, context) 或setup(props, {attrs, slots, emit})
props: 包含props配置声明且传入了的所有属性的对象
attrs: 包含没有在props配置中声明的属性的对象, 相当于 this.$attrs
slots: 包含所有传入的插槽内容的对象, 相当于 this.$slots
emit: 用来分发自定义事件的函数, 相当于 this.$emit
ref与reactive--vue3中的两个最重要的响应式的API
(1)ref
ref作用:定义一个数据的响应式,用来处理基本类型数据。
语法:【const user=ref(xxx)】
通过给value属性添加getter/setter来实现对数据的劫持。
注意:js中操作数据【user.value】模板中操作数据【user】,不需要.value
用ref对象/数组, 内部会自动将对象/数组转换为reactive的代理对象。
ref的另外一个作用:获取元素-利用ref函数获取组件中的标签元素
ref的另一个作用:获取组件中的标签元素
(2)reactive
reactive作用: 定义多个数据的响应式,用来处理对象(递归深度响应式:响应式转换是“深层的”:会影响对象内部所有嵌套的属性)。
通过使用Proxy来实现对对象内部所有数据的劫持, 并通过Reflect操作对象内部数据。
语法:【const proxy = reactive(obj)】 接收一个普通对象然后返回该普通对象的响应式代理器对象
内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据都是响应式的。
vue2 和 vue3响应式对比
|
核心 |
存在的问题 |
vue2的响应式 |
对象: 通过defineProperty对对象的已有属性值的读取和修改进行劫持(监视/拦截) |
对象直接新添加的属性或删除已有属性, 界面不会自动更新 |
数组: 通过重写数组更新数组一系列更新元素的方法来实现元素修改的劫持 |
直接通过下标替换元素或更新length, 界面不会自动更新 |
|
vue3的响应式 |
通过Proxy(代理): 拦截对data任意属性的任意(13种)操作, 包括属性值的读写, 属性的添加, 属性的删除等... 通过 Reflect(反射): 动态对被代理对象的相应属性进行特定的操作 |
|
vue2中html模板中必须要有一对根标签,vue3组件html模板中可以没有根标签
实现方法
vue2
vue3: setup是组合API的入口函数
通过Proxy(代理): 拦截对data任意属性的任意(13种)操作, 包括属性值的读写, 属性的添加, 属性的删除等,通过 Reflect(反射): 动态对被代理对象的相应属性进行特定的操作。
响应式的原理