开发vue3组件

下面从核心概念到高级实践,系统介绍 Vue 3 组件开发的关键技术点和最佳实践:


🧱 一、组件基础与创建

  1. 单文件组件结构

    Vue 3 组件通常采用单文件组件(SFC,.vue 文件)格式:

    <template>
      <div>{{ message }}</div>
    </template>
    <script setup>
    import { ref } from 'vue';
    const message = ref('Hello Vue 3!');
    </script>
    <style scoped>
    div { color: #42b983; }
    </style>
    
    • <template>:定义 HTML 模板结构

    • <script setup>:使用 Composition API 编写逻辑(推荐语法糖)

    • <style scoped>:限定样式的组件作用域

  2. 组件注册方式

    • 全局注册(适用于高频组件):

      // main.js
      import { createApp } from 'vue';
      import App from './App.vue';
      import MyComponent from './components/MyComponent.vue';
      const app = createApp(App);
      app.component('MyComponent', MyComponent); // 全局注册
      app.mount('#app');
      
    • 局部注册(推荐按需引入):

      <script setup>
      import LocalComponent from './LocalComponent.vue'; // 局部引入
      </script>
      

⚙️ 二、Composition API 核心实践

  1. 响应式数据管理

    • ref:处理基本类型(如字符串、数字)

    • reactive:处理对象/数组等复杂结构

      <script setup>
      import { ref, reactive } from 'vue';
      const count = ref(0); // 基本类型
      const user = reactive({ name: 'Alice', age: 25 }); // 复杂对象
      const increment = () => { count.value++; };
      </script>
      
  2. 逻辑复用(组合式函数)

    将重复逻辑抽离为独立函数:

    // useCounter.js
    import { ref } from 'vue';
    export function useCounter(initialValue = 0) {
      const count = ref(initialValue);
      const increment = () => count.value++;
      return { count, increment };
    }
    

    组件中调用:

    <script setup>
    import { useCounter } from './useCounter';
    const { count, increment } = useCounter();
    </script>
    

📡 三、组件通信方式详解

  1. 父子通信

    • Props(父 → 子)

      <!-- 子组件 -->
      <script setup>
      const props = defineProps({
        title: { type: String, required: true },
        count: Number
      });
      </script>
      
      <!-- 父组件 -->
      <ChildComponent :title="动态标题" :count="5" />
      
    • 事件(子 → 父)

      <!-- 子组件 -->
      <script setup>
      const emit = defineEmits(['update']);
      const handleClick = () => emit('update', newValue);
      </script>
      
      <!-- 父组件 -->
      <ChildComponent @update="handleUpdate" />
      
  2. 跨层级通信

    • provide/inject

      // 祖先组件
      import { provide } from 'vue';
      provide('key', data);
      // 后代组件
      import { inject } from 'vue';
      const data = inject('key');
      
    • 全局事件总线(mitt)

      // emitter.js
      import mitt from 'mitt';
      export default mitt();
      // 组件A(发送)
      emitter.emit('event', data);
      // 组件B(接收)
      emitter.on('event', (data) => { ... });
      

♻️ 四、可复用组件封装

  1. 属性驱动设计

    通过 defineProps 接收参数实现组件多样化:

    <script setup>
    defineProps({
      type: { type: String, default: 'default' },
      size: { type: String, validator: v => ['small', 'medium'].includes(v) },
      disabled: Boolean
    });
    </script>
    
  2. 插槽扩展能力

    支持默认插槽、具名插槽和作用域插槽:

    <!-- 子组件 -->
    <template>
      <div>
        <slot name="header"></slot>
        <slot :data="internalData"></slot> <!-- 作用域插槽 -->
        <slot name="footer"></slot>
      </div>
    </template>
    <!-- 父组件 -->
    <ChildComponent>
      <template #header>标题</template>
      <template #default="{ data }">{{ data }}</template>
    </ChildComponent>
    

🚀 五、高级技巧与优化

  1. JSX 开发动态组件

    适合复杂渲染逻辑场景(需配置 @vitejs/plugin-vue-jsx):

    export default {
      setup() {
        const count = ref(0);
        return () => (
          <div>
            <button onClick={() => count.value++}>+</button>
            <p>Count: {count.value}</p>
          </div>
        );
      }
    };
    
  2. 性能优化

    • 使用 computed 缓存计算值

    • v-once 标记静态内容

    • 组件懒加载(defineAsyncComponent


💎 总结

  • 组件设计原则:单一职责、高内聚低耦合、明确的接口(Props/Events)

  • 代码组织:优先使用 <script setup> + Composition API 按功能组织代码

  • 通信选择

    • 父子:Props/Emits

    • 兄弟/跨层:Mitt/Pinia/Provide-Inject

  • 工具链:Vite + TypeScript 提升开发体验和类型安全

完整组件库开发流程(含本地调试、全局注册、样式隔离)可参考,企业级项目推荐使用 Element PlusNaive UI 的封装模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值