自定义组件<IP输入框>在el-form的不同size中出现显示异常的BUG及修复

本文详细分析了一个自定义IP输入框组件在与不同size的el-form结合使用时出现的样式错误。问题源于form的size差异导致组件间距变化,进而影响了显示。通过对比正确和错误的CSS样式,找出问题关键在于行内元素的间距。解决方案包括调整组件尺寸以适应form的size变化或修改错误显示的form size为small。

场景复现:

在一次自定义IP输入框组件的应用中,因为el-form的size设置不同,导致组件的样式显示出错,场景复现如图:

显示正常的图片显示错误的图片
因为是同一个组件的复用,因此定位于不同form表单的css差异性

原因分析:

显示正确的css:

请添加图片描述请添加图片描述
在这里插入图片描述

显示错误的css:在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
显然,显示错误的这一组中,el-input__inner距离top的距离远了不少,但是其他的样式信息都是一致,因此怀疑因为form的size不同,导致其上下边距出现差异
继续检查.el-form-item
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

因为错误是出现在行内的,所以padding、border、margin都不必关注
可以确认的是mSize的form确实比s的在行内高了4px,又因为行内元素是上下等距,所以el-input__inner在mSize的form中上下边距和为36px-26px=10px,等分一下就是上下各5px。因此el-input__inner的底边所处的y坐标即为行内5+26=31px,但是因为其外部的el-input–medium是从ip-box的行内,而ip-box有一个px的边框,所以把el-input__inner的底边往下挤了一个px,即到了32px,刚刚好把ip-box的底部border挡住了,导致显示错误。

计算正确的sSize的form,el-input__inner上下距离都为(32px-26px)/2=3px,加上border的1px,距离top为4px,距离bottom2px,最底边位于4+26=30px,不会挡住ip-box在y方向上32px的底边border,因此没有显示错误。


解决方案:

方案一:调整IP输入框的尺寸,使其适配form的不同size(未选择)
方案二:显示错误的mSize的form的size改为small(当前选择)

Vue 3 和 Element Plus 的基础上,可以通过创建一个可复用的自定义组件来实现带有 popover 标签和输入框的 `el-form-item`。以下是一个完整的实现方案: ### 自定义组件结构 创建一个名为 `CustomFormItem.vue` 的组件,该组件将包含一个 `el-form-item`,并支持插槽用于 popover 标签,同时内嵌一个 `el-input` 输入框。 ```vue <template> <el-form-item :label="label" :prop="prop"> <div class="custom-form-item"> <slot name="popover-label"></slot> <el-input v-model="inputValue" :placeholder="placeholder" /> </div> </el-form-item> </template> <script setup> import { defineProps, ref } from 'vue'; const props = defineProps({ label: { type: String, required: true }, prop: { type: String, required: true }, placeholder: { type: String, default: '请输入内容' } }); const inputValue = ref(''); </script> <style scoped> .custom-form-item { display: flex; align-items: center; gap: 10px; } </style> ``` ### 使用自定义组件 在父组件中使用 `CustomFormItem` 组件,并通过插槽传入 popover 标签内容。 ```vue <template> <el-form :model="form" :rules="rules" ref="formRef"> <custom-form-item label="用户名" prop="username"> <template #popover-label> <el-popover placement="top" trigger="hover" content="请输入用户名"> <el-button icon="QuestionFilled" circle /> </el-popover> </template> </custom-form-item> </el-form> </template> <script setup> import { reactive, ref } from 'vue'; import CustomFormItem from '@/components/CustomFormItem.vue'; const form = reactive({ username: '' }); const rules = { username: [ { required: true, message: '用户名不能为空', trigger: 'blur' } ] }; const formRef = ref(null); </script> ``` ### 关键点说明 - **插槽机制**:通过 `<slot name="popover-label">` 实现了标签内容的灵活传入,使得组件具有更高的可定制性。 - **表单验证集成**:由于该组件基于 `el-form-item` 构建,因此可以无缝集成 `el-form` 的验证机制。 - **样式控制**:通过 `style` 标签中的 `scoped` 样式定义了组件内部的布局方式,确保输入框与 popover 标签并排显示---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不知道怎么起名字的夏先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值