如何二次封装组件(vue3版本)

在开发 Vue 项目中我们一般使用第三方组件库进行开发,如 Element-Plus, 但是这些组件库提供的组件并不一定满足我们的需求,这时我们可以通过对组件库的组件进行二次封装,来满足我们特殊的需求。

对于封装组件有一个大原则就是我们应该尽量保持原有组件的接口,除了我们需要封装的功能外,我们不应该改变原有组件的接口,即保持原有组件提供的接口(属性、方法、事件、插槽)不变。

这里我们对 Element-plus 的 input 组件进行简单的二次封装,封装一个 MyInput 组件

1. 继承第三方组件的 Attributes 属性

使用v-bind="$attrs" (透传就行了)

2. 继承第三方组件的 Event 事件

因为vue2还需要使用 listeners,而vue3直接使用用上面的v−bind="listeners,而vue3直接使用用上面的v-bind="listeners,而vue3直接使用用上面的v−bind="attrs"(在Vue3 中,取消了listeners这个组件实例的属性,将其事件的监听都整合到了listeners这个组件实例的属性,将其事件的监听都整合到了listeners这个组件实例的属性,将其事件的监听都整合到了attrs上)

3. 使用第三方组件的 Slots

插槽也是一样的道理,比如 el-input 就有4个 Slot,我们不应该在组件中一个个的去手动添加 <slot name="prefix">,因此需要使用 $slots,使用如下代码即可

<template #[slotName]="slotProps" v-for="(slot, slotName) in $slots" ><slot :name="slotName" v-bind="slotProps"></slot>
</template>

4. 使用第三方组件的Methods

有些时候我们想要使用组件的一些方法,比如 el-input 提供10个方法,如何在父组件(也就是封装的组件)中使用这些方法呢?其实可以通过 ref 链式调用,但是这样太麻烦了,代码的可读性差;更好的解决方法:将所有的方法暴露出来,供父组件通过 ref 调用!

const myInputRef = ref()
const expose = {} as any
onMounted(() => { const entries = Object.entries(myInputRef.value)for (const [method, fn] of entries) {expose[method] = fn}
})
defineExpose(expose)

 然后在父组件直接绑定ref打印组件实例如下

整体子组件代码的结构如下:

 
<template><div class="my-input"><el-input v-bind="$attrs" ref="myInputRef"><template #[slotName]="slotProps" v-for="(slot, slotName) in $slots" ><slot :name="slotName" v-bind="slotProps"></slot></template></el-input></div>
</template>
<script lang="ts" setup>
import { ref, computed, onMounted } from 'vue'
​
defineProps({name: String
})
​
const myInputRef = ref()
const expose = {} as any
onMounted(() => { const entries = Object.entries(myInputRef.value)for (const [method, fn] of entries) {expose[method] = fn}
})
defineExpose(expose)
</script>
​
<style lang="scss" scoped></style>
​

整体父组件代码的结构如下:

​
<template><div class="row"><MyInput :aa="inputSize" :title="userName" placeholder="请输入内容" @focus="focus" @click="click" ref="inputRef"></MyInput></div>
</template>
​
<script setup>
import { ref, computed,onMounted } from 'vue'
import MyInput from '../components/MyInput/MyInput.vue';
const inputSize = ref(15)
const userName = ref('我是input')
const inputRef = ref()
const focus = () => {console.log('聚焦了');
}
const click = () => {console.log('点击了');
}
onMounted(() => { console.log(inputRef.value,"组件的实列")
})
</script>
​
<style lang="scss" scoped></style>

 

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

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

相关文章

【74HC192减法24/20/72进制】2022-5-17

缘由用74ls192设计一个72进制的减法计数器&#xff0c;需要有逻辑电路图-硬件开发-CSDN问答

Fastapi项目通过Jenkins2.4.91自动化构建部署到Nginx1.20进行访问详细方法(完全自动化部署亲测可用)

这篇技术文章需要结合我写的前两篇文章来一起看Gitlab17.7Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用) 和 Pycharm2024.3Gitlab.17.7本地化部署和自动提交代码使用方法&#xff08;亲测可用&#xff09;&#xff0c;总体来说是三部曲。这篇文章详细解读…

iOS 11 中的 HEIF 图像格式 - 您需要了解的内容

HEIF&#xff0c;也称为高效图像格式&#xff0c;是iOS 11 之后发布的新图像格式&#xff0c;以能够在不压缩图像质量的情况下以较小尺寸保存照片而闻名。换句话说&#xff0c;HEIF 图像格式可以具有相同或更好的照片质量&#xff0c;同时比 JPEG、PNG、GIF、TIFF 占用更少的设…

DATACOM-DHCP-复习-实验

DHCP 概述工作原理DHCP分配机制 配置配置基于全局地址池的DHCP服务器配置DHCP Relay中继验证 实验配置DHCP中继 参考 概述 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;用于集中对用户IP地址进行动态管理和…

深入浅出 Beam Search:自然语言处理中的高效搜索利器

Beam Search 技术详解 搜索系列相关文章&#xff08;置顶&#xff09; 1.原始信息再加工&#xff1a;一文读懂倒排索引 2.慧眼识词&#xff1a;解析TF-IDF工作原理 3.超越TF-IDF&#xff1a;信息检索之BM25 4.深入浅出 Beam Search&#xff1a;自然语言处理中的高效搜索利器 1…

二、CSS基础

一、选择器(1) 大白话&#xff1a;我们人为认为的解析方式是&#xff0c;从左往右查找&#xff0c;对于浏览器来说&#xff0c;是从右往左查找&#xff0c;解析速度更高。 注&#xff1a; 伪类选择器 - 作用于实际存在的元素&#xff0c;用于描述元素的某种特定状态或关系&…

从摩托罗拉手机打印短信的简单方法

昨天我试图从摩托罗拉智能手机上打印短信&#xff0c;但当我通过USB将手机连接到电脑时&#xff0c;我在电脑上找不到它们。由于我的手机内存已达到限制&#xff0c;并且我想保留短信的纸质版本&#xff0c;您能帮我将短信从摩托罗拉手机导出到计算机吗&#xff1f; 如您所知&…

Linux终端输入删除键backspace显示^H,输入上下左右键显示^A^B^C^D原理以及详细解决办法!

当我们装完Linux系统之后,我们可能会碰到按下删除键后出现^H这种情况。 同样,输入上下左右键显示^A^B^C^D这种情况。 这是为什么呢? 别急,后面我会说具体解决办法,先来看看这是为什么? 一、终端程序架构 首先,我们需要了解终端程序架构。 终端程序架构分为三层,分别…

ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础

文章目录 简介为什么需要I2S&#xff1f;关于音频信号采样率分辨率音频声道 怎样使用I2S传输音频&#xff1f;位时钟BCLK字时钟WS串行数据SD I2S传输模型I2S通信格式I2S格式左对齐格式右对齐格式 i2s基本配置i2s 底层API加载I2S驱动设置I2S使用的引脚I2S读取数据I2S发送数据卸载…

JAVA:利用 Redis 实现每周热评的技术指南

1、简述 在现代应用中&#xff0c;尤其是社交媒体和内容平台&#xff0c;展示热门评论是常见的功能。我们可以通过 Redis 的高性能和丰富的数据结构&#xff0c;轻松实现每周热评功能。本文将详细介绍如何利用 Redis 实现每周热评&#xff0c;并列出完整的实现代码。 2、需求分…

vscode代码AI插件Continue 安装与使用

“Continue” 是一款强大的插件&#xff0c;它主要用于在开发过程中提供智能的代码延续功能。例如&#xff0c;当你在编写代码并且需要进行下一步操作或者完成一个代码块时&#xff0c;它能够根据代码的上下文、语法规则以及相关的库和框架知识&#xff0c;为你提供可能的代码续…

kafka开机自启失败问题处理

前言&#xff1a;在当今大数据处理领域&#xff0c;Kafka 作为一款高性能、分布式的消息队列系统&#xff0c;发挥着举足轻重的作用。无论是海量数据的实时传输&#xff0c;还是复杂系统间的解耦通信&#xff0c;Kafka 都能轻松应对。然而&#xff0c;在实际部署和运维 Kafka 的…

Linux Red Hat 7.9 Server安装GitLab

1、关闭防火墙 执行 systemctl disable firewalld 查看服务器状态 systemctl status firewalld 2、禁用selinux vi /etc/selinux/config 将SELINUX 的值改为 disabled 3、安装policycoreutils-python 执行 yum install policycoreutils-python 4、下载gitlab wget --co…

PostgreSQL对称between比较运算

本文介绍PostgreSQL对称between比较功能&#xff1a;between symmetric&#xff0c;在动态拼接SQL时利用它可以简化判断。PostgreSQL 9.4 及以上版本支持BETWEEN SYMMETRIC操作符&#xff0c;MySQL、Oracle、MsSQL没有对应功能。 between 比较 PostgreSQL的between结构允许你对…

[CTF/网络安全] 攻防世界 simple_php 解题详析

题目描述&#xff1a;小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 代码解读 $a$_GET[a]; 从HTTP GET请求参数中获取一个名为a的变量&#xff0c;并将其赋值给变量a。符号用于禁止错误输出&#xff0c;如果不存在参数a则会将变量a设置为NULL。 $b$_GET[b];…

日志聚类算法 Drain 的实践与改良

在现实场景中&#xff0c;业务程序输出的日志往往规模庞大并且类型纷繁复杂。我们在查询和查看这些日志时&#xff0c;平铺的日志列表会让我们目不暇接&#xff0c;难以快速聚焦找到重要的日志条目。 在观测云中&#xff0c;我们在日志页面提供了聚类分析功能&#xff0c;可以…

RabbitMQ基础篇之Java客户端快速入门

文章目录 需求 项目设置与依赖管理 配置RabbitMQ的连接信息创建队列与消息发送创建消费者&#xff08;消息接收&#xff09;环境准备与操作 需求 利用控制台创建队列 simple.queue在 publisher 服务中&#xff0c;利用 SpringAMQP 直接向 simple.queue 发送消息在 consumer 服…

在虚幻引擎4(UE4)中使用蓝图的详细教程

在虚幻引擎4&#xff08;UE4&#xff09;中使用蓝图的详细教程 虚幻引擎4&#xff08;Unreal Engine 4&#xff0c;简称UE4&#xff09;是一款功能强大的游戏引擎&#xff0c;广泛应用于游戏开发、虚拟现实、建筑可视化等领域。UE4 提供了一个强大的可视化脚本工具——蓝图&am…

初学STM32 ---高级定时器互补输出带死区控制

互补输出&#xff0c;还带死区控制&#xff0c;什么意思&#xff1f; 带死区控制的互补输出应用之H桥 捕获/比较通道的输出部分&#xff08;通道1至3&#xff09; 死区时间计算 举个栗子&#xff08;F1为例&#xff09;&#xff1a;DTG[7:0]250&#xff0c;250即二进制&#x…

MarkDown怎么转pdf;Mark Text怎么使用;

MarkDown怎么转pdf 目录 MarkDown怎么转pdf先用CSDN进行编辑,能双向看版式;标题最后直接导出pdfMark Text怎么使用一、界面介绍二、基本操作三、视图模式四、其他功能先用CSDN进行编辑,能双向看版式; 标题最后直接导出pdf Mark Text怎么使用 Mark Text是一款简洁的开源Mar…