1

选项式API是什么?

选项式API是Vue最传统、最易理解的代码组织方式。就像填表格一样,在特定位置填写特定内容:

export default {
  // 在这里定义数据
  data() {
    return {
      message: '你好Vue!'
    }
  },
  
  // 在这里定义方法
  methods: {
    greet() {
      alert(this.message)
    }
  },
  
  // 组件挂载后执行
  mounted() {
    console.log('组件已加载')
  }
}
为什么叫”选项式”? – 因为我们在一个配置对象中填写不同的”选项”(data, methods等)
2

核心选项详解

1. data – 组件的数据仓库

存放所有组件数据的地方,必须是一个函数,返回一个数据对象

data() {
  return {
    count: 0,
    username: '小明',
    todos: ['学习 Vue', '写代码', '睡觉']
  }
}

在模板中可以使用 {{ count }} 显示数据

2. methods – 组件的方法库

存放所有组件方法的地方,定义事件处理函数或普通方法

methods: {
  increment() {
    this.count++  // 通过 this 访问 data 中的数据
  },
  greet(name) {
    alert('你好, ' + name)
  }
}

在模板中绑定:<button @click="increment">增加</button>

3. computed – 计算属性

自动计算的值,当依赖的数据变化时自动更新(有缓存)

computed: {
  // 计算属性是函数形式,但当作属性使用
  reversedMessage() {
    return this.message.split('').reverse().join('')
  },
  
  // 带 setter 的计算属性
  fullName: {
    get() {
      return this.firstName + ' ' + this.lastName
    },
    set(newValue) {
      const names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}
计算属性 vs 方法 – 计算属性有缓存,只有依赖变化才重新计算;方法每次都会执行

4. watch – 侦听器

监听数据变化,执行自定义操作

watch: {
  // 监听 count 的变化
  count(newValue, oldValue) {
    console.log(`count 从 ${oldValue} 变为 ${newValue}`)
  },
  
  // 深度监听对象
  user: {
    handler(newUser) {
      console.log('用户信息变化:', newUser)
    },
    deep: true,   // 监听对象内部变化
    immediate: true // 立即执行一次
  },
  
  // 监听对象属性
  'user.name'(newName) {
    console.log('用户名变更为:', newName)
  }
}

5. props – 接收父组件数据

定义组件可以接收的属性(类似函数参数)

props: {
  // 基础类型检测
  title: String,
  
  // 多个可能的类型
  size: [String, Number],
  
  // 必填且为字符串
  username: {
    type: String,
    required: true
  },
  
  // 带默认值的数字
  age: {
    type: Number,
    default: 18
  },
  
  // 对象/数组默认值应当从一个工厂函数获取
  config: {
    type: Object,
    default() {
      return { color: 'blue', size: 'medium' }
    }
  }
}

6. emits – 定义组件发出的事件

声明组件可以触发哪些事件(类似函数返回值)

emits: ['submit', 'cancel'],

methods: {
  handleSubmit() {
    this.$emit('submit', formData)  // 触发 submit 事件
  }
}
3

生命周期钩子 – 组件的生命旅程

Vue 组件从创建到销毁的完整生命周期:

创建阶段

beforeCreate – 组件刚初始化,什么都还没有

created – 数据和方法已创建,但DOM还未生成

挂载阶段

beforeMount – 模板编译完成,还未挂载到页面

mounted – 组件已挂载到页面,可以操作DOM

更新阶段

beforeUpdate – 数据变化,视图将要更新

updated – 数据变化导致视图已更新完成

销毁阶段

beforeUnmount – 组件即将销毁

unmounted – 组件已销毁,所有东西被清理

export default {
  beforeCreate() { /* 初始化前 */ },
  created() { /* 数据已准备就绪 */ },
  beforeMount() { /* 挂载到DOM前 */ },
  mounted() { /* 挂载完成,操作DOM */ },
  beforeUpdate() { /* 数据变化,视图更新前 */ },
  updated() { /* 视图已完成更新 */ },
  beforeUnmount() { /* 组件销毁前 */ },
  unmounted() { /* 组件销毁完成 */ }
}
常用生命周期:
created – 发起API请求
mounted – 操作DOM或初始化第三方库
unmounted – 清理定时器或事件监听
4

选项式API vs 组合式API

Vue3 的两种主要编码风格对比:

特性 选项式API 组合式API
代码组织 按功能选项(data, methods等)组织 按逻辑功能组织代码
学习曲线 更简单直观,适合新手 需要理解响应式概念
逻辑复用 使用mixins(较复杂) 使用Composables(更灵活)
TypeScript支持 支持 更好的类型推导
适用场景 小型到中型项目,新手友好 大型项目,复杂逻辑复用
重要提示: Vue3完全支持选项式API,两种风格可以共存! 你可以根据项目需求和个人偏好灵活选择。