Vue3 Composition API的使用简介

相比vue2.0版本(Option API),Composition API(组合API)算是3.0的重大变更之一了。

Posted in Vue.js onMarch 29, 2021

概述

Composition API 主要灵感来源于React Hooks,目的是通过一组低侵入式的、函数式的 API,使得我们能够更灵活地「组合」组件的逻辑。

示例

<template>
 <div>{{count}}</div>
 <button @click="addCount">添加</button>
</template>
 
<script lang="ts">
import { defineComponent, ref, onMounted } from 'vue';
 
export default defineComponent({
 name: 'App',
 setup () {
  const count = ref(0)
  const getCount = () => {
   count.value = Math.floor(Math.random() * 10)
  }
  const addCount = () => {
   count.value++
  }
  onMounted(() => {
   getCount()
  })
 
  return {
   count,
   addCount
  }
 }
});
</script>

Composition API顾名思义就是不再传入data、mounted等参数,通过引入的ref、onMounted等方法实现数据的双向绑定、生命周期函数的执行。

为什么需要

1.在组件比较复杂的情况下,可以将逻辑代码合到一起去,而不会被option强行分隔。这提高了代码质量的上限,同时也拉低了代码质量的下限。来自官方的一张对比图:

Vue3 Composition API的使用简介

2.更好的进行复用。

在vue2中,想要复用部分逻辑的代码,都是通过mixin进去。但mixin进去的内容实际上很不直观,而且相同命名会被覆盖。而通过composition API,因为所有的方法都是引入的,可以将单独某个逻辑进行封装。例如对发送验证码倒计时功能进行封装。

<template>
 <input type="number" placeholder="请输入验证码">
 <button v-if="count">{{count}}秒后可重新发送</button>
 <button v-else @click="startCount">发送验证码</button>
</template>
 
<script lang="ts">
import { defineComponent, ref, reactive } from 'vue';
 
const userCountDown = () => {
 const count = ref(0)
 const countDown = (num: number) => {
  count.value = num
  num--
  if (num > 0) {
   setTimeout(() => {
    countDown(num)
   }, 1000)
  }
 }
 const startCount = () => {
  // get verifyCode
  countDown(60)
 }
 
 return { count, startCount }
}
 
export default defineComponent({
 name: 'Home',
 setup () {
  const { count, startCount } = userCountDown()
  return { count, startCount }
 }
});
</script>

3.更好的typescript支持。不会再往vue原型上添加很多内容,而是通过引入的方式,类型定义会更清晰。

setup

setup是vue新增的一个选项,它是组件内使用Composition API的入口。setup是在创建vue组件实例并完成props的初始化之后执行。因为setup会在option api解析之前被调用,所以setup中的this会与options中得完全不一样。为了避免混乱,在setup中不使用this。同时setup返回的值,可以在模板和其他option中使用。从设计上来说,vue官方是将所有的事情在setup里完成。setup返回值连接的是template模板与方法。

ref、reactive

既然不在传入data,那么将数据创建和监听响应式就需要通过vue暴露出来的功能 ref或reactive。两者有所区别,ref用于基础赋值类型的数据,而reactive用于引用类型的数据。

其中基础赋值类型的值,在setup方法中,需要用 .value的方式进行获取和修改。因为赋值类型的值如果return出去返回值,就失去了数据的双绑定。但是在template中,可以进行直接访问。

<template>
 <div>{{count}}
  <button @click="changeCount">添加</button>
 </div>
 <div>学生的姓名是:{{student.name}}</div>
 <div>学生的年龄是:{{student.age}}
  <button @click="changeStudentAge(20)">添加</button>
 </div>
</template>
 
<script lang="ts">
import { defineComponent, ref, reactive } from 'vue';
 
export default defineComponent({
 name: 'Home',
 setup () {
  const count = ref(0)
  const changeCount = () => {
   count.value = count.value + 1
  }
  const student = reactive({
   name: 'Bob',
   age: 12
  })
  const changeStudentAge = (age: number) => {
   student.age = age
  }
  return {
   count,
   changeCount,
   student,
   changeStudentAge
  }
 }
});
</script>

computed与watch

<template>
 <div>{{count}}</div>
 <div>{{doubleCount}}</div>
 <button @click="addCount">添加</button>
</template>
 
<script lang="ts">
import { defineComponent, ref, computed, watchEffect, watch } from 'vue';
 
export default defineComponent({
 name: 'App',
 setup () {
  const count = ref(0)
  watch(count, () => { // 如多个则用数组的方式传入[count, count1]
   console.log('watch', count.value)
  })
  watchEffect(() => {
   console.log('watchEffect', count.value)
  })
  const addCount = () => {
   count.value++
  }
  const doubleCount = computed(() => {
   return count.value * 2
  })
  return {
   count,
   doubleCount,
   addCount
  }
 }
});
</script>

watch与watchEffect的差别是,watchEffect会立马执行,执行中被读取的响应式 数据会被观测。而watch只有在watch对象有变化时才会执行。

生命周期

  • beforeCreate -> 使用 setup()
  • created -> 使用 setup()
  • beforeMount -> onBeforeMount
  • mounted -> onMounted
  • beforeUpdate -> onBeforeUpdate
  • updated -> onUpdated
  • beforeDestroy -> onBeforeUnmount
  • destroyed -> onUnmounted
  • errorCaptured -> onErrorCaptured

以上就是Vue3 Composition API的使用简介的详细内容。

Vue.js 相关文章推荐
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
vue集成一个支持图片缩放拖拽的富文本编辑器
Jan 29 Vue.js
vue 实现click同时传入事件对象和自定义参数
Jan 29 Vue.js
详解Vue的options
May 15 Vue.js
如何理解Vue简单状态管理之store模式
May 15 Vue.js
vue使用节流函数的踩坑实例指南
May 20 Vue.js
Vue + iView实现Excel上传功能的完整代码
Jun 22 Vue.js
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 Vue.js
vue如何实现关闭对话框后刷新列表
Apr 08 Vue.js
vue.js 使用原生js实现轮播图
Apr 26 Vue.js
vue使用element-ui按需引入
May 20 Vue.js
vue如何清除浏览器历史栈
May 25 Vue.js
vue+django实现下载文件的示例
vue路由实现登录拦截
vue项目实现分页效果
Mar 24 #Vue.js
vue实现倒计时功能
Mar 24 #Vue.js
vue 中 get / delete 传递数组参数方法
Mar 23 #Vue.js
使用Vue.js和MJML创建响应式电子邮件
vue+flask实现视频合成功能(拖拽上传)
Mar 04 #Vue.js
You might like
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
php验证邮箱和ip地址最简单方法汇总
2015/10/30 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
vue将data恢复到初始状态 &amp;&amp; 重新渲染组件实例
2020/09/04 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
TensorFlow深度学习之卷积神经网络CNN
2018/03/09 Python
详解Python with/as使用说明
2018/12/13 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
python同步两个文件夹下的内容
2019/08/29 Python
Python 变量的创建过程详解
2019/09/02 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
英文简历中的自荐信范文
2013/12/14 职场文书
音乐教学案例
2014/01/30 职场文书
协议书样本
2014/04/23 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
golang json数组拼接的实例
2021/04/28 Golang