一步一步看懂:Vue 的单文件组件、选项式 API、组合式 API 到底是啥?

🌟 一、什么是单文件组件(Single File Component, SFC)

单文件组件,顾名思义就是把 HTML、JS、CSS 都写在一个 .vue 文件中。这种组织方式非常直观,利于维护。

下面是一个最简单的单文件组件示例(HelloCounter.vue):

html 复制代码
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>

<template>
  <button @click="count++">Count is: {{ count }}</button>
</template>

<style scoped>
button {
  font-weight: bold;
}
</style>

这段代码分为三部分:

1、 <script setup>

  • Vue 3 的组合式 API 新语法。
  • ref(0) 声明一个响应式变量 count,初始值为 0。
  • count++ 表示点击按钮后变量加 1。

2、<template>

  • 页面结构部分。

  • @click="count++" 监听点击事件,点击时 count 增加。

  • {{ count }} 是模板插值,展示当前的值。

3、 <style scoped>

  • scoped 表示这个样式只作用于当前组件。
  • 这里让按钮加粗。

:::tip Vue 的构建工具会自动处理这三部分,让你可以在一个文件中集中写好一个组件的功能。 :::

🧩 二、选项式 API(Options API)

选项式 API 是 Vue 2 和 Vue 3 都支持的写法,通过配置对象来组织组件逻辑,更符合面向对象的思维方式。

下面是用选项式 API 实现的计数器:

html 复制代码
<script>
export default {
  // data 函数返回组件的响应式数据
  data() {
    return {
      count: 0 // 初始化计数器
    }
  },

  // methods 是一组可以被模板调用的函数
  methods: {
    increment() {
      this.count++ // 修改响应式数据
    }
  },

  // mounted 是生命周期钩子之一
  mounted() {
    console.log(`组件已挂载,初始值是 ${this.count}`)
  }
}
</script>

<template>
  <button @click="increment">Count is: {{ count }}</button>
</template>

✅ 逐行解释

行号 代码 解释
1 <script> JS 逻辑部分开始
2 export default { 导出一个 Vue 组件对象
3~6 data() { return { count: 0 }} 定义响应式数据 count,初始值为 0
8~11 methods: { increment() { ... }} 定义方法 increment,当按钮点击时调用
13~15 mounted() { ... } 生命周期钩子:组件挂载后触发
18 <template> HTML 模板开始
19 <button @click="increment">...</button> 绑定点击事件,调用 increment 方法
20 </template> 模板结束

✨ 特点

  • 更适合初学者,逻辑清晰。
  • 所有状态、方法、生命周期钩子集中在一个对象里

🧬 三、组合式 API(Composition API)

组合式 API 是 Vue 3 推出的新特性,用函数来组合逻辑,更灵活、更适合大型项目

来看一段用组合式 API 改写的同样功能:

html 复制代码
<script setup>
import { ref, onMounted } from 'vue'

// 定义响应式变量
const count = ref(0)

// 定义事件处理函数
function increment() {
  count.value++ // 注意:ref 类型需要 .value 才能取值
}

// 生命周期钩子:组件挂载时触发
onMounted(() => {
  console.log(`组件已挂载,初始 count 是:${count.value}`)
})
</script>

<template>
  <button @click="increment">Count is: {{ count }}</button>
</template>

✅ 每行拆解解释

行号 代码 说明
1 <script setup> 使用组合式语法糖,简洁高效
2 import { ref, onMounted } from 'vue' 引入响应式和生命周期 API
4 const count = ref(0) 创建一个响应式变量 count,初始为 0
7 function increment() { ... } 定义点击按钮时执行的函数
8 count.value++ 修改响应式变量值,必须使用 .value
11 onMounted(() => { ... }) 注册组件挂载后的钩子函数
12 console.log(...) 输出当前值,验证逻辑是否生效
16~18 <template>...</template> 渲染 HTML 模板,按钮展示 count 值并绑定事件

💡 Options API vs Composition API 的区别

比较点 选项式 API 组合式 API
组织方式 通过对象的形式(data/methods) 通过函数逻辑组合
学习曲线 更低,适合入门 更灵活,适合大型项目
可读性 小型组件清晰 多逻辑时需手动分组
逻辑复用 依赖 mixins,易冲突 可以通过 hooks 重用,逻辑更清晰
调试体验 this 不易追踪 变量作用域明确,调试友好

:::tip Vue 官方推荐:小项目/渐进式使用 => Options API;构建大型 SPA 应用 => Composition API。 :::

如果这篇文章帮你理清了 Vue 的三大基础核心:单文件组件、选项式 API、组合式 API,欢迎点赞收藏 + 分享给更多正在入门 Vue 的朋友!

相关推荐
百万蹄蹄向前冲11 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
默_笙11 小时前
🏛 给 AI 配一间办公室:Harness Engineering 六大模块与它的实现
前端·javascript
linux_cfan12 小时前
videojs v10 源代码系列解读:14 · 谓词守卫:在运行时安全地调用能力
前端·javascript·音视频
kyriewen13 小时前
我扒了 10,221 条 JD:腾讯技术岗 75% 在要 AI
前端·人工智能·ai编程
郑州光合科技余经理13 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
+VX:Fegn089514 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
雪芽蓝域zzs14 小时前
第 7 章:双 Y 轴组合图(柱状 + 折线,看板高频场景)
vue.js·echars
IT_陈寒14 小时前
Vue的响应式让我熬到凌晨三点,原来漏了这个小细节
前端·人工智能·后端
一 乐14 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序
Blanche150014 小时前
利用 RAG 为答疑机器人扩展知识范围
前端