解决el-input中readonly和clearable不可同时使用问题

1,049 阅读1分钟

我正在参加「掘金·启航计划」

el-inputreadonlyclearable同时使用,clearable会不生效,解决readonlyclearable不可同时使用问题

场景使用: 通过按钮选择弹窗对应数据后赋值el-input中,但el-input不可手动输入,只可只读,但可一键清空数据。

  • suffix:输入框尾部内容,只对type="text"有效
  • append:输入框后置内容,只对type="text"有效
  • fa-times-circle-o:对应的清空图标类名,自定义图标,通过css实现hover显示
  • onSearchClear:清空函数
  • onDialogShow:弹窗选择框调用方法
  • readonly:是否只读
<el-form-item v-for="item in formList" :key="item.key" :label="item.label" :prop="item.key">
  <el-input v-model="form[item.key]" :maxlength="0" readonly :disabled="item.disabled" class="my-input">
  <template v-if="(!item.disabled && item.clearData) || item.clearable" v-slot:suffix>
    <span class="fa fa-times-circle-o" v-if="form[item.key]" @click="onSearchClear(item.clearData, item.key, item.callback)"></span>
  </template>
  <template v-slot:append>
    <el-button icon="search" @click="onDialogShow(item.key)" :disabled="item.disabled"></el-button>
  </template>
</el-input>
</el-form-item>
.my-input {
  .fa {
    display: none;
    margin-left: 5px;
    cursor: pointer;
    color:#ccc;
  }
}
.my-input:hover {
  .fa {
    display: inline-block;
  }
}
const onSearchClear =(arg: IAnyJsonListItem, key:string, callback: any)=>{
  if(arg){
    const formData = deepClone(state.form) //深拷贝函数
    Object.keys(arg).map((item)=>{
      formData[item] = arg[item];
    });
    formData[key] = null //当前输入框值也需清空
    state.form = formData
  }
  if (callback) {
    callback()
  }
}

调用组件:

formList: [
  { key: "customerCode", label: "客户", clearData: { customerId: null } },
]

效果如下:

  • 不选择任何数据时效果:

  • 选中数据后的效果:

  • 鼠标hover输入框后效果:

  • 清空input输入框数据后效果: