Composition API对⽐Options API

110 阅读3分钟

语法介绍

我们在写Vue2的时候,编写组件的⽅式是使⽤Options API,这种⽅式的特点就是在对应的属性编写对应的功能模块,例如在data中定义数据、methods定义⽅法等;这种⽅法的弊端就是同⼀功能的代码逻辑被拆分到各个属性中,影响代码的阅读。随着业务复杂度越来越⾼,代码量会不断的加⼤;由于相关业务的代码需要遵循option的配置写到特定的区域,导致后续维护⾮常的复杂,代码可复⽤性也不⾼。

随着业务复杂度越来越⾼,代码量会不断的加⼤;由于相关业务的代码需要遵循option的配置写到特定的区域,导致后续维护⾮常的复杂,代码可复⽤性也不⾼。

显然我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在⼀起

语法对⽐

响应式数据

在Vue3中创建响应式的数据主要是通过reactive和ref这两个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>

ref

我们使⽤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>

函数

特别注意的是,setup的语法中是没有this的,因此取变量值的时候不需要使⽤this调⽤

Options API

<template>

<div>

<!-- `greet` 是上⾯定义过的⽅法名 -->

<button @click="greet">Greet</button>

</div>

</template>

<script>

export default {

// 定义属性

data() {

return {

name: 'Vue.js'

}

},

methods: {

greet(event) {

// ⽅法中的 `this` 指向当前活跃的组件实例

alert(`Hello ${this.name}!`)

// `event` 是 DOM 原⽣事件

if (event) {

alert(event.target.tagName)

}

}

},

}

</script>

Composition API

<template>

<div>

<!-- `greet` 是上⾯定义过的⽅法名 -->

<button @click="greet">Greet</button>

</div>

</template>

<script setup>

// 导⼊ ref

import { ref } from 'vue'

const name = ref('Vue.js')

function greet(event) {

alert(`Hello ${name.value}!`)

// `event` 是 DOM 原⽣事件

if (event) {

alert(event.target.tagName)

}

}

</script>

计算属性

在Composition API中定义计算属性是通过computed⽅法实现,返回⼀个ref对象。

计算属性的⽤法:

Options API

computed: {

badgeNum() {

// 筛选todosArray中status为1的元素的个数

return this.todosArray.filter(item => item.status === 1).length

},

noDeleteArray() {

// 筛选出todsArray中status不等于0的元素

return this.todosArray.filter(item => item.status !== 0)

}

},

Composition API

import { ref, computed } from 'vue'

const name = ref('⼀碗周')

const age = ref('18')

// 定义计算属性

const user = computed(() => {

return `姓名:${name.value}\n年龄:${age.value}`

})

侦听

Options API

watch:{

n(){

console.log('n变了')

}

},

Composition API

<script setup>

import { ref, watch } from 'vue'

const n = ref('')

// 可以直接侦听⼀个 ref

watch(n, (newValue,oldValue)=>{

console.log('新值:'+newValue,'原值:'+oldValue)

})

</script>

⽣命周期

import { onMounted, onUpdated, onUnmounted } from 'vue'

onMounted(() => {

console.log('onMounted')

})

onUpdated(() => {

console.log('onUpdated')

})

onUnmounted(() => {

console.log('onUnmounted')

})