Vue 3不仅带来了性能的提升,还引入了一个新的组合式API,旨在解决选项式API在复杂组件中遇到的问题。下面,我们将通过具体示例,对比和分析两种API的使用差异,并探讨组合式API的设计理念。
在选项式API中,我们通过data
来声明组件的响应式状态。
<script>
export default {
data() {
return {
count: 0
};
}
};
</script>
选项式API通过一个集中的data
函数返回所有状态,便于快速查找和管理。
组合式API利用ref
或reactive
来声明响应式状态。
<script setup>
import { ref } from 'vue';
const count = ref(0);
</script>
在组合式API中,<script setup>
提供了一种更简洁的方式来定义组件的逻辑。通过ref
或reactive
,我们可以将状态的声明更紧密地关联到它们被使用的地方,这使得逻辑更加模块化和可重用。
选项式API中,方法被定义在methods
选项内。
<script>
export default {
methods: {
increment() {
this.count++;
}
}
};
</script>
这种方式使得方法能够通过this
访问组件的状态和其他方法,所有方法都被组织在一起。
在组合式API中,方法被定义为局部函数。
<script setup>
const increment = () => {
count.value++;
};
</script>
使用组合式API时,方法可以直接定义在<script setup>
中,更接近原生JavaScript的函数定义,这样做提高了函数的可测试性和可重用性。通过减少对this
的依赖,方法的独立性得到加强,也便于与其他逻辑片段共享。
选项式API中,计算属性被定义在computed
选项里。
<script>
export default {
data() {
return {
firstName: 'John',
lastName: 'Doe'
};
},
computed: {
fullName() {
return `${this.firstName} ${this.lastName}`;
}
}
};
</script>
通过定义在computed
中,Vue为每个计算属性创建了一个响应式的getter,使得它们在依赖变更时自动更新。
在组合式API中,计算属性通过computed
函数创建。
<script setup>
import { ref, computed } from 'vue';
const firstName = ref('John');
const lastName = ref('Doe');
const fullName = computed(() => `${firstName.value} ${lastName.value}`);
</script>
这里,computed
函数使得定义计算属性更加直观,也更容易控制依赖。组合式API允许开发者在逻辑相关的代码附近声明计算属性,提高了代码的可读性。
选项式API中使用watch
选项。
<script>
export default {
watch: {
count(newValue) {
console.log(`count变化了,现在是${newValue}`);
}
}
};
</script>
watch
选项允许我们定义一个侦听器,当指定的数据变化时执行回调。
组合式API中使用watch
函数。
<script setup>
import { watch } from 'vue';
watch(count, (newValue) => {
console.log(`count变化了,现在是${newValue}`);
});
</script>
与选项式API不同,watch
函数在组合式API中被定义为顶级的API,这使得它更易于从组件逻辑中分离和重用。watch
函数的使用提供了更多控制,并且由于是基于函数的,它可以很容易地组合其他响应式状态和逻辑。
选项式API直接将生命周期钩子作为组件选项。
<script>
export default {
mounted() {
console.log('组件挂载完成');
}
};
</script>
生命周期钩子作为选项,易于识别,但是在处理多个钩子时,代码会分散到不同位置。
组合式API中使用特定的钩子函数。
<script setup>
import { onMounted } from 'vue';
onMounted(() => {
console.log('组件挂载完成');
});
</script>
在组合式API中,生命周期钩子被作为函数导入,这样不仅代码更加一致,也更容易将相关的生命周期钩子和逻辑组织在一起,有助于提升代码的清晰度和模块性。
—— 评论区 ——