elementUI项目中,当绑定值不在下拉选项中,该如果处理?

87 阅读3分钟

Vue2+elementUI项目开发过程中,遇到的问题真是层出不穷。这不,在一个老项目迭代中,因为新场景、新情况的出现,以前不存在的问题,最近却喜提一个bug。

bug描述

打开某个新增弹框,销售负责人字段默认双向绑定为登录用户的id,正常情况下,销售负责人选择框会回显对应销售负责人名称。

但因为某种原因,某个登录用户不在组织架构里,所以最后该用户的页面效果是:

销售负责人选择框没有回显销售负责人名称,但因赋值了,所以用户看似未选择销售负责人却能通过必填校验正常提交信息。

选择器的通病

上述bug,其实是选择器的通病,在select选择器、Cascader 级联选择器、Radio 单选框、Checkbox 多选框等选择器里都会遇到,尤其是在编辑数据时。

只不过,不同类型的选择器,其呈现的问题不一样。

  • select选择器

    在select选择器里,如果绑定的值(value)在下拉选项中找不到,则回显value(期望回显的则是label)

  • Cascader 级联选择器、Radio 单选框、Checkbox 多选框

    在这些选择器里,如果绑定的值(value)在下拉选项里找不到,则不回显。

常见解决方式

  • 不解决

    select选择器里不解决,直接回显value,尚可说的通,因为用户一看,就知道数据不正常。

    其他选择器里,因为不回显,用户不知道,就会以为出bug了,像我上面描述的bug一样。

  • 将绑定值清空

    利:所见即所得

    弊:详情有值,但编辑页面无值,用户也可能以为出bug了,另外,如果是必填项,用户就必须重新选一个,才能保存其他想修改的数据。

  • 通过某些方式让它正常回显

    利:即使该字段的数据有问题,不做变更,也能正常保存其他想修改的数据。

    弊:用户可能不知道该字段的数据出问题了。

上述方法,都有利有弊,需要根据业务场景,选择最适合项目的方式。

如何正常回显

我上述bug选择了第三种解决方式。因为该字段:新增时默认赋值登录用户(允许修改),而编辑时又不允许修改。

那么,我是如何让它正常回显的呢?

很简单,就是利用placeholder这个属性。

将绑定值对应的label赋值给placeholder,并将placeholder的字体颜色改为与正常回显值的颜色一样。

注意,只有placeholder的值为label时才改变颜色,如果placeholder的值是“请选择”这种占位符时,则不改变原有颜色。

另外,还需观察正常回显时的样式及交互细节,去调整placeholder的样式。

当然,不同的选择器,通过placeholder去模仿真正的回显,或多或少有些差异,做不到100%还原。这就要看业务取舍了。

关键代码如下:

//利用placeholder
:placeholder="placeholder || '请选择'"
:class="placeholder&&placeholder!=='请选择'? 'placeholder-style' : ''"
​
// 赋值placeholder
this.placeholder = '产品部/张三'
​
// 模仿正常回显时的样式
.placeholder-style {
  .el-input:not(.is-focus) {
    input::-webkit-input-placeholder { /* Chrome/Opera/Safari */
      color: #313840;
    }
    input:-ms-input-placeholder { /* IE 10+ */
      color: #313840;
    }
    input:-moz-placeholder { /* Firefox 18- */
      color: #313840;
      opacity: 1;
    }
    input::-moz-placeholder { /* Firefox 19+ */
     color: #313840;
     opacity: 1;
    }
  }
}
​