好的,在 Vue 3 中创建组件主要分为两种方式:选项式 API (Options API) 和 组合式 API (Composition API)。我将为你详细讲解这两种方式的创建步骤、区别以及如何选择。
核心概念:什么是 Vue 组件?
一个 Vue 组件就是一个扩展名为 .vue
的文件(单文件组件,简称 SFC),它将模板(HTML)、逻辑(JavaScript)和样式(CSS)封装在一个文件中。
一个组件文件通常包含三个部分:
-
<template>
:负责组件的结构(HTML)。 -
<script>
:负责组件的逻辑(JavaScript/TypeScript)。 -
<style>
:负责组件的样式(CSS/SCSS等)。
方式一:组合式 API (Composition API) - 【现代和推荐的方式】
这是 Vue 3 推荐的主要方式,它通过导入的 API 函数来组织代码逻辑,使得相关功能的代码可以集中在一起,更容易维护和复用。
创建步骤:
-
使用
setup
语法糖 (<script setup>
)
这是最简洁、最常用的方式。在<script>
标签上添加setup
属性,代码会在组件创建前执行。 -
定义响应式数据
使用ref
(用于基本类型) 或reactive
(用于对象) 来创建响应式数据。 -
定义函数方法
直接声明函数即可。 -
定义生命周期钩子
使用onMounted
,onUpdated
等函数来注册生命周期钩子。 -
模板部分
在<template>
中,定义的变量和函数可以直接使用,无需返回。
示例:一个简单的计数器组件
vue
<!-- MyCounter.vue --> <template> <div> <p>Count is: {{ count }}</p> <button @click="increment">+1</button> </div> </template> <script setup> // 1. 导入所需的 API import { ref, onMounted } from 'vue' // 2. 定义响应式状态 ( reactive state ) const count = ref(0) // 3. 定义函数方法 function increment() { count.value++ } // 4. 定义生命周期钩子 onMounted(() => { console.log('组件已挂载!初始计数是:', count.value) }) </script> <style scoped> /* 你的组件样式,scoped 表示这些样式只作用于当前组件 */ button { background-color: #4CAF50; } </style>
<script setup>
的优势:
-
更少的样板代码:不需要手动
return
变量和函数。 -
更好的 TypeScript 支持。
-
更好的性能。
方式二:选项式 API (Options API) - 【传统方式】
这是 Vue 2 的经典方式,也是 Vue 3 仍然完全支持的方式。它通过一组选项对象(如 data
, methods
, mounted
等)来组织代码,逻辑分布清晰,对初学者更友好。
创建步骤:
-
导出一个选项对象
使用export default {}
导出一个包含组件选项的对象。 -
定义数据 (
data
)
data
选项是一个函数,它返回一个对象,对象的属性会成为组件的响应式数据。 -
定义方法 (
methods
)
methods
选项是一个对象,里面包含组件的所有方法。 -
定义生命周期钩子
直接在选项对象下添加mounted
,updated
等函数。 -
模板部分
在<template>
中,可以访问data
中定义的数据和methods
中定义的方法。
示例:同样的计数器组件(选项式 API)
vue
<!-- MyCounterOptions.vue --> <template> <!-- 与组合式 API 的模板完全相同 --> <div> <p>Count is: {{ count }}</p> <button @click="increment">+1</button> </div> </template> <script> export default { // 组件选项 data() { return { count: 0 // 响应式数据 } }, methods: { increment() { this.count++ // 通过 this 访问数据 } }, mounted() { console.log('组件已挂载!初始计数是:', this.count) } } </script> <style scoped> /* 样式同上 */ </style>
如何在父组件中使用子组件?
创建好组件后,你需要在一个父组件中导入并使用它。
使用步骤(在组合式 API 中):
-
导入组件:使用
import
语句导入.vue
文件。 -
直接使用:在
<template>
中,你可以直接使用导入的组件名作为标签(通常是驼峰命名或横线连接)。
vue
<!-- App.vue --> <template> <div> <h1>我的 Vue 3 应用</h1> <!-- 3. 在模板中使用组件 --> <MyCounter /> <!-- 也可以使用横线连接的方式 <my-counter /> --> </div> </template> <script setup> // 1. 导入组件 import MyCounter from './components/MyCounter.vue' // 2. 在 <script setup> 中,导入后即可直接使用,无需注册 components: {} </script>
在选项式 API 中注册:
vue
<!-- App.vue (选项式) --> <template> <div> <h1>我的 Vue 3 应用</h1> <MyCounter /> </div> </template> <script> import MyCounter from './components/MyCounter.vue' export default { // 必须在这里注册组件 components: { MyCounter } } </script>
如何选择两种方式?
特性 | 组合式 API (<script setup> ) | 选项式 API |
---|---|---|
学习曲线 | 稍高,需要理解 ref , reactive 等概念 | 较低,结构清晰,易于入门 |
代码组织 | 按逻辑功能组织代码,相关代码在一起 | 按选项类型组织代码(data, methods等) |
逻辑复用 | 极强,使用组合式函数(Composables) | 较弱,使用 mixins(有命名冲突等缺点) |
TypeScript 支持 | 原生支持极好 | 支持,但不如组合式流畅 |
推荐程度 | Vue 3 官方推荐,是新项目的主流选择 | 仍然完全支持,适合从 Vue 2 迁移或偏好此风格的开发者 |
简单建议:
-
新项目:强烈建议直接从组合式 API 开始。
-
老项目迁移或团队习惯:可以继续使用选项式 API,两者甚至可以在同一个项目中混合使用。
希望这个详细的步骤和对比能帮助你顺利创建 Vue 3 组件!