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文件夹再次覆盖到原项目即可,效果如图:
相关推荐
翻滚吧键盘1 分钟前
{{ }}和v-on:click
前端·vue.js
上单带刀不带妹7 分钟前
手写 Vue 中虚拟 DOM 到真实 DOM 的完整过程
开发语言·前端·javascript·vue.js·前端框架
杨进军28 分钟前
React 创建根节点 createRoot
前端·react.js·前端框架
ModyQyW43 分钟前
用 AI 驱动 wot-design-uni 开发小程序
前端·uni-app
说码解字1 小时前
Kotlin lazy 委托的底层实现原理
前端
Q_970956391 小时前
java+vue+SpringBoo校园失物招领网站(程序+数据库+报告+部署教程+答辩指导)
java·数据库·vue.js
爱分享的程序员1 小时前
前端面试专栏-算法篇:18. 查找算法(二分查找、哈希查找)
前端·javascript·node.js
翻滚吧键盘2 小时前
vue 条件渲染(v-if v-else-if v-else v-show)
前端·javascript·vue.js
vim怎么退出2 小时前
万字长文带你了解微前端架构
前端·微服务·前端框架
你这个年龄怎么睡得着的2 小时前
为什么 JavaScript 中 'str' 不是对象,却能调用方法?
前端·javascript·面试