el-cascader 父子半联动

产品经理提出了希望选中父级后自动选中子级,选中子级反而不希望选中父级

elementUI的级联选择器只支持严格的父子关联,后面借助网上资料在原有的基础上进行改良

实现的大体思路:取消严格的父子关联,然后手动处理选中父级后选中子级

代码:

// 实现父关联子,子不关联父
cascaderChange(val) {
	setTimeout(() => {
		const checkedNodes = this.$refs.cascader.getCheckedNodes();
		if (checkedNodes.length) {
			this.lastCheckedNodes = this.lastCheckedNodes || [];

            // 获取差异值,差异值就是选中/取消选中的值
			const diffList = this.findMissingInBoth(checkedNodes, this.lastCheckedNodes);

			// 选中/取消选中 操作
			const isChecked = val.length > this.lastCheckedNodes?.length;

			// 对差异值进行递归
			this.recursion(diffList, isChecked);

			// 更新视图
			this.$refs.cascader.$refs.panel.calculateMultiCheckedValue();
		}
		// 保存上一次的值,用来获取差异值以及确认操作类型
		this.lastCheckedNodes = checkedNodes;
	});
},
// 递归处理子级是否选中
recursion(list = [], bool) {
	list.forEach((item) => {
		item.checked = bool;
		if (item.children?.length) {
			this.recursion(item.children, bool);
		}
	});
},
// 双方找对方没有的集合
findMissingInBoth(arr1, arr2) {
	const valuesInArr1 = arr1.map((item) => item.value); // 提取arr1中集合对象的value属性
	const valuesInArr2 = arr2.map((item) => item.value); // 提取arr2中集合对象的value属性
	const missingInArr1 = arr1.filter((item) => !valuesInArr2.includes(item.value)); // 在arr1中而不在arr2中的集合对象
	const missingInArr2 = arr2.filter((item) => !valuesInArr1.includes(item.value)); // 在arr2中而不在arr1中的集合对象
	return [...missingInArr1, ...missingInArr2];
},
<el-cascader
    ref="cascader"
    v-model="formData.relatedRecruit"
	filterable
	placeholder="请选择"
	:options="orgList"
	:props="{
		value: 'value',
		label: 'label',
		checkStrictly: true,
		emitPath: false,
		multiple: true
	}"
	:show-all-levels="false"
	@change="cascaderChange"
>
</el-cascader>

如果需要回显的话得在created里初始化lastCheckedNodes(表单赋值后)

created() {
	setTimeout(() => {
		// 回显时lastCheckedNodes的初始化,需要异步获取选中节点
		this.lastCheckedNodes = this.$refs.cascader.getCheckedNodes();
	});
},

ps:只是实现了功能,有些地方还存在瑕疵,如change方法会触发两次等

参考文章:el-cascader 父关联子,子不关联父_cascader element 父子不关联-CSDN博客

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
el-cascader是Element UI中的一个组件,用于实现级联选择器。它可以实现多级联动,并且支持回显已选择的值。 要实现el-cascader的三级联动回显,需要以下步骤: 1. 定义数据源:首先,你需要定义一个数据源,包含三级联动的数据。每个级别的数据都是一个数组,其中包含了该级别的选项。 2. 绑定数据:将数据源绑定到el-cascader组件上,通过设置`:options`属性来实现。这样el-cascader就知道要显示哪些选项了。 3. 设置默认值:通过设置`v-model`属性,将默认值绑定到el-cascader组件上。默认值应该是一个数组,每个元素对应一个级别的选项。 4. 实现回显:当需要回显已选择的值时,只需将默认值设置为已选择的值即可。el-cascader会根据默认值自动展示已选择的选项。 下面是一个示例代码,演示了如何实现el-cascader的三级联动回显: ```html <template> <el-cascader v-model="selectedValues" :options="options" :props="props" @change="handleChange" ></el-cascader> </template> <script> export default { data() { return { selectedValues: [], // 默认值,用于回显已选择的值 options: [ { value: '1', label: '选项1', children: [ { value: '1-1', label: '选项1-1', children: [ { value: '1-1-1', label: '选项1-1-1' }, { value: '1-1-2', label: '选项1-1-2' } ] }, { value: '1-2', label: '选项1-2', children: [ { value: '1-2-1', label: '选项1-2-1' }, { value: '1-2-2', label: '选项1-2-2' } ] } ] }, // 其他级别的选项... ], props: { value: 'value', label: 'label', children: 'children' } }; }, methods: { handleChange(value) { console.log('已选择的值:', value); } } }; </script> ``` 在上述示例中,`selectedValues`数组用于存储已选择的值,通过设置`v-model`将其与el-cascader组件进行绑定。`options`数组定义了三级联动的数据源,`props`对象指定了数据源中的属性名。 当需要回显已选择的值时,只需将已选择的值赋给`selectedValues`数组即可。el-cascader会根据`selectedValues`自动展示已选择的选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值