Vue 3:Options API 与 Composition API 的对比 - DeadSimpleChat

作者:API传播员 · 2025-12-19 · 阅读时间:5分钟

Vue 3 引入了全新的 Composition API,与传统的 Options API 一起,为开发者提供了更灵活的组件开发方式。在本文中,我们将对比这两种 API 的特点,探讨它们的适用场景,并通过示例展示如何使用它们。


选项 API 简介

Options API 是 Vue 2 中默认的组件开发方式,其核心思想是通过组件选项(如 datamethodscomputed 等)来组织组件逻辑。每个选项对应组件的某一部分功能,例如:

  • data:定义组件的状态。
  • methods:定义组件的方法。
  • computed:定义派生状态。

这种基于选项的结构自 Vue 创建以来一直是其核心,以下是一个使用 Options API 的简单组件示例:

export default {
  data() {
    return {
      message: 'Hello Vue!'
    };
  },
  methods: {
    greet() {
      alert(this.message);
    }
  }
};

Composition API 简介

代码的可维护性和可读性。

以下是一个使用 Composition API 的简单示例:

import { ref, computed } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const doubleCount = computed(() => count.value * 2);    function increment() {
      count.value++;
    }    return {
      count,
      doubleCount,
      increment
    };
  }
};

通过 Composition API,组件逻辑可以按功能分组,而不是按选项类型分散在不同的部分。


创建项目以对比 Options API 和 Composition API

第一步:创建一个新的 Vite 项目

首先,使用 Vite 创建一个新的 Vue 项目:

npm create vite@latest my-vue-app --template vue
cd my-vue-app
npm install
npm run dev

在代码编辑器中打开项目,您可以通过本地 URL 访问运行的应用程序。


第二步:使用 Options API 创建任务列表组件

components 文件夹中创建一个名为 TaskList.vue 的文件,并实现以下功能:

数据处理

使用 data 函数定义组件的状态:

data() {
  return {
    tasks: [],
    newTask: ''
  };
}

方法处理功能

methods 中定义以下功能:

  • 添加任务:
addTask() {
  if (this.newTask.trim()) {
    this.tasks.push({
      id: Date.now(),
      title: this.newTask,
      completed: false
    });
    this.newTask = ''; // 重置输入字段
  }
}
  • 删除任务:
deleteTask(taskId) {
  this.tasks = this.tasks.filter(task => task.id !== taskId);
}
  • 标记任务为完成或未完成:
completeTask(taskId) {
  const task = this.tasks.find(t => t.id === taskId);
  if (task) task.completed = !task.completed;
}

计算属性和观察者

使用计算属性过滤任务:

computed: {
  incompleteTasks() {
    return this.tasks.filter(task => !task.completed);
  },
  completedTasks() {
    return this.tasks.filter(task => task.completed);
  }
}

第三步:使用 Composition API 重建任务列表组件

数据处理

在 Composition API 中,使用 refreactive 定义响应式数据:

import { ref } from 'vue';

export default {
  setup() {
    const tasks = ref([]);
    const newTask = ref('');    return {
      tasks,
      newTask
    };
  }
};

方法处理功能

方法可以直接定义为普通的 JavaScript 函数:

function addTask() {
  if (newTask.value.trim()) {
    tasks.value.push({
      id: Date.now(),
      title: newTask.value,
      completed: false
    });
    newTask.value = ''; // 重置输入字段
  }
}

function deleteTask(taskId) {
  tasks.value = tasks.value.filter(task => task.id !== taskId);
}function completeTask(taskId) {
  const task = tasks.value.find(t => t.id === taskId);
  if (task) task.completed = !task.completed;
}

计算属性和观察者

使用 computed 定义派生状态:

import { computed } from 'vue';

const incompleteTasks = computed(() => tasks.value.filter(task => !task.completed));
const completedTasks = computed(() => tasks.value.filter(task => task.completed));

高级用例:状态管理与路由

使用 Pinia 进行状态管理

Pinia 是 Vue 3 的默认状态管理库,其 API 简单易用。以下是一个使用 Pinia 创建状态管理的示例:

import { defineStore } from 'pinia';

export const useMyStore = defineStore({
  id: 'mystore',
  state: () => ({
    someStateValue: ''
  }),
  actions: {
    setSomeStateValue(value) {
      this.someStateValue = value;
    }
  }
});

在组件中使用该状态:

import { useMyStore } from '@/stores/mystore';

export default {
  setup() {
    const store = useMyStore();
    return {
      someStateValue: store.someStateValue
    };
  }
};

使用 Vue Router 进行路由

以下是一个使用 Vue Router 的示例:

import { useRouter, useRoute } from 'vue-router';

export default {
  setup() {
    const router = useRouter();
    const route = useRoute();    function navigate() {
      router.push({ name: 'BestRouteEver' });
    }    return {
      navigate
    };
  }
};

结论

Composition API 提供了更灵活的代码组织方式,适用于复杂项目的开发,能够提升代码的可读性和可维护性。然而,对于小型项目或新手开发者,Options API 仍然是一个简单易用的选择。

无论选择哪种 API,都可以根据项目需求和团队熟悉程度进行权衡。Vue 3 的灵活性为开发者提供了更多可能性。

原文链接: https://deadsimplechat.com/blog/vue-3-options-api-vs-composition-api/