element-ui中select组件如何禁止展示一个不存在的值

使用过element-ui的朋友都知道,当我们给select组件绑定一个不在options列表的值时,该值仍然会展示在选择框中,效果如下图:

但我们希望的效果是,value仍为"111",但不展示在选择框中,如图:

怎么实现呢?我能想到的方法有两种:

  1. 基于el-select再封装一个组件,在组件mounted的时候判断modelValue在不在options里面,不在的话就重置成空字符串;
  2. 修改el-select源码;

第一种方法得新建一个组件,然后在用到select组件的地方都要import一遍,之前用到el-select的地方也都要改,或者全局注册这个新的组件,这种做法感觉相对low一些,直接放弃;

之前学习过神光大佬的调试秘籍,里面讲到了怎样调试源码,所以今天尝试下第二种方法。由于node_modules里的element-ui是编译后的代码,没有关联sourcemap,为了拿到sourcemap,我们需要去github下载element-ui源码,具体操作步骤如下:

  1. git clone https://github.com/ElemeFE/element.git
  2. 源码clone好以后,npm install安装源码所需依赖,这里可能会遇到node-sass报错,使用nvm切换成对应版本的node即可
  3. 修改build/webpack.common.js,增加devtool: 'cheap-module-source-map',,如图:
  1. 执行npm run dist,将生成的lib文件夹替换到原项目的node_modules中,如图:
  1. 在原项目执行npm run serve,打开浏览器,在sources面板即可看到element-ui中的.vue源码了,如图:

知道了怎么调试element-ui源码以后,接下来就是分析具体问题了,既然是调试el-select组件,那么肯定是先找到packages文件夹里的select.vue文件

  1. 先看下mounted方法,里面有一句this.setSelected(),顾名思义,猜想这个方法可能就是设置下拉框的选中值,所以我们在这里打一个断点
  1. 进入setSelected方法内部,可以看到里面有一个关键的方法getOption,通过let option = this.getOption(this.value);可以看出这一句是通过传入的v-model的值去options里找对应的option,后续的逻辑就都跟这个option有关了,所以不难看出核心的逻辑应该都在这个getOption里面了
  1. 继续进入到getOption方法内部,可以看到getOption接收的value就是我们v-model里传入的111,如图:
  1. 从524至533行的for循环就是将传入的111去options里找有没有对应的option,很明显传入111,找不到对应的option,所以为undefined,如图:
  1. 既然找不到对应的option,那么就继续执行535至545行,可以看到当找不到对应的option时,又会创建一个newOption并最终返回,这个newOption对应的labelvalue就是我们传入的111,如图:
  1. 到了这里我们就定位到问题了,所以最简单的解决办法就是把newOptionlabelvalue直接给空字符串就好(这里可以临时加上/* eslint-disable */,避免重新编译报错),如图:
  1. 最后将element-ui源码重新执行npm run dist,将生成的lib文件夹再次覆盖到原项目即可,效果如图:
相关推荐
ak啊2 分钟前
WebGL魔法:从立方体到逼真阴影的奇妙之旅
前端·webgl
hang_bro13 分钟前
使用js方法实现阻止按钮的默认点击事件&触发默认事件
前端·react.js·html
哈贝#13 分钟前
vue和uniapp聊天页面右侧滚动条自动到底部
javascript·vue.js·uni-app
用户907387036486421 分钟前
pnpm是如何解决幻影依赖的?
前端
树上有只程序猿27 分钟前
Claude 4提升码农生产力的5种高级方式
前端
傻球28 分钟前
没想到干前端2年了还能用上高中物理运动学知识
前端·react.js·开源
咚咚咚ddd28 分钟前
前端组件:pc端通用新手引导组件最佳实践(React)
前端·react.js
Lazy_zheng29 分钟前
🚀 前端开发福音:用 json-server 快速搭建本地 Mock 数据服务
前端·javascript·vue.js
HJ_Coder29 分钟前
基于Proxyman的实时解密和预览方案
前端
Gixy30 分钟前
聊聊纯函数与不可变数据结构
前端·设计模式