Vue3 选项式API完全指南
编程小白也能看懂的Vue3核心知识点详解,用简单大白话解释复杂概念
选项式API是什么?
选项式API是Vue最传统、最易理解的代码组织方式。就像填表格一样,在特定位置填写特定内容:
export default {
// 在这里定义数据
data() {
return {
message: '你好Vue!'
}
},
// 在这里定义方法
methods: {
greet() {
alert(this.message)
}
},
// 组件挂载后执行
mounted() {
console.log('组件已加载')
}
}
核心选项详解
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]
}
}
}
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 事件
}
}
生命周期钩子 – 组件的生命旅程
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 – 清理定时器或事件监听
选项式API vs 组合式API
Vue3 的两种主要编码风格对比:
特性 | 选项式API | 组合式API |
---|---|---|
代码组织 | 按功能选项(data, methods等)组织 | 按逻辑功能组织代码 |
学习曲线 | 更简单直观,适合新手 | 需要理解响应式概念 |
逻辑复用 | 使用mixins(较复杂) | 使用Composables(更灵活) |
TypeScript支持 | 支持 | 更好的类型推导 |
适用场景 | 小型到中型项目,新手友好 | 大型项目,复杂逻辑复用 |
学习要点速查
核心概念总结
- data:组件的数据存储
- methods:事件处理与自定义方法
- computed:基于依赖的缓存计算
- watch:响应数据变化
- props:接收父组件数据
- emits:向父组件发送事件
- 生命周期钩子:组件各阶段的回调函数
常见问题解答
Q: data为什么必须是函数?
A: 防止多个组件实例共享同一数据对象
Q: 什么时候用计算属性?
A: 当需要根据现有数据计算新值,且计算较复杂时
Q: methods和computed的区别?
A: computed有缓存,methods每次都会执行
Q: Vue2和Vue3选项式API的区别?
A: 生命周期名称变化(beforeDestroy→beforeUnmount),新增emits选项
学习资源推荐
- 官方文档:vuejs.org
- Vue Mastery视频课程
- Vue School实战教程