el-select 选中的值与展示的不一样

文章介绍了如何在前端使用ElementUI的el-select组件实现一个可搜索、多选且只显示邮箱前缀的列表,同时对选中的邮箱进行高亮和脱敏处理。选中时仅显示脱敏后的邮箱前缀,保存时处理原始值,回显时则对原始数据进行脱敏展示。

背景: 查询列表,用户名和邮箱混合展示,选中后只展示邮箱前缀,并高亮,保存时传整个信息,回显时展示前缀;

<el-select
            v-model="labelForm.notifyUser"
            clearable
            multiple
            remote
            filterable
            v-scroll="(val) => handleScroll(val)"
            @visible-change="fouceValue()"
            :remote-method="searchRemote"
            :multiple-limit="5"
            style="width: 100%"
          >
            <el-option
              :class="[labelForm.notifyUser.includes(option.email.split('@')[0]) ? 'selected' : '']"
              v-for="option in businessOwnerOption"
              :key="option.email"
              :value="option.itemEmail"
            >
              <template>
                <span>
                  {{`${option.nickName} (${option.email})`}}
                </span>
              </template>
            </el-option>
          </el-select>

使用插槽的方式实现:

<template>
   <span>
        {{`${option.nickName} (${option.email})`}}
   </span>
 </template>

用 class 展示高亮

:class=“[labelForm.notifyUser.includes(option.email.split(‘@’)[0]) ? ‘selected’ : ‘’]”

最多选中个数

:multiple-limit=“5”

:value=“option.itemEmail” 表示展示的值

获取数据后添加 itemEmail, 为展示做准备,并且该数据是脱敏后数据

this.businessOwnerOption.forEach(item => {
    item.itemEmail = getEncEmail(item.email)
})

保存时做原值处理

data.labelForm.notifyUser = data.labelForm.notifyUser.map(item => {
    return this.businessOwnerOption.find(el => {
         return el.itemEmail == item
    }).email
 })

数据回显:

回显的数据是原值,需要做脱敏处理,原值展示列表不高亮。

labelForm.notifyUser = labelForm.notifyUser.map(el => {
    return el.split('@')[0];
 })
// 邮箱脱敏
export function getEncEmail(str) {
	let atIndex = str.indexOf("@");
	let username, domain
	if (atIndex !== -1) {
		 username = str.substring(0, atIndex);
		 domain = str.substring(atIndex + 1);
	}
	return username
}
### el-option 类型相同但回显的原因分析 在 Vue Element-UI 中,`el-select` 组件的 `v-model` `el-option` 的 `value` 属性匹配时会触发选高亮显示(即回显)。如果类型一致但仍无法回显,则可能由以下几个原因引起: 1. **数据绑定问题** 如果 `el-select` 的 `v-model` 未正确更新或初始化为空,则即使 `el-option` 的 `value` 类型一致也会回显。例如,在某些情况下,后端返回的数据结构可能导致前端未能正确解析所需的字段[^4]。 2. **唯一键 (`key`) 问题** 当使用对象作为 `el-option` 的 `value` 时,需确保每都有唯一的 `key` 属性。如果没有设置或者重复,可能会导致组件内部状态混乱而影响回显效果。 3. **异步加载延迟** 若 `el-option` 数据是从接口动态获取的,可能存在时间差使得初始渲染完成后再收到实际可用的数据列表。此时由于 DOM 已经生成完毕,新加入的内容会被自动识别为选中的状态[^5]。 4. **特殊字符或空白符干扰** 即使表面上看起来两个字符串完全一样,但如果其中一个包含了可见字符(如多余的空格),也会造成比较失败从而阻止正常回显行为的发生[^2]。 --- ### 解决方案 #### 方法一:强制转换类型 对于数字符串型混合的情况,可以通过 JavaScript 提供的方法统一其形式以便于对比操作成功执行。比如将所有的 number 转化成 string 或反之亦然: ```javascript // 将 Number 类型转 String this.selectedValue = this.backendData.toString(); ``` 这种方法简单直接,适用于简单的场景下快速修复因类型差异引发的问题。 #### 方法二:重新渲染 Select 控件 当发现尽管设置了相同的仍无反应时,尝试利用条件渲染指令 `v-if` 来销毁并重建该控件可能是有效的手段之一。具体做法是在适当时候切换变量 showClub 的布尔得以达到目的: ```html <el-select v-if="showClub" v-model="selectedItem"> <el-option v-for="(item,index) in optionsArray" :key="index" :label="item.name" :value="item.id"></el-option> </el-select> <button @click="refreshSelect">Refresh</button> <script> export default { data(){ return{ selectedItem:'', optionsArray:[], showClub:true, } }, methods:{ refreshSelect:function(){ this.showClub=false; setTimeout(() => {this.showClub=true;},0); } } } </script> ``` 此方式虽然有效但也稍显笨拙,仅推荐用于其他途径均告失效后的最终补救措施。 #### 方法三:监听变化手动调整 采用更灵活的方式通过监听器观察目标属性的变化情况,并在其发生变化之后立即采取行动同步至视图层面上的表现出来。这种方式的好处在于它能够很好地兼容各种复杂逻辑下的需求变更过程。 ```javascript watch:{ backendSelected(newVal){ if(typeof newVal === 'number'){ this.formField=newVal+''; }else{ this.formField=parseInt(newVal)||null; } } } ``` 上述代码片段展示了如何监控来自服务器的新选择目号数,并依据实际情况决定是否需要将其转化为另一种格式再赋予表单域之中[^3]。 --- ### 总结 综上所述,针对 ELement UI 下拉菜单能正确反映已选定条目这一现象可以从多个角度出发寻找根源所在以及相应的对策加以应对。无论是从基础层面着手优化数据传递流程还是深入探究框架本身的机制特点都为我们提供了丰富的思路方向可供借鉴参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值