这是效果
这是数据
<template>
<!-- 子组件, 内部是用的el-tree -->
<PurchasingOrganizationSelect
v-model="query.purchaserDeptIds"
style="width: 240px"
:organization-data="organizationData"
:default-expanded-keys="expandedKeys"
node-key="id"
merge-value
multiple
@change="handlePurchaserDeptChange"
/>
</template>
<script>
export default {
data() {
organizationData: [], // 全部数据
expandedKeys: [], // 可以被选中的列表
defaultProps: {
},
methods: {
// 组织发生变化,最多只能选择一个一级组织
handlePurchaserDeptChange(val, items) {
// 清空组织框
if (items.length === 0) {
this.organizationData = cloneDeepPurchaser;
this.expandedKeys = [];
return;
}
// 有一个disabled为true就return, 优化
if (this.organizationData.some((item) => item.disabled)) return;
// 可以被选中的列表
let disableArr = [...val];
disableArr = this.findFather(disableArr, items[0].parentId);
// 没有被选中的数据
const spliceArray = cloneDeep(cloneDeepPurchaser).filter((item) => !disableArr.includes(item.id));
disableArr = this.findChildren(disableArr, spliceArray);
this.organizationData = this.organizationData.map((item) => ({ ...item, disabled: !disableArr.includes(item.id) }));
// 点击之后默认展开、优化体验
this.expandedKeys = disableArr;
},
// 查父节点
findFather(arr, currentParentId) {
// 根据父ID查父节点,如果父节点还存在父节点一直往上查,没有的话返回选中的列表
const target = cloneDeepPurchaser.find((item) => item.id === currentParentId);
return target ? this.findFather([...arr, target.id], target.parentId) : arr;
},
// 查子节点
findChildren(arr, spliceArray) {
// 根据父ID查子节点,如果子节点还存在子节点一直往下查,没有的话返回选中的列表
const target = spliceArray.find((item) => arr.includes(item.parentId));
return target ? this.findChildren([...arr, target.id], spliceArray.filter((item) => item.id !== target.id)) : arr;
},
}
}
</script>