vue使用el-select下拉框匹配不到值的问题及解决
作者:铁锤妹妹@
这篇文章主要介绍了vue使用el-select下拉框匹配不到值的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
使用el-select下拉框匹配不到值的问题
问题描述
点击编辑弹窗里从上面列表行数据里取到的乙方名称变成了乙方id15,产生的原因是因为弹窗里的甲乙方列表是从接口请求来的,比如后期某个乙方公司关停了,这条数据就会被删除,导致我们取不到这条数据
查看接口返回的列表,发现少了行数据中的乙方这条数据
解决思路
1.findIndex() 返回值判断编辑当前行数据取到的id和甲乙方列表里的id是否有一样的; 如果有相同id的话,返回第一个符合条件的数组成员位置,都不符合条件,则返回 -1
2.如果返回数组成员位置 < 0 的话,从列表行数据取id和name值,创建一条被删除这条数据的新对象;push进数组的最后一条,这样就不存在id取不到的情况了
解决方法
<el-form-item v-if="showPartner === '1'" label="甲方"> <el-select v-model="partnerForm.partner_id_a" filterable> <el-option v-for="(val, key) in partnerAList" :key="key" :label="val.partner_name" :value="val.id" /> </el-select> </el-form-item> <el-form-item v-if="showPartner === '1'" label="乙方"> <el-select v-model="partnerForm.partner_id_b" filterable> <el-option v-for="(val, key) in partnerBList" :key="key" :label="val.partner_name" :value="val.id" /> </el-select> </el-form-item>
setup(props, { emit }) { const partnerAList = ref<any[]>([]) const partnerBList = ref<any[]>([]) const showPartner = ref<string>('0') const dataMap = reactive({ partnerForm: { phone: '', partner_id_a: '0', partner_id_b: '0', username: '', remark: '', status: '' } }) const { onSubmit, close, formNode, subLoading } = useForm({ type: props.type, emit: emit, editApi: partnerApi['EDITPARTNERUSER'], addApi: partnerApi['ADDPARTNERUSER'], form: dataMap.partnerForm }) function getPartnerAList() { partnerApi['GETPARTNERALIST']().then((res: any) => { if (res.data.code === '20000') { partnerAList.value = res.data.data var tempObj = { id: '0', partner_name: '请选择' } partnerAList.value.unshift(tempObj) const temp = res.data.data.findIndex((item:any) => { return item.id === props.info['partner_id_a'] }) if (temp < 0) { const presentObj = { id: props.info['partner_id_a'], partner_name: props.info['party_a_name'] } partnerAList.value.push(presentObj) } } }) } function getPartnerBList() { partnerApi['GETPARTNERBLIST']().then((res: any) => { if (res.data.code === '20000') { partnerBList.value = res.data.data var tempObj = { id: '0', partner_name: '请选择' } partnerBList.value.unshift(tempObj) const temp = res.data.data.findIndex((item:any) => { return item.id === props.info['partner_id_b'] }) if (temp < 0) { const presentObj = { id: props.info['partner_id_b'], partner_name: props.info['party_b_name'] } partnerBList.value.push(presentObj) } } }) } onMounted(() => { getPartnerAList() getPartnerBList() }) return { formNode, ...toRefs(dataMap), partnerFormRules, onSubmit, close, subLoading, partnerAList, partnerBList, showPartner, onSubmitForm } }
el-select下拉框,选择后赋值成功,但是框上不显示选中的值的解决
最近在做项目时发现el-select下拉框,选择后赋值成功,但是框上不显示选中的值。
后来查了下官方文档之后发现原因:
vue 无法监听动态新增的属性的变化,需要用 $set 来为这些属性赋值。
如上图所示,操作人下拉框初始没有值,选择了操作班组之后,根据所选的班组去获取后台数据填充操作人下拉框。
然后就发现了问题:选择了操作人之后输入框还是没有值,但是绑定的@change事件currOperatorChange 打印出了选中的值。
解决方法:用 $set 来赋值
如下所示:
<el-row> <el-col :span="12"> <el-form-item prop="deptId" :label="$t('taskManage.lockTask.deptId')+':'"> <treeselect :placeholder="$t('taskManage.lockTask.selDeptId')" :options="deptTree" :normalizer="normalizer" v-model="formData.deptId" @select="selectDepart"> </treeselect> </el-form-item> </el-col> <el-col :span="12"> <el-form-item prop="operateId" :label="$t('taskManage.lockTask.table.operateName')+':'"> <el-select clearable v-model="formData.operateId" @change="currOperatorChange" :placeholder="$t('taskManage.lockTask.selOperateName')"> <el-option v-for="item in operateOption" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> </el-col> </el-row>
// 操作人选中项发生变化 currOperatorChange(val) { console.log('操作人选中项发生变化', val) if (val) { let obj = {} obj = this.operateOption.find(item => { //这里的operateOption就是上面遍历的数据源 return item.value === val //筛选出匹配数据 }) this.$set(this.formData, this.formData.operateId, val.value) this.formData.operateName = obj.label console.log('修改操作人名称', obj.label, obj.value) } else { this.formData.operateName = '' this.$set(this.formData, this.formData.operateId, '') } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。