Vue3 + TS组件封装指南

在 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.mzph.cn/pingmian/72764.shtml

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

相关文章

mybatis_plus的乐观锁

乐观锁&#xff1a;总是假设最好的情况&#xff0c;每次读取数据时认为数据不会被修改&#xff08;即不加锁&#xff09;&#xff0c;当进行更新操作时&#xff0c;会判断这条数据是否被修改&#xff0c;未被修改&#xff0c;则进行更新操作。若被修改&#xff0c;则数据更新失…

Redis系列:深入理解缓存穿透、缓存击穿、缓存雪崩及其解决方案

在使用Redis作为缓存系统时&#xff0c;我们经常会遇到“缓存穿透”、“缓存击穿”和“缓存雪崩”等问题&#xff0c;这些问题一旦出现&#xff0c;会严重影响应用性能甚至造成服务不可用。因此&#xff0c;理解这些问题的产生原因和解决方案非常重要。 本文将全面讲解缓存穿透…

AT指令集-NBIOT

是什么&#xff1f; 窄带物联网&#xff08;Narrow Band Internet of Things, NB-IoT&#xff09;成为万物互联网络的一个重要分支支持低功耗设备在广域网的蜂窝数据连接&#xff0c;也被叫作低功耗广域网(LPWAN)NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接NB-Io…

CBNet:一种用于目标检测的复合骨干网架构之论文阅读

摘要 现代顶级性能的目标检测器在很大程度上依赖于骨干网络&#xff0c;而骨干网络的进步通过探索更高效的网络结构带来了持续的性能提升。本文提出了一种新颖且灵活的骨干框架——CBNet&#xff0c;该框架利用现有的开源预训练骨干网络&#xff0c;在预训练-微调范式下构建高…

c++中字符串string常用的函数

在C中&#xff0c; std::string 类有许多常用函数&#xff0c;以下是一些常见的&#xff1a; 1. length() 或 size() &#xff1a;返回字符串的长度&#xff08;字符个数&#xff09;&#xff0c;二者功能相同。例如&#xff1a; #include <iostream> #include <str…

《保险科技》

自己在保险行业工作很多年&#xff0c;只是接触了一些数据的内容&#xff0c;对于保险业务的知识了解的很少&#xff0c;想通过这本书补充一下&#xff0c;但是发现这本书就是一些知识的拼接。 先将保险的历史&#xff0c;后讲保险的定义&#xff0c;然后就是吹嘘保险行业和互联…

蓝桥杯第13届真题2

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 二.按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&a…

java之IP 工具类

java程序一直需要获取物理机的ip&#xff0c;写了一个ip的工具类&#xff0c;感觉日常所需够了 import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException;/*** IP 工具类*/ public class IpUtil {public static St…

贪心算法作业参考:P1106,P4995,P5019

贪心算法作业参考&#xff1a;P1106&#xff0c;P4995&#xff0c;P5019 P1106 删数问题 作业批注&#xff1a; 原作业提交&#xff0c;是删除k个最大的数。 不一定是删除最大的数。 参考如下&#xff0c;用例&#xff1a; 输入&#xff1a; 50074897 2输出&#xff1a; 4…

双曲空间学习记录

文章目录 前期学习内容双曲空间中的图卷积神经网络 前期学习内容 双曲空间中的图卷积神经网络 250318&#xff1a;这个博客的产生原因是我去看了B站上的一个视频&#xff0c;up说ppt上传到github上了&#xff0c;但是我去找了一圈也没有找到&#xff0c;然后想给他留言&#x…

【ES6新特性】默认参数常见用法

ES6新特性之默认参数的多种用法 &#x1f680;默认参数基础用法 在ES6中&#xff0c;我们可以直接在函数参数列表中为参数设置默认值&#xff1a; // ES5的实现方式 function greet(name) {name name || Guest;console.log(Hello, ${name}!); }// ES6默认参数写法 function…

LORA的AB矩阵是针对Transformer的多头还是MLP

LORA的AB矩阵是针对Transformer的多头还是MLP Transformer中的矩阵是一个整体还是分开的每个小矩阵 在LORA(Low-Rank Adaptation)中,AB矩阵的应用位置和Transformer中的矩阵拆分方式如下: 1. LORA的AB矩阵作用对象 LORA的AB矩阵主要作用于Transformer的多头注意力模块和…

【大模型基础_毛玉仁】2.4 基于 Encoder-Decoder 架构的大语言模型

更多内容&#xff1a;XiaoJ的知识星球 目录 2.4 基于 Encoder-Decoder 架构的大语言模型2.4.1 Encoder-Decoder 架构2.4.2 T5 语言模型1&#xff09;T5 模型结构2&#xff09;T5 预训练方式3&#xff09;T5 下游任务 2.4.3 BART 语言模型1&#xff09;BART 模型结构2&#xff0…

browser-use WebUI + DeepSeek 基于AI的UI自动化解决方案

browser-use WebUI 一、browser-use是什么Browser-use采用的技术栈为&#xff1a; 二、browser-use webui 主要功能使用场景 三、使用教程1.python 安装2、把项目clone下来3、安装依赖4、配置环境5、启动6、配置1.配置 Agent2.配置要用的大模型3.关于浏览器的一些设置 四、Deep…

WPF CommunityToolkit.MVVM库的简单使用

CommunityToolkit.MVVM 是 .NET 社区工具包中的一部分&#xff0c;它为实现 MVVM&#xff08;Model-View-ViewModel&#xff09;模式提供了一系列实用的特性和工具&#xff0c;能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。以下是关于它的详细使用介绍&#xff1a; 1…

Windows安装Apache Maven 3.9.9

第一步下载资源 官网&#xff1a;下载 Apache Maven – Maven 环境变量配置 M2_HOME 指向bin目录 MAVEN_HOME 指向根目录 M2_HOME 不确定是否必须要 Path配置 &#xff0c;需要注意MAVEN顺序应当在java之前 验证是否安装成功&#xff0c;在cmd中以管理员方式打开&#xff0c…

【spring-boot-starter-data-neo4j】创建结点和查找结点操作

配置连接neo4j # application.properties spring.neo4j.uribolt://localhost:7687 spring.neo4j.authentication.usernameneo4j spring.neo4j.authentication.password你的密码定义实体类 package com.anmory.platform.GraphService.Dao;import org.springframework.data.neo…

pytorch小记(十三):pytorch中`nn.ModuleList` 详解

pytorch小记&#xff08;十三&#xff09;&#xff1a;pytorch中nn.ModuleList 详解 PyTorch 中的 nn.ModuleList 详解1. 什么是 nn.ModuleList&#xff1f;2. 为什么不直接使用普通的 Python 列表&#xff1f;3. nn.ModuleList 的基本用法示例&#xff1a;构建一个包含两层全连…

Excel导出工具类--复杂的excel功能导出(使用自定义注解导出)

Excel导出工具类 前言: 简单的excel导出,可以用easy-excel, fast-excel, auto-poi,在导出实体类上加上对应的注解,用封装好的工具类直接导出,但对于复杂的场景, 封装的工具类解决不了,要用原生的excel导出(easy-excel, fast-excel, auto-poi都支持原生的) 业务场景: 根据…

批量测试IP和域名联通性2

在前面批量测试IP和域名联通性-CSDN博客的基础上&#xff0c;由于IP和域名多样性&#xff0c;比如带端口号的192.168.1.17:17&#xff0c;实际上应该ping 192.168.1.17。如果封禁http://www.abc.com/a.exe&#xff0c;实际可ping www.abc.com。所以又完善了代码。 echo off se…