vue2中Cascader 级联选择器限制选择个数和回显问题

本文介绍了在Vue项目中使用级联选择器时,如何进行默认数据绑定、控制选中项数量、处理前后端数据格式转换,以及回显和数据提交的最佳实践。

如果项目中有需要使用到级联选择器,但是要限制选择个数,可以用watch监听级联选择器双向绑定的数组。
在这里插入图片描述

1.组件默认数据绑定

级联选择器默认会绑定一个数组,节点的显示文本和值分别对应label、value属性,节点的后代对应children属性。
options为默认绑定的数组,v-model绑定的chooseList数组中是所有选中的value值

  • expandTrigger:参数可以实现悬停展开效果
  • emitPath :设置为false,只返回该节点的值
  • multiple:设置为true,支持多选
<el-cascader
 v-model="editForm.jingangvo.cellList"
:options="functionNameptions"
:props="[multiple:true,emitPath;false,expandTrigger: "hover']
@change="getcascader
ref="cascader'
clearable

2.指定数据绑定

:props=“{label:‘name’,value:‘id’,children:‘son’ }”

3.watch监听v-model绑定的数组,控制选中个数

watch:{
	'editForm.jingangvo.cellList':{
		deep:true,
		handler(newVal,oldval){
			if(newval.length>5){
				this.$message.error("最多只支持选择5项')
				this .$nextTick(()=>{
					this.editForm.jingangvo.cellList=oldval
				})
			}
		}
	}
}

4.前后端数据转换,实现回显

页面初始化加载,选择器中v-model绑定的数组有正确的值,就能回显;但是后端获取的是一个数组对象,对象中包含value和label,我们需要把value拿出来放在一个新数组里面

(1)接口初始数据回显

...
//调接口
let res = await this.GETINNERENTERPRISECONFIG(invitationCode);
//接口返回的级联选择器绑定的数据
console.log("接口返回的级联选择器绑定的数据 ,res.jingangvo.cellList)
//将数组中的value值取出重新赋值,级联选择器就可以回显啦!
res.jingangvo.celllist = res.jingangv0.cellList.map(item=>item.value)
console.log("将接口数据转成组件回显需要的value数组",res.jingangvo.cellList)
this.editForm=res

在这里插入图片描述

(2)重新选择级联选择器后,如何将选择的数据转换成后端需要的数据

getcascader(e){
	//e是选择的value,labels是选择时一级和二级的label
	//const checkedNodes=this .$refs.cascader .getcheckedNodes();
	//const labels=checkedNodes .map(node=>node.label);
	if(e.length<=5){
		this.switchCascader(e)
	}
},
switchCascader(e){
	//找到初始级联选择器中所有的childern
	const childrenList = this.functionNameOptions.map(item=>{
		return item.children
		}
	)
	//遍历选中的e数组中的value,找到children中包含value的数组对象
	let newsCellList =[]
	e.forEach(item=>{
		let valueItem = item
		childrenList.forEach((item)=>{
			newsCellList.push(item,filter(item=>item.value===valueitem))
		})
	})
	//去除newsCellList里面的空数组
	newsCellList= newsCellList.filter(arr=>arr.length>0)
	//每个数组里面嵌套了一个数组,将里层数组去掉
	this.cancatArr = newsCellList.map(item=>item[0])
	return this.cancatArr
}

在这里插入图片描述

  • 接口需要的数据格式:
    在这里插入图片描述

(3)最后提交数据给后端的时候,如何处理级联选择器的数据?

这里又要分两个思路:
1.没有重新选择级联选择器,还是默认的后端返回的初始数据,但是返回的数据被我们初始化页面的时候改变了,所以需要调取后端需要的数据转换方法,再将初始数据转换一次。
2.重新选择了级联选择器,就直接将重新选择的数据转换后再赋值传给后端

submit(){
	if(this.editForm.jingangV0.celllist,length==0) return this,$message.error("请选择级联选择器')
	if(this.cancatArr.length>0){
	//如果重新选择过级联选择器,那this.cancatArr就有值,直接赋值
		this.editForm.jingangv.cellList = this.cancatArr 
	}else{
	//没有重新选择,用的初始默认值,因为一开始我们将数据转换了级联选择器需要的value值数据,所以需要将数据再转换一次接口所需要的格式
		this,editForm.jingangv0.celllist = 	this,switchCascader(this,editForm.jingangV0.celllist)
	}
}
### Vue2Cascader 级联选择器多选回显不显示解决方案 对于 Vue2 的 `el-cascader` 组件,在处理多选情况下遇到的数据回显问题,主要集中在如何正确配置组件属性以及确保数据结构符合预期。 #### 正确配置组件属性 为了使级联选择器能够正常工作并且回显已有的选择项,需要合理设置 `props` 属性。特别是当使用懒加载模式时,应该关注如下几个重要参数: - **multiple**: 设置为 `true` 表示允许多选。 - **emitPath**: 如果设为 `false`,则只返回最终选定节点的值;如果希望获取完整的路径,则保持默认或自行设定。 - **checkStrictly**: 控制父子节点之间的关联关系,默认行为是父节点展开/折叠会影响其下的所有子节点的状态。此选项可以用来打破这种严格的层次依赖,允许单独勾选任意级别的节点[^3]。 ```html <template> <div id="app"> <!-- 使用 checkStrictly 来支持更灵活的选择 --> <el-cascader v-model="selectedOptions" :options="allOptions" :props="{ multiple: true, emitPath: false, checkStrictly: true }" @change="handleChange" clearable></el-cascader> </div> </template> <script> export default { data() { return { selectedOptions: [], // 已经被选中的条目列表 allOptions: [] // 所有可能的选择项集合 }; }, methods: { handleChange(value) { console.log('Selected:', value); } }, mounted(){ this.allOptions = [ {label:'一级1',value:'level_1'}, ... ]; // 初始化时填充已经存在的选择记录 const existingSelections = [['level_1','sub_level_1'],['level_1','another_sub']]; this.selectedOptions = existingSelections.map(selection => selection.join('/')); } }; </script> ``` 上述代码片段展示了如何通过调整 `props` 参数来优化用户体验,并且在页面初始化阶段预填入之前保存过的用户选择结果。需要注意的是,实际应用中可能还需要考虑异步加载更多层级的情况,这通常涉及到自定义请求接口服务端配合[^4]。 另外,关于 `v-model` 的绑定对象——即用于存储当前状态的对象字段(如上例中的 `selectedOptions`),应当是一个二维数组形式,其中每个内部数组代表一条完整的选择路径。例如:`[['一级1', '二级1'], ['一级1', '二级2']]` 这样的格式有助于更好地匹配展示已有选择项[^2]。 最后提醒一点,由于不同版本之间可能存在差异,请务必查阅官方文档确认最新版的具体用法支持特性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值