尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Vue组件的二次封装(案例)

Vue组件的二次封装(案例)
📅 发布时间:2026/7/9 13:05:15

一、不丢失原生组件的能力

不丢失原组件的任何功能,用户使用封装组件时依旧能用所有原 API

1.1 属性

import{ElInput,typeInputProps}from"element-plus"constprops=withDefaults(defineProps<InputProps>(),{inputStyle:()=>[],})

2.2 插槽

<el-input><templatev-for="(slotContent, name) in $slots"#[name]="slotData"><!-- 保留原有插槽内容 --><slot:name="name"v-bind="slotData"/></template></el-input>

2.3 事件

<!--父组件--><MyInputplaceholder="请输入"v-model="msg"type="text"ref="myInputRef"@input="handleChange"></MyInput>
<!--子组件--><el-inputv-bind="{ ...$attrs, ...props }"><templatev-for="(slotContent, name) in $slots"#[name]="slotData"><!-- 保留原有插槽内容 --><slot:name="name"v-bind="slotData"/></template></el-input>

2.4 返回方法

constvm=getCurrentInstance()functioncurrentRef(instance:any){if(vm){vm.exposed=instance||{}}}

二、封装

<!--父组件--> <template> <MyInput placeholder="请输入" v-model="msg" type="text" ref="myInputRef" @input="handleChange"> <template #append="slotData"> <div>{{ slotData }}</div> </template> <el-button @click="handleClear">点击我清除</el-button> </MyInput> </template> <script setup lang="ts"> import { ref } from "vue" import MyInput from "./components/index.vue" const myInputRef = ref() const msg = ref("1111111111") const handleClear = () => { if (!myInputRef.value) return myInputRef.value.clear() } const handleChange = () => { console.log(111) } </script>
<!---子组件--> <template> <div class="container"> <div>组件二次封装-{{ $attrs }}</div> <component :is="h(ElInput, { ...$attrs, ...props, ref: currentRef }, $slots)"></component> <slot></slot> </div> </template> <script setup lang="ts"> // inheritAttrs: false 是 Vue 组件中的一个配置项,用于控制是否自动将 $attrs 中的属性传递给组件的根元素。 defineOptions({ inheritAttrs: false, }) import { ElInput, type InputProps } from "element-plus" import { getCurrentInstance, h } from "vue" const props = withDefaults(defineProps<InputProps>(), { inputStyle: () => [], }) const vm = getCurrentInstance() function currentRef(instance: any) { if (vm) { vm.exposed = instance || {} } } const emit = defineEmits(["a"]) </script>

相关新闻

  • 2026年深度横评:市面上那些“高情商聊天回复工具”,究竟是在帮你还是坑你?
  • IIC通信协议详解(一篇文章搞懂I2C原理、时序与读写流程)
  • 钢结构深化设计要点

最新新闻

  • 靠谱的常德环保装修公司
  • 压电警报系统设计与PIC微控制器驱动方案
  • 干道信号协调控制 Python 仿真:基于 SUMO 验证 3 种相位差算法效果
  • Zotero Format Metadata:文献管理规范化的终极解决方案
  • Claude Code实战指南:从智能体原理到工程化应用
  • 网络系统的30类设备

日新闻

  • SQL 查询语句的标准逻辑执行顺序(即语义处理顺序),它与实际书写顺序不同,但决定了数据库如何解析和执行查询
  • ORB-SLAM2 重定位模块深度解析:从 BoW 候选帧到 PnP 优化的 6 步流程
  • 罗技鼠标宏压枪脚本终极指南:从原理到实战的完整解析

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号