# 02-Vue 组件系统与通信 ## 📋 学习目标 - 掌握Vue组件注册和使用 - 理解Props和Emit组件通信 - 学习插槽Slots的使用 - 掌握Provide/Inject跨层级通信 - 了解动态组件和异步组件 ## 🧩 组件注册 ### 全局注册 ```javascript // main.js import {createApp} from 'vue'; import MyComponent from './MyComponent.vue'; const app = createApp({}); app.component('MyComponent', MyComponent); app.mount('#app'); ``` ### 局部注册 ```vue ``` ### 自动导入组件 ```javascript // vite.config.js import {defineConfig} from 'vite'; import vue from '@vitejs/plugin-vue'; import Components from 'unplugin-vue-components/vite'; export default defineConfig({ plugins: [ vue(), Components({ dirs: ['src/components'], extensions: ['vue'], deep: true }) ] }); ``` ## 📤 Props 传递数据 ### 基本用法 ```vue ``` ```vue {{ title }} Count: {{ count }} User: {{ user.name }}, {{ user.age }} ``` ### TypeScript类型定义 ```vue ``` ### Props验证 ```vue ``` ## 📥 Emit 事件通信 ### 基本用法 ```vue Click Me ``` ```vue ``` ### TypeScript类型定义 ```vue ``` ### v-model双向绑定 ```vue ``` ```vue ``` ### 多个v-model ```vue ``` ```vue ``` ## 🎰 插槽 Slots ### 默认插槽 ```vue Default Header Default Content ``` ```vue Custom Header This is the main content Action ``` ### 作用域插槽 ```vue {{ item.name }} ``` ```vue {{ index + 1 }}. {{ item.name }} {{ item.email }} ``` ### 具名作用域插槽 ```vue {{ col.label }} {{ row[col.key] }} ``` ```vue {{ column.label }} {{ row.status }} {{ row[column.key] }} ``` ## 🔄 Provide/Inject 跨层级通信 ### 基本用法 ```vue ``` ```vue User: {{ user.name }} Change Theme ``` ### TypeScript类型定义 ```vue ``` ```vue ``` ### 响应式Provide ```vue ``` ## 🔀 动态组件 ### component动态组件 ```vue {{ tab }} ``` ### keep-alive缓存组件 ```vue ``` ```vue ``` ## ⚡ 异步组件 ### defineAsyncComponent ```vue Loading... ``` ### 路由懒加载 ```javascript // router/index.js import {createRouter, createWebHistory} from 'vue-router'; const routes = [ { path: '/home', component: () => import('../views/Home.vue') }, { path: '/about', component: () => import('../views/About.vue') } ]; const router = createRouter({ history: createWebHistory(), routes }); ``` ## 🎯 组件通信总结 ### 通信方式对比 | 方式 | 适用场景 | 优点 | 缺点 | |------|---------|------|------| | Props | 父子组件 | 简单直接、类型安全 | 只能向下传递 | | Emit | 父子组件 | 事件驱动、解耦 | 只能向上传递 | | Provide/Inject | 跨层级 | 避免逐层传递 | 难以追踪数据流 | | EventBus | 任意组件 | 灵活 | 难以维护、不推荐 | | Vuex/Pinia | 全局状态 | 集中管理、可追踪 | 增加复杂度 | ### 最佳实践 1. **优先使用Props和Emit**:简单场景使用父子组件通信 2. **跨层级使用Provide/Inject**:避免Props逐层传递 3. **全局状态使用Pinia**:复杂应用使用状态管理 4. **组件解耦**:使用事件和插槽提高组件复用性 5. **类型安全**:使用TypeScript定义Props和Emit类型 ## 📝 实战示例 ### 表单组件封装 ```vue {{ label }} {{ error }} ``` ```vue ``` ### 列表组件封装 ```vue ```
Count: {{ count }}
User: {{ user.name }}, {{ user.age }}
This is the main content
User: {{ user.name }}