完美解决el-cascader回显失败问题

博主接手老项目,从后台日志跳转页面需带请求参数,遇到Element-UI组件赋值后不回显问题。经分析,value属性是回显关键,数组值需含最后一级及父级id。给出多选和单选赋值回显的解决方案,总结了回显失败的解决办法。

项目场景:

项目场景:接手了一些老项目,需要做一些日志相关的操作,从后台日志跳转到相应页面要带上原来的请求参数,涉及到一个回显问题


问题描述

Element-UI的 <el-cascader /> 这个组件,赋值之后它不会回显!而且后端返回的值只有最后一级的id,可是一个劲看文档、找资料浪费大半天,所以总结了一个比较完美的办法


原因分析:

value 属性才是回显的关键,只有绑定了value属性才会让 <el-cascader /> 回显(单选情况下是一维数组、多选是二维数组),而且数组中的值一定是最后一级的id加上它父级的id组成

在这里插入图片描述

在这里放一下模拟的数据

depart_check: [],
options: [
	{
	    value: 1,
	    label: '东南',
	    children: [
	    	{
		        value: 11,
		        label: '上海',
		        children: [{
		            value: 111,
		            label: '黄浦区'
		        }, {
		            value: 112,
		            label: '静安区'
		        }, {
		            value: 113,
		            label: '虹口区'
		        }, {
		            value: 114,
		            label: '长宁区'
		        }]
		    }, {
		        value: 12,
		        label: '江苏',
		    }, {
		        value: 13,
		        label: '浙江',
		    }
	    ]
	}, 
	{
	    value: 2,
	    label: '西北',
	    children: [{
	        value: 21,
	        label: '陕西',
	    }, {
	        value: 22,
	        label: '新疆维吾尔族自治区',
	    }]
	}
]

解决方案:

由于后端返回来的只有最后一级的id,所以我们需要写一个递归来拿到最后一级id和它父级id的数组
废话不多说直接上代码

/*
* @param  list 数据列表
* @param  id 后端返回的id
**/
getParentsById(list, id) {
    for (let i in list) {
        if (list[i].value == id) {
            //查询到就返回该数组对象的value
            return [list[i].value]
        }
        if (list[i].children) {
            let node = this.getParentsById(list[i].children, id)
            if (node !== undefined) {
                //查询到把父节把父节点加到数组前面
                node.unshift(list[i].value)
                return node
            }
        }
    }
},

方法有了之后就开始解决问题

一、多选赋值回显

因为多选的时候绑定的value是个二维数组
比如随便选俩,change事件拿到的值就是[[1,11,111], [1,12] ]

// 选择单位
  handlechangedepatt(v) {
  	  console.log(v)
      this.depart_check = v
  },

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

因为后端只会返回来111、12两个值还是字符串格式"111,12",所以处理开始

	let _depart_check = data.depart_id ? data.depart_id.split(",").map(i => Number(i)) : []
	let _arr = []
	// 使用上面写的方法 getParentsById 找出父级id并组合
	_depart_check && _depart_check.map(i => _arr.push(this.getParentsById(this.options, i)))
	console.log("_arr: ",_arr)
	this.depart_check = _arr

控制台打印拿到的_arr,完美和change事件里拿到的值是一个格式,这样回显就完成了

在这里插入图片描述

这里有一个小问题就是,拿到的id可能很多个,getParentsById方法只能一个一个找父级id,所以需要依次获取

二、单选赋值回显

方法和多选类似,因为单选change选中的值是一位数组,比如:[ 1,11,111 ]所以当拿到后端id之后不需要太多处理,只需要根据id和数据拿到一个一维数组的数据就行了,就不多解释了

	let _depart_check = data.depart_id || ""
	let _arr = []
	_arr = this.getParentsById(this.options, _depart_check )
	this.depart_check = _arr

总结

以上就是el-cascader回显失败的解决办法,可能有些小地方不够严谨,但是大问题得到了解决。

感谢

getParentsById方法有参考 爱吃蛋炒饭加蛋 大哥的帖子 js递归查询id所对应的节点,查询该节点的父节点,查询该节点的所有子节点
新定义定义一个 _arr是因为直接map赋值是不生效的,这里有参考 i_am_a_div_日积月累_ 大哥的帖子 el-cascader回显失败;el-cascader回显不出来

补充

element-uivalueelement-plusv-model 即可

Vue 3 中使用 Element UI 或 ElementPlus 的 `<el-cascader>` 组件时,问题可按以下步骤解决。 ### 1. 确保数据正确加载 要保证组件的 `options` 数据能正确加载。以引用[2]为例,通过 API 请求获取数据并赋给 `allList`: ```vue <template> <div> <el-cascader :options="data.allList" :show-all-levels="false" v-model="form.ids" :props="{ checkStrictly: true }" /> </div> </template> <script setup> import { ref, reactive, onMounted } from 'vue'; import { getCategoryList } from '@/api/category'; // 假设这是你的API请求 const data = reactive({ allList: [] }); const form = reactive({ ids: [] // 用于 }); onMounted(() => { getCategoryList().then(res => { if (res.code === 200) { data.allList = res.data; // 假设你要是 [3, 6],即一级分类下的二级分类00 form.ids = [3, 6]; } }); }); </script> ``` 此代码中,在 `onMounted` 钩子函数里调用 API 获取数据,成功后将数据赋给 `allList`,同时将需要赋给 `form.ids` [^2]。 ### 2. 检查数据格式 `options` 数据格式要符合组件要求,一般为树形结构,每个节点包含 `value` 和 `label` 属性,可能还有 `children` 属性表示子节点。示例如下: ```javascript const data = [ { value: 1, label: '一级分类1', children: [ { value: 2, label: '二级分类1-1' } ] } ]; ``` ### 3. 处理异步数据加载 若数据是异步加载的,要确保在数据加载完成后再设置。可利用 `watch` 或 `nextTick` 来保证数据更新后再进行操作。示例如下: ```vue <template> <div> <el-cascader :options="data.allList" :show-all-levels="false" v-model="form.ids" :props="{ checkStrictly: true }" /> </div> </template> <script setup> import { ref, reactive, onMounted, watch, nextTick } from 'vue'; import { getCategoryList } from '@/api/category'; const data = reactive({ allList: [] }); const form = reactive({ ids: [] }); onMounted(() => { getCategoryList().then(res => { if (res.code === 200) { data.allList = res.data; nextTick(() => { form.ids = [3, 6]; }); } }); }); </script> ``` ### 4. 检查 `props` 配置 `props` 配置会影响组件的行为,像 `checkStrictly` 可控制是否严格选择,`show-all-levels` 能控制是否示所有层级。要根据实际需求正确配置这些属性 [^2]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值