[BUG记录] element-ui / element-plus 的 Select 可搜索组件在 iOS 下无法唤起软键盘

项目场景:

运行环境:vue@3.2.37, element-plus@2.2.9


问题描述

element-plus 的 Select 组件可以通过 filterable 属性开启搜索功能,该组件在iOS系统中,点击组件输入框,无法唤起软键盘。


原因分析:

此bug自 element-ui 就有了,是该组件内部输入框的 readonly 属性导致的问题。


解决方案:

1. element-ui

这个bug element-ui 和 element-plus 都有,可以参考这篇文章:ElementUI的Select组件在IOS唤不起软键盘解决
注意:此方案在 element-plus 下有bug,首次点击仍然概率无法唤起软键盘。

<el-select 
  v-model="value"
  placeholder="Select"
  ref="select"
  @hook:mounted="cancalReadOnly(false, 'select')"
  @visible-change="(value) => cancalReadOnly(value, 'select')"
>
  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
cancalReadOnly(value, refTxt) {
  this.$nextTick(() => {
    if(!value) {
      this.$refs[refTxt]?.$el?.querySelector('.el-input__inner')?.removeAttribute('readonly')
    }
  })
},

此方案,总结一下,就是在Select组件 mounted 以及 Select下拉框隐藏时,移除Select组件内部输入框的readonly属性。

分别避免首次、后续点击输入框时无法唤起软键盘。

2. element-plus

element-plus 下未能解决的原因在于vue3中去除了这个钩子 hook:mounted (参考:Vue官方文档里没告诉你的神秘钩子——@hook)。

hook:mounted 绑定了Select组件的mounted方法。

前面也总结过,vue3.x下此钩子的失效导致了无法避免首次点击产生的bug。那么,能否使用其它钩子,或者DOM原生事件取代它呢?

element-plus 解决方案

Select组件并不支持其它的DOM原生事件,但它提供了插槽。可以通过监听插槽内元素的加载,或者直接插入一个测试元素在Select组件内,间接监听Select组件是否加载完毕。

示例:
由于图片元素支持onload事件,在Select组件内添加一张图片。需添加样式隐藏该图片,图片内容无用,所以大小应尽量小。

<el-select 
  v-model="value"
  placeholder="Select"
  ref="select"
  @visible-change="(value) => cancalReadOnly(value, 'select')"
>
  <img style="display:none" @load="cancalReadOnly(false, 'select')" src="@/assets/images/ios-keyboard-bug.png" />
  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>

也可将图片放在Select插槽内,不过插槽有边距等样式问题


其它未验证方案

vue3.0 项目中 el-select ios 无法唤起软键盘解决
ElementUI的Select组件在IOS唤不起软键盘

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值