当前位置:  首页>> 技术小册>> Vue.js从入门到精通(三)

12.2 setup() 函数:Vue 3 组件的核心舞台

在Vue 3中,setup()函数是组件内使用Composition API的入口点,它标志着Vue组件开发方式的一次重大变革。相比Vue 2的Options API,Composition API通过setup()函数提供了一种更加灵活、逻辑复用的方式来组织组件代码。在本章中,我们将深入探讨setup()函数的各个方面,包括其基础用法、生命周期钩子、响应式引用、计算属性、侦听器和组件通信等。

12.2.1 setup()函数基础

setup()函数是组件中所有Composition API调用的起点。它在组件被创建之前被调用,并且是beforeCreatecreated生命周期钩子之前被调用的唯一生命周期函数。setup()函数接收两个参数:propscontext

  • props:一个包含组件外部传入的所有props的对象。这个对象在组件内部是响应式的,但你不能解构它,否则将失去响应性。
  • context:一个普通的JavaScript对象,提供了组件实例上的属性如attrsslotsemit等。这允许你在setup()函数内部访问这些属性和方法。
  1. <template>
  2. <div>{{ count }}</div>
  3. <button @click="increment">Increment</button>
  4. </template>
  5. <script>
  6. import { ref } from 'vue';
  7. export default {
  8. props: {
  9. initialCount: Number
  10. },
  11. setup(props, { emit }) {
  12. const count = ref(props.initialCount);
  13. function increment() {
  14. count.value++;
  15. emit('update:count', count.value);
  16. }
  17. return {
  18. count,
  19. increment
  20. };
  21. }
  22. };
  23. </script>

在上面的例子中,setup()函数接收了props并基于initialCount prop创建了一个响应式的count引用。然后,定义了一个increment函数来更新count的值,并通过emit方法触发一个自定义事件。最后,通过返回对象,使得countincrement在模板中可用。

12.2.2 响应式引用与计算属性

setup()函数中,我们经常使用refreactive来创建响应式状态。ref用于基本数据类型,而reactive用于对象或数组。

  • ref:通过ref创建的响应式数据是一个对象,该对象包含一个.value属性来存储实际的值。
  • reactivereactive允许你直接以响应式方式操作对象或数组,无需.value属性。
  1. import { ref, reactive, computed } from 'vue';
  2. setup() {
  3. const count = ref(0);
  4. const user = reactive({ name: 'Alice', age: 30 });
  5. const fullName = computed(() => {
  6. return `${user.name} ${user.surname || ''}`;
  7. });
  8. return {
  9. count,
  10. user,
  11. fullName
  12. };
  13. }

在上面的代码中,我们还使用了computed来创建一个计算属性fullName,它基于user对象动态生成全名。计算属性是基于它们的依赖进行缓存的,只有当依赖项发生变化时才会重新计算。

12.2.3 侦听器与副作用

在Vue 3中,侦听器通过watchwatchEffect函数实现,它们在setup()函数中广泛使用来观察响应式数据的变化并执行副作用。

  • watch:允许你侦听一个或多个响应式引用或getter函数,并在它们变化时执行回调函数。你可以选择是否深度侦听对象或数组内部的变化。
  • watchEffect:在响应式数据变化时自动重新运行,不需要明确指定依赖项。它更适合于执行自动重新运行的副作用。
  1. import { ref, watch, watchEffect } from 'vue';
  2. setup() {
  3. const count = ref(0);
  4. watchEffect(() => {
  5. console.log(`count is: ${count.value}`);
  6. });
  7. watch(count, (newValue, oldValue) => {
  8. console.log(`count changed from ${oldValue} to ${newValue}`);
  9. }, { immediate: true, deep: false });
  10. return {
  11. count
  12. };
  13. }

12.2.4 生命周期钩子

虽然setup()函数替代了Vue 2中的beforeCreatecreated生命周期钩子,但你仍然可以在setup()函数内部通过onMountedonUpdated等Composition API提供的生命周期钩子来访问组件的生命周期。

  1. import { onMounted, onUpdated, ref } from 'vue';
  2. setup() {
  3. const count = ref(0);
  4. onMounted(() => {
  5. console.log('Component is mounted!');
  6. });
  7. onUpdated(() => {
  8. console.log('Component updated!');
  9. });
  10. return {
  11. count
  12. };
  13. }

12.2.5 组件通信

setup()函数中,组件间的通信主要通过propsemit以及provide/inject实现。前面已经展示了如何使用propsemit,这里简要介绍provide/inject

  • provide:允许你指定你想要提供给后代组件的数据/方法。
  • inject:允许一个组件接收来自祖先组件或整个应用的数据/方法。
  1. // 祖先组件
  2. setup() {
  3. const theme = ref('dark');
  4. provide('theme', theme);
  5. return {};
  6. }
  7. // 后代组件
  8. setup() {
  9. const theme = inject('theme');
  10. return {
  11. theme
  12. };
  13. }

12.2.6 总结

setup()函数作为Vue 3中Composition API的核心,为开发者提供了一种全新的、更灵活的方式来组织和复用Vue组件的逻辑。通过setup()函数,我们可以更方便地利用响应式引用、计算属性、侦听器、生命周期钩子和组件通信等特性,从而编写出更加清晰、高效和可维护的Vue组件。掌握setup()函数及其相关API的使用,是深入学习Vue 3和Composition API的关键。


该分类下的相关小册推荐: