修改el-select源码解决动态option已删除后回显数字的问题

el-select源码修改 [原创文章,转载请注明出处!]

问题描述

在使用admin-element-vue框架开发前端的时候,发现el-select出现了回显的问题:
由于el-select的所有下拉option为动态数据,需要从后台获取,用户在存储数据后,下拉数据可能有部分被删除了,导致前端回显的时候没有对应option,此时前端显示的为真实数据id,容易误导用户.
错误示例

在测试中发现此情况时,已经有近百个el-select开发完成了,一个一个筛选数据显然不现实,所以想到了两种方案:

  1. 将el-select二次封装一个组件,在组件中校验回显数据是否存在于options数组中,然后全局搜索替换;
  2. 修改el-select源码.

由于全局搜索替换在修改时容易出现问题,所以选择第二种方案.

定位源码位置

所使用框架中,我们查找文档很容易得知,使用的ui组件为elementui,根据项目结构,找到了大致的源码位置如下
组件位置
查看该目录的结构可知,编译前的内容在packages中,编译后使用的为lib目录下
elementui目录结构
由于本人为java开发,对vue的编译方式其实不熟悉,所以将lib目录上的源码修改完再修改了下packages目录下的源码,具体如何固定编译如有想法请评论指正.

接下来要确定源码文件,在packages中很容易得知为如下文件,因为未曾编译过很容易看的出来
源码
但是修改这个文件的时候页面是不会有任何改变的,需要在lib路径下进行修改:
我查找了lib下的select.js,发现修改后无任何反应,但是修改input.js能影响输入框的赋值,但是肯定是要在什么地方引用了input.js的地方,不然没法传值到该js中.

经过多次测试,发现原来编译的结果在一个大文件中:
路径

源码修改

根据方法名,找到了setSelected方法,发现在这个方法中会进行赋值回显,解读源码继续发现在getOption方法中返回了所有的option,方法中对没有对应option的回显值,创造了一个新的option,只不过label是空字符串,所以我们再这里将没有对应的option时候直接返回null即可.
解决办法
保存后发现报错,原因是在setSelected中存在了空指针的情况,我们增加了一个空的判断即可:
非空判断
修改完成后发现效果:

效果
此时已完成了源码的修改,然后我们在packages中的select.vue进行对应一致的修改,就解决了这个问题.

有其他更好的方案欢迎评论

修改一下

由于上面会出现在联动时,手动给el-select赋值空字符串失效的问题,改动如下
在这里插入图片描述

***[原创文章!转载请注明出处!]***

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
el-select的选项数据与回显数据不一致时,el-option会显示为未选中状态。这种情况下,我们可以通过设置el-select的multiple属性为true来允许用户自定义选项,从而解决回显数据与选项数据不一致的问题。 具体来说,我们可以将el-select的multiple属性设置为true,并将回显数据作为v-model绑定到el-select上。这样,用户可以在el-select中自由选择选项,而不受选项数据的限制。如果回显数据中包含了选项数据中不存在的值,我们可以在el-select组件中添加一个新的el-option,提示用户该值不存在于选项数据中。 以下是一个实现提示不存在值的el-select组件的示例代码: ```vue <template> <el-select v-model="selectedValue" :multiple="true"> <el-option v-for="option in options" :key="option.value" :label="option.label" :value="option.value"></el-option> <el-option v-if="!options.some(option => option.value === selectedValue)" :label="`不存在的值:${selectedValue}`" :value="selectedValue"></el-option> </el-select> </template> <script> export default { props: { value: { type: [String, Array], default: '' }, options: { type: Array, default: () => [] } }, computed: { selectedValue: { get() { return this.value }, set(newValue) { this.$emit('input', newValue) } } } } </script> ``` 在上面的代码中,我们首先通过props接收了el-select的选项数据(options)和回显数据(value)。然后,我们将value作为v-model绑定到el-select上,以便可以监听用户的选择。接下来,我们根据options和selectedValue渲染了所有的el-option,并使用条件渲染添加了一个新的el-option,用于提示不存在于options中的selectedValue。最后,我们通过一个computed属性将selectedValue转换为双向绑定的value属性,并在setter中触发input事件,以便将用户的选择传递给父组件。 使用这个el-select组件时,如果回显数据中包含了一个不存在于选项数据中的值,el-select会自动添加一个新的选项,提示用户该值不存在于选项数据中。这样用户就可以自由选择所有选项,包括回显数据中不存在于选项数据中的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不锈钢大铁锤

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

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

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

打赏作者

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

抵扣说明:

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

余额充值