记录一次ElementUI踩坑艰辛历程

记录一次ElementUI踩坑艰辛历程

最近在工作上遇到了一个需求,具体如下

如果所示:

有一个Select和一个Input这两个组件要组合到一起

我看到这个需求的表情

这不是挺简单的吗??? 要知道熟悉ElementUI的朋友们,就知道Input其实就有这个功能

在官方的组件库中,就已经提供了实例,而且很简单so easy

但是事与愿违,我这里先抛开原有框架的封装的问题,先来研究一下ElementUI对于这个组件有什么问题?

我们可以看到一个比较特别点是上面图中证件类型和证件号这两个字段,都是必填的,我这里写了一个简单demo

界面如下:

一个带Select的Input的框,然后点击立即创建,校验表单,然后提交

正常情况下,操作没有问题

那么假设不输入直接选择立即创建

这时候可以看到,明显Select,没有去校验,问题出在哪里?

接着我们去分析一下代码

xml 复制代码
    <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="150px" class="demo-ruleForm">
      <el-form-item label="测试复杂输入框" prop="testInput">
        <el-input placeholder="请输入内容" class="input-with-select" v-model="ruleForm.testInput">
          <el-select style="width: 200px;" v-model="ruleForm.select" clearable slot="prepend" placeholder="请选择">
            <el-option label="餐厅名" value="1"></el-option>
            <el-option label="订单号" value="2"></el-option>
            <el-option label="用户电话" value="3"></el-option>
          </el-select>
          <el-button slot="append" icon="el-icon-search"></el-button>
        </el-input>
      </el-form-item>
      <el-form-item>
          <el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button>
          <el-button @click="resetForm('ruleForm')">重置</el-button>
      </el-form-item>
    </el-form>

校验规则如下:

yaml 复制代码
        rules: {
          testInput: [
            { required: true, message: '请输入内容', trigger: 'blur' }
          ],
        }

那么这时候我们就会发现,其实rule仅仅只是对input进行校验,没有对select进行校验,那么我们就要针对select进行校验

我这时候新增了select校验规则

yaml 复制代码
        rules: {
          testInput: [
            { required: true, message: '请输入内容', trigger: 'blur' }
          ],
          select: [
            { required: true, message: '请选择select', trigger: 'change' }
          ],
        }

但是这样肯定是不够的,要知道form是去根据formItem上的prop进行校验的,所以还需要对元素进行修改,这里对原本select外加了一层form-item并且绑定上了prop

ini 复制代码
<el-input placeholder="请输入内容" class="input-with-select" v-model="ruleForm.testInput">
    <el-form-item prop="select" slot="prepend">
        <el-select style="width: 200px;" v-model="ruleForm.select" clearable placeholder="请选择">
            <el-option label="餐厅名" value="1"></el-option>
            <el-option label="订单号" value="2"></el-option>
            <el-option label="用户电话" value="3"></el-option>
        </el-select>
    <el-button slot="append" icon="el-icon-search"></el-button>
    </el-form-item>
</el-input>

那么这时候我们再去看一下效果

似乎进行校验了,但是有明显的两个问题

  1. 提示的文字重叠了
  2. select框还是没有红色的边框

先处理第一个问题

从图中我们看出两个FormItem的内容区域重叠了,而提示语默认是在formItem顶部进行插入

那么这时候我们去看html的结构

可以看到两个错误替换的html提示层级不同,那么这时候就好办了

通过修改框架css就可以实现我们需要的效果了,这里我们分别对外层和内容的提示进行了样式修改

css 复制代码
::v-deep .el-form-item {
  .el-form-item__error {
    left: 200px;
  }
  .el-input-group__prepend {
    // 内层的样式 我们需要恢复原貌
    .el-form-item__error {
      left: 0px;
    }
  }
}

最后得到的效果如下:

是不是很完美,但是这时候还得注意一种情况,我这里只有一个formItem,如果有多个呢

显示这时候还会出现问题我们需要限定的样式只是特定的FormItem我们给自己的formItem加一个特定的class

最后效果如下,这样我们提示语错乱重叠的问题就处理好了

这效果显然还不是最终的效果,还有红框的问题没有解决

通过html元素上分析,发现到如果是未填的表单中有一个isErrorclass,那么我们就可以通过这个class进行对select框的选取

最后修改后的效果,完成符合我们的需求

闲谈

不得不说,处处是坑啊,原以为一个简单需求,最后实现起来这么多问题,笔者心里苦,感觉工作上经常遇到这种问题,看似简单的问题,里面牵扯到许多的东西。

虽然各位在此看起来可能比较简单,但是如果放在一个复杂的组件中呢。

一个组件修改差点要了一条老命

不过幸好最后还是艰难的做出来了。

相关推荐
Yvonne爱编码11 分钟前
AJAX入门-AJAX 概念和 axios 使用
前端·javascript·ajax·html·js
在路上`27 分钟前
前端学习之后端java小白(三)-sql外键约束一对多
java·前端·学习
Pu_Nine_91 小时前
10 分钟上手 ECharts:从“能跑”到“生产级”的完整踩坑之旅
前端·javascript·echarts·css3·html5
東雪蓮☆2 小时前
从零开始掌握 Web 与 Nginx:入门详解
运维·服务器·前端·nginx
脑子慢且灵2 小时前
【JavaWeb】一个简单的Web浏览服务程序
java·前端·后端·servlet·tomcat·web·javaee
柯南二号2 小时前
【大前端】 断点续传 + 分片上传(大文件上传优化) 的前端示例
前端
前端小超超2 小时前
如何配置capacitor 打包的安卓app固定竖屏展示?
android·前端·gitee
xiaopengbc2 小时前
在Webpack中,如何在不同环境中使用不同的API地址?
前端·webpack·node.js
前端AK君3 小时前
React中台系统如何嵌入到业务系统中
前端
Slice_cy3 小时前
不定高虚拟列表
前端