Vue3 + TS组件封装指南

news2025/3/19 9:54:50

在 Vue 3 + TypeScript 中封装组件时,需要注意以下几点:

1. Props 定义

  • 使用 definePropsPropType 定义组件的 props,并为其添加类型。

  • 示例:

    import { defineComponent, PropType } from 'vue';
    
    export default defineComponent({
      props: {
        title: {
          type: String as PropType<string>,
          required: true,
        },
        count: {
          type: Number as PropType<number>,
          default: 0,
        },
      },
    });
    

2. Emit 事件

  • 使用 defineEmits 定义组件发出的事件,并为其添加类型。

  • 示例:

    import { defineComponent } from 'vue';
    
    export default defineComponent({
      emits: ['update:count'],
      setup(props, { emit }) {
        const increment = () => {
          emit('update:count', props.count + 1);
        };
    
        return {
          increment,
        };
      },
    });
    

3. Slots 插槽

  • 使用 slots 定义插槽,并通过 v-slot# 语法使用。

  • 示例:

    <template>
      <div>
        <slot name="header"></slot>
        <slot></slot>
        <slot name="footer"></slot>
      </div>
    </template>
    

4. Scoped Slots 作用域插槽

  • 通过 v-slot# 语法传递数据给插槽。

  • 示例:

    <template>
      <div>
        <slot :item="item"></slot>
      </div>
    </template>
    
    <script lang="ts">
    import { defineComponent } from 'vue';
    
    export default defineComponent({
      setup() {
        const item = { name: 'Vue 3' };
        return {
          item,
        };
      },
    });
    </script>
    

5. Provide/Inject

  • 使用 provideinject 实现跨组件数据传递,并为其添加类型。

  • 示例:

    import { defineComponent, provide, inject } from 'vue';
    
    const key = Symbol();
    
    export default defineComponent({
      setup() {
        provide(key, 'some value');
      },
    });
    
    export const useInjectedValue = () => inject(key);
    

6. Composable 函数

  • 将可复用的逻辑提取到 composable 函数中,并为其添加类型。

  • 示例:

    import { ref, computed } from 'vue';
    
    export function useCounter() {
      const count = ref(0);
      const double = computed(() => count.value * 2);
    
      function increment() {
        count.value++;
      }
    
      return {
        count,
        double,
        increment,
      };
    }
    

7. 类型推断

  • 利用 TypeScript 的类型推断功能,确保组件内部逻辑的类型安全。

  • 示例:

    import { defineComponent, ref } from 'vue';
    
    export default defineComponent({
      setup() {
        const count = ref(0); // TypeScript 会自动推断 count 为 Ref<number>
    
        return {
          count,
        };
      },
    });
    

8. 组件引用

  • 使用 ref 引用子组件,并为其添加类型。

  • 示例:

    import { defineComponent, ref } from 'vue';
    import ChildComponent from './ChildComponent.vue';
    
    export default defineComponent({
      components: {
        ChildComponent,
      },
      setup() {
        const childRef = ref<InstanceType<typeof ChildComponent>>();
    
        return {
          childRef,
        };
      },
    });
    

9. 样式隔离

  • 使用 scoped 样式或 CSS Modules 确保样式隔离。

  • 示例:

    <template>
      <div class="my-component">
        <p>Hello World</p>
      </div>
    </template>
    
    <style scoped>
    .my-component {
      color: red;
    }
    </style>
    

10. 单元测试

  • 使用 JestVitest 编写单元测试,确保组件功能正确。

  • 示例:

    import { mount } from '@vue/test-utils';
    import MyComponent from './MyComponent.vue';
    
    test('MyComponent', () => {
      const wrapper = mount(MyComponent, {
        props: {
          title: 'Hello',
        },
      });
      expect(wrapper.text()).toContain('Hello');
    });
    

11. 文档和示例

  • 为组件编写清晰的文档和使用示例,方便其他开发者理解和使用。

12. 性能优化

  • 使用 v-ifv-showkeep-alive 等优化组件渲染性能。
  • 避免不必要的重新渲染。

13. 错误处理

  • 在组件中添加错误处理逻辑,确保组件在异常情况下仍能正常工作。

14. 国际化

  • 如果组件需要支持多语言,使用 vue-i18n 或其他国际化方案。

15. 可访问性

  • 确保组件符合可访问性标准(如 ARIA 属性),提升用户体验。

通过以上步骤,可以确保封装的 Vue 3 + TypeScript 组件具备良好的可维护性、可复用性和类型安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AVRCP】蓝牙协议栈深度解析:AVCTP互操作性核心机制与实现细节

目录 一、事务标签&#xff08;Transaction Label&#xff09;机制 1.1 事务标签核心规则 1.2 事务标签作用域与并发性 1.3 实现建议与陷阱规避 1.4 协议设计思考 1.5 调试与验证 二、消息分片&#xff08;Fragmentation&#xff09;机制 2.1 分片触发条件 2.2 分片支…

【MySQL】基本查询(下)

文章目录 1.筛选分页结果2.Update3.Delete4.截断表5.插入查询结果6.聚合函数6.1什么是聚合函数6.2常见的聚合函数 7.group by7.1如何显示每个部门的平均工资和最高工资7.2显示每个部门的每种岗位的平均工资和最低工资7.3显示平均工资低于2000的部门和它的平均工资 8.总结 1.筛选…

Xpath Helper 替代 - XPath 测试器

Xpath Helper 最近开始&#xff08;2025.03&#xff09;无法使用了&#xff0c;选找了几款替代品&#xff0c;XPath 测试器 是目前看来最好的。 XPath 测试器 市场地址&#xff1a; https://chromewebstore.google.com/detail/xpath-测试器/cneomjecgakdfoeehmmmoiklncdiodmh …

C++学习之云盘项目nginx

1.复习 2.知识点概述 1. 一些基本概念 1.1 Nginx 初步认识 1.2 正向 / 反向代理 1.3 域名和 IP 2. Nginx 安装和配置 2.1 安装 2.2 配置 3. Nginx 的使用 3.1 部署静态网页 3.2 反向代理和负载均衡 课外知识导读 1. URL 和 URI 2. DNS 解析过程 1. 一些基…

JAVA学习*抽象类

抽象类 在Java中&#xff0c;被abstract关键字修饰的类被称为抽象类。 特点 1、当一个类继承了抽象类&#xff0c;一定要重写抽象方法&#xff01;&#xff01;&#xff01; public abstract class Animal {public int age;public String name;//抽象方法public abstract v…

数据库管理-第303期 数据库相关硬件文章汇总(20250319)

数据库管理303期 2025-03-19 数据库管理-第303期 数据库相关硬件文章汇总&#xff08;20250319&#xff09;1 CPU & 内存2 SSD3 RDMA4 存储5 CXL6 硬件采购7 数据库一体机总结 数据库管理-第303期 数据库相关硬件文章汇总&#xff08;20250319&#xff09; 作者&#xff1…

OctoTools:一个具有复杂推理可扩展工具的智体框架

25年2月来自斯坦福大学的论文“OctoTools: An Agentic Framework with Extensible Tools for Complex Reasoning”。 解决复杂的推理任务可能涉及视觉理解、域知识检索、数值计算和多步骤推理。现有方法使用外部工具增强大语言模型 (LLM)&#xff0c;但仅限于专业领域、有限的…

Canary

定义&#xff1a; Canary是一种用以防护栈溢出的保护机制。 原理&#xff1a; 是在一个函数的入口处&#xff0c;先从fs/gs寄存器中取出一个4字节&#xff08;eax,四字节通常是32位的文件&#xff09;或者8字节&#xff08;rax&#xff0c;通常是64位的文件&#xff09;的值…

c++领域展开第十七幕——STL(vector容器的模拟实现以及迭代器失效问题)超详细!!!!

文章目录 前言vector——基本模型vector——迭代器模拟实现vector——容量函数以及push_back、pop_backvector——默认成员函数vector——运算符重载vector——插入和删除函数vector——实现过程的问题迭代器失效memcpy的浅拷贝问题 总结 前言 上篇博客我们已经详细介绍了vecto…

BUUCTF Pwn babyheap_0ctf_2017 Unsorted bin attack部分

checksec exeinfo 开启了全保护 64位 查看函数&#xff1a; 堆题 增删查改齐了 可以在编辑堆的时候重新设置大小 存在堆溢出 delete函数的指针清零了 无UAF 想法是通过unsorted bin泄露libc基址&#xff1a; from pwn import *p process(./babyheap) #p remote("node…

【C++指南】内存管理完全手册:new/delete

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C内存管理的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享…

Vue3组合式函数(滚动监测 useScroll)

主要用于实时监测目标元素滚动位置及状态 工具函数源码 /*** 组合式函数* 实时监测目标元素滚动位置及状态** 自定义钩子用于处理滚动事件和状态* param target 滚动目标元素&#xff0c;可以是 Ref、HTMLElement、Window 或 Document&#xff0c;默认为 window* param throt…

Vue.js+Element UI 登录界面开发详解【附源码】

成果图&#xff1a; 一、技术架构解析 本登录模块采用前后端分离架构&#xff0c;前端基于Vue.jsElement UI实现交互逻辑&#xff0c;主要包含以下技术要点&#xff1a; ​组件化开发 - 采用单文件组件形式组织代码​响应式设计 - 实现多终端适配​状态管理 - 使用sessionSto…

瑞幸需要宇树科技

吃不到“星巴克红利”&#xff0c;瑞幸活成“Manner”。 作者|古廿 编辑|杨舟 “是不是又要开始3月革命了。”有瑞幸员工透露&#xff0c;今年开始瑞幸加强了系统排班的执行力度。新的排班体系下&#xff0c;要求各时段门店实际值班人员和排班系统一致。如果需要调整&#xf…

linux 命令 vim

以下是 Linux 中 Vim 编辑器的核心命令总结&#xff0c;分为基础操作、高效编辑技巧和实用场景&#xff0c;助你快速掌握 1. 启动与退出 命令说明vim 文件名打开或新建文件vim 行号 文件名打开文件并跳转到指定行&#xff08;如 vim 10 file.txt&#xff09;:q退出 Vim&#…

解决MySQL字符集冲突引发的“Illegal mix of collations”错误

引言 在开发过程中&#xff0c;我们常常会遇到数据库层面的字符集兼容性问题。本文将通过一个典型的案例&#xff0c;分析因字符集不匹配导致的 Illegal mix of collations 错误&#xff0c;并提供完整的解决方案&#xff0c;帮助开发者彻底规避此类问题。 问题现象 假设我们…

Vue中的publicPath释义

publicPath 部署应用包时的基本URL。用法和 webpack 本身的 output.publicPath 一致&#xff0c;但是 Vue CLI 在一些其他地方也需要用到这个值&#xff0c;所以请始终使用 publicPath 而不要直接修改 webpack 的 output.publicPath。 默认情况下&#xff0c;Vue CLI 会假设你…

新造车不再比拼排名,恰是曲终人散时,剩者为王

据称新能源汽车周销量不再发布&#xff0c;这可能也预示着新造车终于到了给出答案的时候了&#xff0c;新造车企业前三强已基本确立&#xff0c;其余那些落后的车企已很难有突围的机会&#xff0c;而特斯拉无疑是其中的最大赢家。 3月份第一周的数据显示&#xff0c;销量最高的…