如果有同学还没用过这个功能,可以先了解下:

使用场景

大部分情况下使用 el-select 的时候,el-options 中 options 的值都是后端接口给的数据,直接赋值就可以了。但是有的时候数据量比较大,比如几千甚至上万条的时候,如果直接赋值,整个页面的 dom 会被撑爆,不仅请求全量数据接口的时候时间会很久,而且赋值完之后整个页面会非常卡。

解决方法

现在的 elementPlus 已经有虚拟化选择器了,直接使用,非常方便,如果你使用的是Vue3,可以直接移步 elementPlus官方文档

如果你使用的是 Vue2,很可惜没有现成的组件能够使用。解决方法一共两个,都是需要后端配合前端进行修改的:

  • 后端将接口改为分页的形式;前端将选择器下拉框中的数据改为滚动加载
  • 后端将接口改为模糊搜索的形式,通过选择器中输入的内容去搜索模糊匹配的数据然后返回;前端使用 elementUI 中选择器的远程搜索功能,用户在选择器输入内容后才发起请求

本次主要讲解使用远程搜索来解决的方法,前端代码就直接放出了,不过多解释:

<el-select ref="selectDom" v-model="form.diagnosisIds" :remote-method="remoteMethod" placeholder="请选择" clearable filterable multiple remote @visible-change="templateTagChange"><el-optionv-for="item in relationList":key="item.id":label="item.name":value="item.id"/>
</el-select><script> export default {data: {return {form: {diagnosisIds: [] // v-model 中绑定的值},relationList: [] // 下拉框的数据}},methods: {// 远程搜索方法,数据太多,不能直接渲染remoteMethod(query) {if (query !== '') {this.relationList = []this.loading = true// 这个方法可以做下节流处理,不需要一输入就发起请求,这里偷懒没有写getDiagnoseInfo({ diagnoseName: query }).then(res => {this.loading = falsethis.relationList = res.filter(item => {return item.name.toLowerCase().indexOf(query.toLowerCase()) > -1})})} else {this.relationList = []}},// 诊断选择器下拉框隐藏时触发事件,清空数据templateTagChange(val) {if (val === false) {this.relationList = []}}}
} </script>

带来的问题

之前直接赋值选择器选项的时候,因为页面加载完选择器的选项就有内容了,所以数据回显的时候一般后端返回id,选择器会自动匹配选项中那一项id对应的name值并回显。但是现在使用远程搜索,页面刚加载完用户不在选择器输入的话,选择器选项一直都是空的,自然也无法进行匹配回显。你会发现这时候只是id回显到选择器中,并不是回显id所匹配的name。那么该怎么解决呢?

如何解决回显问题

首先需要后端配合改一下接口,原本的接口是返回id的字符串,现在需要后端那边匹配一下对应id的name,然后返回id与name的集合,形如 { id: 1, name: 'xxx' };然后前端这里有两种解决方法:

1. 给选择器选项赋值

既然是因为选择器选项为空无法进行匹配回显,那就在页面加载完后给选择器选项赋值就好了:

const ids = [] // 专门用来存放选项id的数据
const strs = [] // 专门用来存放选项name的数据
// res.tagMapList 为接口返回的id与name的集合数据
res.tagMapList.forEach(ele => {ids.push(ele.id)strs.push(ele.value)
})
for (let i = 0; i < strs.length; i++) {this.form.diagnosisIds.push(ids[i]) // 给选择器v-model赋值,由于是支持多选的,所以会是一个数据// 给选择器的选项赋值,接可以自己匹配上name了this.relationList.push({id: ids[i],name: strs[i]})

效果如下:

会发现确实成功回显name了,但是当鼠标聚焦在选择器上且未发起远程搜索时,这个下拉框会出现这几项的值(理所应当的问题,因为给选项赋了这几个值嘛,但是在未发起远程搜索之前是不需要这个下拉框的)

2. 使用源码中的 cachedOptions 方法隐藏下拉框中的内容

有兴趣的可以自行查阅elementUI这部分的源码,简而言之就是源码中是利用cachedOptions方法将当前的下拉选项隐匿储存的集合,那我们可以通过在这个集合中把我们需要显示的选项添加进去

放出代码:

const ids = []
const strs = []
res.tagMapList.forEach(ele => {ids.push(ele.id)strs.push(ele.value)
})
for (let i = 0; i < strs.length; i++) {this.form.diagnosisIds.push(ids[i])this.$refs.selectDom.cachedOptions.push({currentLabel: strs[i],currentValue: ids[i],label: strs[i],value: ids[i]})
}

效果如下:

搞定 ~

参考资料:vue element Select组件远程搜索绑定值为对象时,编辑状态如何回显显示正确的label

elementUI 使用 el-select 的远程搜索功能,导致数据无法回显怎么解决?相关推荐

  1. element 搜索匹配_如何在Element-ui中实现一个远程搜索功能

    如何在Element-ui中实现一个远程搜索功能 发布时间:2021-01-29 14:50:00 来源:亿速云 阅读:87 作者:Leah 这篇文章给大家介绍如何在Element-ui中实现一个远程 ...

  2. ajax实现下拉列表回显,layui实现下拉复选功能的例子(包括数据的回显与上传)

    一.layui下拉复选实现的背景:实现一个管理员拥有多个权限 二. 具体实现: //依赖资源 //页面显示 角色: xm-select-search xm-select-skin="defa ...

  3. 在elementUI中使用 el-autocomplete 实现远程搜索的下拉框

    1. 在template加入如下标签 <el-form-item label="文章库" :label-width="formLabelWidth" &g ...

  4. ElementUI:文本框实现远程搜索的用法

    今天继续给大家分享一下Element UI 多选框组用法笔记,直接上代码! 1.HTML <el-form-item label="用户列表"><el-autoc ...

  5. select下拉列表支持搜索功能

    实现很简单,首先引入所需要的js和css. <script type="text/javascript" src="${ctx}/static/js/jquery. ...

  6. elementUI组件el-table实现分页、勾选、勾选回显功能

    el-table 组件标签中设置row-key属性,:row-key="getRowKey" getRowKey(row) { return row.id } type为selec ...

  7. 谷歌浏览器使用记住密码功能 导致input 输入框样式改变的解决办法

    使用到谷歌浏览器的记忆功能时  选择的内容为浏览器保存的内容时  会导致样式改变! // 在使用浏览器保存的数据时 输入框的样式 input:-webkit-autofill , textarea:- ...

  8. 记一次el-select远程搜索默认数据回显问题

    在el-select远程搜索中会有个回显问题 就是明明传入了绑定值但是却会显示不出来 解决代码如下 <el-selectv-model="ruleForm.selectId" ...

  9. iview 远程搜索选择器方法使用,选择之后清空选择的项

    vue项目中使用iview远程搜索选择器匹配数据,选择之后,提交数据,继续选择. <Select v-model="associatedCode" filterable re ...

最新文章

  1. 关于交通创新,这五大智慧城市做了啥?
  2. 脑机交互可提高行动能力
  3. Android华容道之一步一步实现-2-图片分割
  4. [Mac] php安装protobuf扩展
  5. iOS高德地图SDK定位和搜索附近信息的具体使用
  6. asp代理商源代码_广告代理商的源代码是什么样的?
  7. 页面中,通过css设置文本不能被选中
  8. 提升开发效率之命名规范
  9. 易宝支付(Java实现)
  10. 王道考研系列 计算机考研 ——机试指南(第二版) 笔记(一)
  11. linux mysql.sock文件_关于linux上mysql.sock文件的个人理解
  12. 3322的动态域名申请设置
  13. 论文中的i.e.等简写
  14. 各利不同网站的盈利模式
  15. 推荐10 款 C++ 在线编译器
  16. 青岛美迪康医疗科技有限公司
  17. 2048(Android)
  18. 主板有电无法启动_主板灯亮,主板电池有电,但无法开机
  19. android列表倒计时,RecyclerView实现列表倒计时
  20. Python|range函数用法完全解读

热门文章

  1. 如何使用hbuilder快速生成一个直接打开网站的app
  2. Win10下将Ubuntu16.04安装在移动固态硬盘上的若干问题
  3. 习题7-5 找鞍点 (20分)(函数调用解法:先找最大值后比较是否为最小值)
  4. nuc977 led 新唐自带gpio linux驱动
  5. Hack The Box-Fawn
  6. 面试官:你能说说Ribbon的负载均衡策略及原理嘛?
  7. 英语零基础怎么学计算机,零基础学英语的步骤有哪些
  8. 三维动漫计算机配置,做三维设计、CG动画一类工作需要怎样的电脑配置?
  9. 基础篇 | 15 C++ 科学计算 - OpenBLAS的安装与使用
  10. IBM暑期实习笔试后总结