关于vue使用el-cascader获取值的问题【超详细】

本文主要解答了使用Vue的el-cascader组件在多选和单选模式下获取级联值的方法,以及如何实现数据回显。作者提供了代码示例,包括如何处理级联选择的数组和确保数据同步问题,以及如何在组件change事件中处理回显操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要解决的2个问题

问题1. 通过vue 的el-cascader组件,如何获取到级联值的信息?
1.1 可以选则多个级联选项的情况 【多选】
1.2 单选的情况

问题2. 如何回显信息?

问题1.1的解决方案,话不多说直接上代码

<div class="my-form-row">
   <el-form-item class="profession" prop="speciality">
         <el-cascader ref="mycascader" @change="changeCasc"  v-model="form.speciality" :options="specialityList" :props="deptsProps" clearable style="width: 504px;"></el-cascader>
     </el-form-item>
 </div>

js

data(){
	// cascader 属性
	deptsProps: {
		value: "code",
		label: "name",
		children: 'children',    //子元素字段名
	    multiple: true,
	    expandTrigger: 'hover',
	},
	
	form:{
       speciality:[]
   },
   
   specialityList: [],         // 申请专业列表[从后端获取的数据,并处理成树形结构的列表]

}

2 用cascader组件的change方法,有回调

这里有个坑:一定要用this.$nextTick()否则出现选中的数据跟打印的数据不一致的问题,因为dom没有更新完成就获取

在这里插入图片描述

methods:{
// 选择 申请专业
     changeCasc(selectValuesArr){
      	console.log("选中的值:", selectValuesArr)
		this.$nextTick(()=>{
                // 级联多选专业 的最后一项的数组
                var newArr = []

                this.form.speciality.map((item) => {
                    newArr.push(item[item.length-1])
                })
                console.log('arr new', newArr)
				

                // 获取申请专业的label文字
                //this.specialiityNameList = this.getSpecialiityName(this.specialityList, selectValuesArr)
                //console.log(this.specialiityNameList)
                //if(this.specialiityNameList.length > 5) {
                //    this.specialiityNameList = this.specialiityNameList.splice(0,5)
                //    console.log(this.specialiityNameList.length)
                //}
                
		})
	},
}

到这里就问题1,获取的问题就欧啦


问题1.1的解决方案,单选的情况

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

再看一个的例子

<el-form-item label="组织机构" prop="organizationId">
	<el-cascader ref="mycascader" @change="changeCasc()" v-model="form.organizationId" :options="organizationList" :props="deptsProps" clearable style="width: 100%;"></el-cascader>
</el-form-item>
data() {
	//表单数据
	form: {
		parentId:0,//父类id 默认0(顶级)
		parentName:"顶级类",
		organizationId: "",//组织机构
		code: "",//角色编码
		name: "",//角色名称
		type:0,//类型
		description: "",//描述
		menuIds:[],//菜单权限
	},
	deptsProps: {
		value: "id",
		label: "name",
		checkStrictly: true,
		children: 'children',    //子元素字段名
	},
	organizationList:[],        // 树形结构
}
methods:{
	changeCasc(){
		this.$nextTick(()=>{
			let thsAreaCode = this.$refs['mycascader'].checkedValue
			this.form.organizationId=thsAreaCode[thsAreaCode.length-1]   // 取数组的最后一个
		})
	}
}

额外转为树结构的通用方法如下:

// 把数据处理成树状结构
translator(parents, childrens) {
	parents.forEach(item => {
		childrens.forEach(items => {
			if (items.parentId === item.id) {
				item.children ? item.children.push(items) : item.children = [items];
				this.translator([items], childrens);
			}
		})
	})
},
getTreeData(arr) {
	let parents = arr.filter(item => item.parentId===0); //取出根节点
	let childrens = arr.filter(item => item.parentId!==0);//去除子节点
	this.translator(parents, childrens)
	return parents
},

organizationList 格式如下
在这里插入图片描述


问题2的解决方案,话不多说直接上代码

回显其实也很简单,上面changeCasc()方法获取到的整个数组信息,其实已经用this.form.speciality 进行双向绑定了,所以我们只需要将这个字段的整个信息传给后端,保存起来,然后查询的时候在返回赋值给this.form.speciality 就行

这种数据我这里贴一张图,是类似这样的多维度数组

在这里插入图片描述

这里解决一个疑惑,

上述changeCasc方法中 的newArr 其实是二维数组的每一项的最后一个值构成的数组,这是我传给后端的数据,这里可以根据你们自己的需求来定噢,如下图所示,这些值构成的新数组

在这里插入图片描述

至此,回显问题也已经欧拉
························································································································································································

后面几天我会继续更新滴,还有一些骚操作功能噢~

Vue3 和 Element-Plus 中使用 `el-cascader` 组件,可以通过 `change` 事件来获取选中的。 例如,假设你有一个 `el-cascader` 组件如下: ```html <el-cascader v-model="selectedOptions" :options="options" @change="handleCascaderChange" ></el-cascader> ``` 其中,`selectedOptions` 是一个数组,表示当前选中的,`options` 是一个数组,表示可选的选项。`handleCascaderChange` 是一个方法,用于处理 `change` 事件。 在 `handleCascaderChange` 方法中,可以通过遍历 `selectedOptions` 数组来获取每一级选中的,并将它们组合成一个字符串,作为 `el-cascader` 的 `label` 。例如: ```js export default { data() { return { selectedOptions: [], options: [ { value: 'zhinan', label: '指南', children: [ { value: 'shejiyuanze', label: '设计原则', children: [ { value: 'yizhi', label: '一致' }, { value: 'fankui', label: '反馈' } ] } ] } ] } }, methods: { handleCascaderChange(value) { let label = '' for (let i = 0; i < value.length; i++) { const option = this.options[i].children.find(item => item.value === value[i]) label += option.label + (i < value.length - 1 ? ' / ' : '') } console.log('选中的:', value) console.log('选中的标签:', label) } } } ``` 在上面的代码中,我们使用 `find` 方法来查找每一级选中的对应的选项,然后将它们的 `label` 拼接在一起,并在每一级之间添加斜杠分隔符。最终的结果就是一个字符串,表示当前选中的标签。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值