10分钟快速上手Composition API(setup 语法糖写法)

简介: 写习惯了composition API后,确实比Options API好用。本篇文章就介绍的一些简单的用法
Hi~,我是 一碗周,一个在舒适区垂死挣扎的前端,如果写的文章有幸可以得到你的青睐,万分有幸~

写在前面

我们在写Vue2的时候,编写组件的方式是使用Options API,这种方式的特点就是在对应的属性编写对应的功能模块,例如在data中定义数据、methods定义方法等;这种方法的弊端就是同一功能的代码逻辑被拆分到各个属性中,影响代码的阅读

Vue3中提供的Composition API可以帮助我们优雅的组织我们的代码,让相关功能的代码更加有序的组织在一起,可以参考『做了一夜动画,就为让大家更好的理解Vue3的Composition Api』,采用动画的方式讲解了Composition API。

接下来我们就来介绍一个如何采用Composition API的方式编写代码。

注:本篇文章全部基于 <script setup>的方式介绍与编写,这样写的好处就是在 <script setup>中定义的内容可以在模板中直接使用。

响应式数据

在Vue3中创建响应式的数据主要是通过reactiveref这两个API实现的,现在我们就来依次学习一下这两个以及相关的API。

reactive

reactive API用于创建响应式的对象或者数组,实际上该方法的内部就是基于ES6的Proxy实现的。

如下代码展示了reactive API的用法:

<template>
  <h3>信息展示组件</h3>
  <div style="margin: 24px 0">
    <span>姓名:</span>
    <span>{{ data.name }}</span>
    <br />
    <span>年龄:</span>
    <span>{{ data.age }}</span>
  </div>
  <button @click="data.name = '一碗周'">修改姓名</button>
  <br />
  <button @click="data.age = '20'">修改年龄</button>
</template>
<script setup>
// 使用 <script setup> 所有的 API 需要单独引入,除 Vue3.2 自动引入的几个API外。
import { reactive } from 'vue'
// 创建响应式对象
const data = reactive({
  name: '一碗粥',
  age: '18',
})
</script>

运行结果如下:

reactive API demo.gif

Vue中还提供了一个isReactive,该API用于检测是否为reactive创建的响应式代理。

Ref API

我们使用reactive只能对Object或者Array类型的数据进行劫持,如果我们想要对普通数据类型的数据进行劫持,可以使用ref API,例如如下代码:

<template>
  <h3>信息展示组件</h3>
  <div style="margin: 24px 0">
    <span>姓名:</span>
    <!-- 在模板中,Vue 会自动帮助我们为 ref 进行解包,所以不需要使用 ref.value 的形式 -->
    <span>{{ name }}</span>
    <br />
    <span>年龄:</span>
    <span>{{ age }}</span>
  </div>
  <button @click="handleEditName">修改姓名</button>
  <br />
  <button @click="handleEditAge">修改年龄</button>
</template>
<script setup>
// 导入 ref
import { ref } from 'vue'
// 创建响应式对象
const name = ref('一碗粥')
const age = ref('18')
const handleEditName = () => {
  // 通过 ref 创造的响应式对象,我们需要通过 ref.value 的方式访问
  name.value = '一碗周'
}
const handleEditAge = () => {
  age.value = '20'
}
</script>

代码运行结果与上面相同。

readonly

有时我们希望我们传递给其他组件数据时,往往希望其他组件使用我们传递的内容,但是不允许它们修改,这个时候就可以使用readonly API,该API可以创建一个不可修改的对象。

我们看下面这段代码:

import { ref, readonly } from 'vue'
// 创建响应式对象
const name = ref('一碗粥')
const age = ref('18')
const readonlyName = readonly(name)
const handleEditName = () => {
  // 通过 ref 创造的响应式对象,我们需要通过 ref.value 的方式访问
  name.value = '一碗周'
}
const handleEditAge = () => {
  age.value = '20'
}

我们修改name时,readonlyName的值也会跟着进行改变,但是直接修改readonlyName并不会生效。

toRefs和toRef

toRefstoRef用于将reactive创建的响应式代码解构成响应式的数据;如果直接使用ES6的语法进行解构,解构出的数据并不是响应式的。

例如下面这段代码:

import { toRefs, reactive } from 'vue'
const user = reactive({ name: '一碗粥', age: '18' })
// user 下的属性通过 toRefs 与解构后的数据建立了链接,任何一个修改都会引起另一个的变化
const { name, age } = toRefs(user)
const handleEditName = () => {
  name.value = '一碗周'
}
const handleEditAge = () => {
  age.value = '20'
}

如果想解构单个数据可以使用toRef,示例代码如下:

const name = toRef(user, 'name')
const age = toRef(user, 'age')

计算属性

在Composition API中定义计算属性是通过computed方法实现,它可以接受两种参数,一个是getter函数,另一个是包含getset函数的对象;computed返回一个ref对象。

如下代码展示接收getter函数时,计算属性的用法:

import { ref, computed } from 'vue'
const name = ref('一碗周')
const age = ref('18')
// 定义计算属性
const user = computed(() => {
  return `姓名:${name.value}\n年龄:${age.value}`
})

上面的代码中当name或者age发生变化时,user也会进行变化。

computed方法接受对象参数时,最常见的场景就是组件实现v-model的功能,示例代码如下所示:

<template>
  <input type="text" v-model="myName" />
</template>
<script setup>
// 引入需要的方法
import { defineProps, defineEmits, computed } from 'vue'
// 定义 props
const props = defineProps({
  name: String,
})
// v-model 规定写法 update:name name->需要v-model的名称
const emit = defineEmits(['update:name'])
// 定义计算属性
const myName = computed({
  get() {
    return props.name
  },
  set(val) {
    emit('update:name', val)
  },
})
</script>

上面的代码展示了如何在computed方法传递对象参数。

监听器

Vue3的composition API中提供了两个用于监听数据变化的API,分别是watchEffect(Vue3.2中新增了watchPostEffectwatchSyncEffect API,这两个都是watchEffect的别名,附带指定选项而已)和watch,这两者的区别如下:

  • watchEffect用于自动收集响应式数据的依赖;
  • watch需要手动指定监听的数据源;

生命周期

Vue3的composition API没有生命周期钩子选项,但是提供了onBeforeMountonMounted等函数来注册声明周期钩子,提供的声明周期函数如下表所示:

选项式 API Hook inside setup 触发时机
beforeMount onBeforeMount 组件挂载之前触发
mounted onMounted 组件挂载后触发
beforeUpdate onBeforeUpdate 组件更新之前触发
updated onUpdated 组件更新后触发
beforeUnmount onBeforeUnmount 组件卸载之前触发
unmounted onUnmounted 组件卸载后触发

如下代码展示了部分API的用法:

import { onMounted, onUpdated, onUnmounted } from 'vue'
onMounted(() => {
  console.log('onMounted')
})
onUpdated(() => {
  console.log('onUpdated')
})
onUnmounted(() => {
  console.log('onUnmounted')
})

模板ref($refs的代替品)

由于Vue3的composition API无法使用this,所以说this.$refs并不可以用,那我们怎么获取到组件或者元素呢?其实非常简单,我们需要定义个ref对象,名称与模板中ref属性的名称一致即可。

示例代码如下:

<template>
  <h3 ref="nameRef">一碗周</h3>
</template>
<script setup>
import { ref, onMounted } from 'vue'
const nameRef = ref(null)
onMounted(() => {
  console.log(nameRef.value) // <h3>一碗周</h3>
})
</script>

写在最后

写习惯了composition API后,确实比Options API好用。本篇文章就介绍的一些简单的用法,复杂用法以及细节其实在Vue文档中写的非常详细,本篇文章主要是入门composition API

目录
相关文章
|
17天前
|
JavaScript 前端开发 API
Vue 3新特性详解:Composition API的威力
【10月更文挑战第25天】Vue 3 引入的 Composition API 是一组用于组织和复用组件逻辑的新 API。相比 Options API,它提供了更灵活的结构,便于逻辑复用和代码组织,特别适合复杂组件。本文将探讨 Composition API 的优势,并通过示例代码展示其基本用法,帮助开发者更好地理解和应用这一强大工具。
22 1
|
1月前
|
缓存 JavaScript 前端开发
深入理解 Vue 3 的 Composition API 与新特性
本文详细探讨了 Vue 3 中的 Composition API,包括 setup 函数的使用、响应式数据管理(ref、reactive、toRefs 和 toRef)、侦听器(watch 和 watchEffect)以及计算属性(computed)。我们还介绍了自定义 Hooks 的创建与使用,分析了 Vue 2 与 Vue 3 在响应式系统上的重要区别,并概述了组件生命周期钩子、Fragments、Teleport 和 Suspense 等新特性。通过这些内容,读者将能更深入地理解 Vue 3 的设计理念及其在构建现代前端应用中的优势。
31 0
深入理解 Vue 3 的 Composition API 与新特性
|
2月前
|
存储 JavaScript 前端开发
敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
该文章深入探讨了Vue3中Composition API的关键特性,包括`ref`、`toRef`、`toRefs`的使用方法与场景,以及它们如何帮助开发者更好地管理组件状态和促进逻辑复用。
敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
|
1月前
|
JavaScript API
|
22天前
|
API
《vue3第四章》Composition API 的优势,包含Options API 存在的问题、Composition API 的优势
《vue3第四章》Composition API 的优势,包含Options API 存在的问题、Composition API 的优势
25 0
|
3月前
|
前端开发 JavaScript API
Vue 3 新特性:在 Composition API 中使用 CSS Modules
Vue 3 新特性:在 Composition API 中使用 CSS Modules
|
3月前
|
JavaScript 前端开发 API
Vue.js 3.x新纪元:Composition API引领潮流,Options API何去何从?前端开发者必看的抉择指南!
【8月更文挑战第30天】Vue.js 3.x 引入了 Composition API,为开发者提供了更多灵活性和控制力。本文通过示例代码对比 Composition API 与传统 Options API 的差异,帮助理解两者在逻辑复用、代码组织、类型推断及性能优化方面的不同,并指导在不同场景下的选择。Composition API 改善了代码可读性和维护性,尤其在大型项目中优势明显,同时结合 TypeScript 提供更好的类型推断和代码提示,减少错误并提升开发效率。尽管如此,在选择 API 时仍需考虑项目复杂性、团队熟悉度等因素。
51 0
|
4天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
16天前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。
|
17天前
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应

热门文章

最新文章