defineComponent 简明介绍
1. 是什么?
defineComponent 是 Vue 3 中定义组件的核心函数。
2. 基本用法
// 1. 最简单的组件定义
export default defineComponent({
name: 'MyComponent',
setup() {
return {}
}
})
3. 两种写法
3.1 Options API(选项式 API ∈ Vue 2 风格 )
export default defineComponent({
// 组件名
name: 'MyComponent',
// 组件属性
props: {
title: String,
count: Number
},
// 数据
data() {
return {
message: 'Hello'
}
},
// 计算属性
computed: {
upperMessage() {
return this.message.toUpperCase()
}
},
// 方法
methods: {
sayHello() {
console.log(this.message)
}
},
// 生命周期
mounted() {
console.log('组件已挂载')
}
})
3.2 Composition API(组合式 API ∈ Vue 3 推荐)
import { ref, computed, onMounted } from 'vue'
export default defineComponent({
name: 'MyComponent',
props: {
title: String
},
setup(props) {
// 响应式数据
const count = ref(0)
const message = ref('Hello')
// 计算属性
const doubleCount = computed(() => count.value * 2)
// 方法
const increment = () => {
count.value++
}
// 生命周期
onMounted(() => {
console.log('组件已挂载')
})
// 返回给模板使用
return {
count,
message,
doubleCount,
increment
}
}
})
4. 主要优势
4.1 类型安全(TypeScript)
// defineComponent 提供完整的类型推断
const MyComponent = defineComponent({
props: {
// 明确的类型定义
title: { type: String, required: true },
count: { type: Number, default: 0 }
},
// ✅ 自动获得类型提示
setup(props) {
console.log(props.title) // 类型推断为 string
console.log(props.count) // 类型推断为 number
}
})
4.2 更好的 IDE 支持
- 自动补全
- 类型检查
- 重构支持
- 文档提示
5. 实际使用示例
5.1 计数器组件
<!-- Counter.vue -->
<template>
<div>
<p>计数: {{ count }}</p>
<button @click="increment">增加</button>
</div>
</template>
<script lang="ts">
import { defineComponent, ref } from 'vue'
export default defineComponent({
name: 'Counter',
props: {
initialValue: {
type: Number,
default: 0
}
},
setup(props) {
const count = ref(props.initialValue)
const increment = () => {
count.value++
}
return {
count,
increment
}
}
})
</script>
6. 为什么使用 defineComponent?
| 不使用 defineComponent | 使用 defineComponent |
|---|---|
| 没有类型检查 | ✅ 完整的 TypeScript 支持 |
| 重构困难 | ✅ 易于重构和导航 |
| 无自动补全 | ✅ 智能代码补全 |
| 难以维护 | ✅ 更好的维护性 |
7. 一句话总结
defineComponent 是 Vue 3 定义组件的标准方式,提供类型安全和更好的开发体验。
8. 使用建议
- 总是使用
defineComponent定义组件 - 新项目用 Composition API
- 迁移项目可用 Options API
- 搭配 TypeScript 效果最好
