什么是Composition API
Composition API 又叫作组合式 API,理解组合式 API 需要先回顾 Vue2.X 是如何做功能开发的。在 Vue2 中,功能开发需要分散到 data 属性、methods 属性及 computed 属性中,代码如下。
export default {
data() {
return {
// 定义 data 接收数据
data: []
};
},
methods: {
// 发送 ajax 获取服务器端数据
// 接收到的数据赋值给 data 属性
getdata() {}
},
computed() {}
};
每一个功能模块的开发至少需要分散到 data 属性和 methods 属性,这种形式叫作 Options API。随着项目的扩大,功能模块会分散到各个属性中,导致代码的可阅读性和可维护性极差,并且很难进行代码复用。
Composition API 主要用来解决上述问题,可以把每个功能都写在一起,或者单独写在函数中,不会出现功能分散的问题,这样就提高了代码的可阅读性和可维护性,因为功能模块可以写在函数中,从而提高了代码的复用性。
setup函数的特点
在 Vue3 项目中,setup() 函数是 Composition API 的入口函数,也是 Vue3 中新增的函数,setup() 函数的主要特点有以下 3 个。
-
setup 函数类似于生命周期,它在 beforeCreate 生命周期之前自动调用。
-
setup 函数中没有 this。
-
setup 函数中的数据或者方法都需要 return 出去。
案例:定义数字变量,单击按钮数字加 1。
错误代码的演示如下。
<template>
<div>
<h1>{{ num }}</h1>
<button @click="addOne">加1</button>
</div>
</template>
<script>
export default {
setup() {
// 1. 定义数字变量
var num = 10;
// 2. 定义方法
function addOne() {
num++;
console.log(num);
}
// 3. 将数据和方法 return 出去,只有 return 出去,其在模板中才能使用
return {
num,
addOne
};
}
};
</script>
代码解析如下。
运行代码,单击自增按钮,发现控制台中的 num 发生变化,但是页面中的 num 没有改变。
结论:使用 var 或者 let 定义的数据都不具有响应式功能,或者说不具有双向数据绑定功能。
定义响应式数据
响应式数据的定义方法有两种:一种是定义基本数据类型,如数字类型、字符串类型等;另一种是定义复合数据类型,如数组、对象。
12.2.1 节案例的正确代码如下。
<template>
<div>
<h1>{{ num }}</h1>
<button @click="addOne">加1</button>
</div>
</template>
<script>
import { ref } from "vue";
export default {
setup() {
// 1. 定义响应式数字
var num = ref(10);
// 2. 定义方法
function addOne() {
console.log(num); // 打印出一个对象
num.value++;
}
return {
num,
addOne
};
}
};
</script>
代码解析如下。
使用 ref 函数将普通数据变成响应式数据。
ref 函数的使用步骤如下。
(1)引入 ref 函数。
import { ref } from "vue";
(2)ref 函数的返回值是对象,即控制台打印的 num 是对象。
{
__v_isRef: true
_rawValue: 11
_shallow: false
_value: 11
}
(3)M 层最终需要的值在 value 属性下,所以使用 .value
获取具体值。
(4)视图层不需要 .value
获取值,在视图层会自动找到 value 值,视图层直接使用插值表达式 {{num}}
即可。