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文件夹再次覆盖到原项目即可,效果如图:
相关推荐
zhoxier9 分钟前
elementui el-select 获取value和label 以及 对象的方法
javascript·vue.js·elementui
是小狐狸呀11 分钟前
elementUI-表单-下拉框数据选中后,视图不更新
前端·javascript·elementui
四岁半儿3 小时前
常用css
前端·css
你的人类朋友3 小时前
说说git的变基
前端·git·后端
姑苏洛言3 小时前
网页作品惊艳亮相!这个浪浪山小妖怪网站太治愈了!
前端
字节逆旅4 小时前
nvm 安装pnpm的异常解决
前端·npm
Jerry4 小时前
Compose 从 View 系统迁移
前端
GIS之路4 小时前
2025年 两院院士 增选有效候选人名单公布
前端
四岁半儿4 小时前
vue,H5车牌弹框定制键盘包括新能源车牌
前端·vue.js
烛阴4 小时前
告别繁琐的类型注解:TypeScript 类型推断完全指南
前端·javascript·typescript