Vue 组件开发
🔧 1. 组件基础
单文件组件(SFC)结构解析
vue
<template>
<!-- 组件模板 -->
<div>{{ msg }}</div>
</template>
<script setup>
// 组合式API写法
const msg = ref('Hello Vue 3!')
</script>
<style scoped>
/* 组件作用域样式 */
div {
color: #42b983;
}
</style>组件注册方式
全局注册(main.js):
javascript
import { createApp } from 'vue'
import MyComponent from './MyComponent.vue'
const app = createApp({})
app.component('MyComponent', MyComponent)局部注册:
vue
<script setup>
import ComponentA from './ComponentA.vue'
</script>Props验证
vue
<script setup>
const props = defineProps({
title: {
type: String,
default: '默认标题',
required: true
},
likes: Number
})
</script>📡 2. 组件通信
Props/$emit模式
父组件:
vue
<template>
<ChildComponent :message="parentMsg" @update="handleUpdate" />
</template>子组件:
vue
<script setup>
const emit = defineEmits(['update'])
function buttonClick() {
emit('update', newValue)
}
</script>provide/inject
祖先组件:
vue
<script setup>
import { provide } from 'vue'
provide('theme', 'dark')
</script>后代组件:
vue
<script setup>
import { inject } from 'vue'
const theme = inject('theme', 'light')
</script>事件总线
javascript
// eventBus.js
import mitt from 'mitt'
export const emitter = mitt()
// 组件A
emitter.emit('search', params)
// 组件B
emitter.on('search', (params) => {})🎪 3. 插槽系统
动态插槽名
vue
<template>
<BaseLayout>
<template v-slot:[dynamicSlotName]>
Dynamic Slot Content
</template>
</BaseLayout>
</template>
<script setup>
const dynamicSlotName = ref('header')
</script>作用域插槽
vue
<!-- 子组件 -->
<template>
<ul>
<li v-for="item in items">
<slot name="item" :item="item" />
</li>
</ul>
</template>
<!-- 父组件 -->
<template v-slot:item="{ item }">
<span>{{ item.text }}</span>
</template>⏳ 4. 生命周期管理
组合式API使用
vue
<script setup>
import { onMounted, onUnmounted } from 'vue'
onMounted(() => {
console.log('组件挂载完成')
})
onUnmounted(() => {
console.log('组件卸载完成')
})
</script>异步组件加载
javascript
import { defineAsyncComponent } from 'vue'
const AsyncComp = defineAsyncComponent(() =>
import('./components/AsyncComponent.vue')
)注意:Vue 3的组合式API生命周期钩子需要在setup()中同步调用,异步操作请使用await放在钩子函数内部。