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文件夹再次覆盖到原项目即可,效果如图:
相关推荐
博客zhu虎康19 分钟前
React Hooks 报错?一招解决useState问题
前端·javascript·react.js
灰海33 分钟前
vue中通过heatmap.js实现热力图(多个热力点)热区展示(带鼠标移入弹窗)
前端·javascript·vue.js·heatmap·heatmapjs
王源骏1 小时前
LayaAir鼠标(手指)控制相机旋转,限制角度
前端
大虾写代码1 小时前
vue3+TS项目配置Eslint+prettier+husky语法校验
前端·vue·eslint
wordbaby2 小时前
用 useEffectEvent 做精准埋点:React analytics pageview 场景的最佳实践与原理剖析
前端·react.js
上单带刀不带妹2 小时前
在 ES6 中如何提取深度嵌套的对象中的指定属性
前端·ecmascript·es6
excel2 小时前
使用热力贴图和高斯函数生成山峰与等高线的 WebGL Shader 解析
前端
wyzqhhhh2 小时前
组件库打包工具选型(npm/pnpm/yarn)的区别和技术考量
前端·npm·node.js
码上暴富2 小时前
vue2迁移到vite[保姆级教程]
前端·javascript·vue.js
土了个豆子的2 小时前
04.事件中心模块
开发语言·前端·visualstudio·单例模式·c#