Cascader级联选择器,通过子节点,回显父级及祖先级节点!

本文介绍了在Vue项目中,如何处理Cascader级联选择器与树形数据的回显问题,包括新增和编辑时后端接口的交互,以及如何通过递归方法获取节点及其祖先节点的值。

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

   做后台管理系统的同学们,想必对Cascader级联选择器不会感到陌生,这个组件大多数会与树关联结合,实现对部门人员的分配等操作!这个操作前端的难点大多数是在Cascader与树的回显部分!

一般新增给后端传值的时候,保存当前人员的value或者唯一标识,而编辑回显的时候后端基本上也是将我们保存的值通过节后返回,这个时候我们就要通过返回的Id或者唯一标识,拿到当前树的节点及其祖先级节点,通过处理数据的方式,将值转化为el-Cascader的所需要回显的值!

话不多说直接上代码!

<template>
  <new-container>
 
    <el-cascader
      size="small"
      readonly
      filterable
      :props="{
        multiple: true,
      }"
      ref="auditCascader"
      v-model="auditArr"
      :options="DeptTree"
      :show-all-levels="false"
      clearable
    ></el-cascader>
  </new-container>
</template>
   
<script>
export default {
  name: "",
  data() {
    return {
     //树的值
      DeptTree: [
        {
          value: "1",
          label: "目录1",
          children: [
            {
              value: "1.1",
              label: "目录1.1",
              children: [
                {
                  value: "1.1.2",
                  label: "目录1.1.2",
                  title: "三级目录",
                },
                {
                  value: "1.1.1",
                  label: "目录1.1.1",
                  title: "三级目录",
                },
              ],
              title: "二级目录",
            },
            {
              value: "1.2",
              label: "目录1.2",

              title: "二级目录",
            },
          ],
          title: "一级目录",
        },
        {
          value: "2",
          label: "目录2",
          children: [
            {
              value: "2.1",
              label: "目录2.1",
              children: [
                {
                  value: "2.1.1",
                  label: "目录2.1.1",
                },
                {
                  value: "2.1.2",
                  label: "目录2.1.2",
                },
              ],
            },
            {
              value: "2.2",
              label: "目录2.2",
              children: [
                {
                  value: "2.2.1",
                  label: "目录2.2.1",
                },
              ],
            },
          ],
        },
        {
          value: "3",
          label: "目录3",
          children: [
            {
              value: "3.1",
              label: "目录3.1",
              children: [
                {
                  value: "3.1.1",
                  label: "目录3.1.1",
                },
              ],
            },
          ],
        },
        {
          value: "4",
          label: "目录4",
          children: [
            {
              value: "4.1",
              label: "目录4.1",
              children: [],
            },
            {
              value: "4.2",
              label: "目录4.2",
              children: [
                {
                  value: "4.2.1",
                  label: "目录4.2.1",
                },
              ],
            },
          ],
        },
      ],
      auditArr:[],
    };
  },

  mounted() {
    const targetValue = ['2.1.2','4.2.1','3.1.1'];
    this.auditArr=targetValue.map(item=>this.getParentList('value',item,this.DeptTree))
 
  },
  methods: {
    getParentList(keyNmame, code, tree) {

      // console.log('code =>', code);
      let arr = []; //要返回的数组
      for (let i = 0; i < tree.length; i++) {
        let item = tree[i];
        arr = [];
        arr.push(item[keyNmame]); //保存当前节点id
        if (code==item[keyNmame]) {
          //判断当前id是否是默认id
          return arr; //是则退出循环、返回数据
        } else {
          //否则进入下面判断,判断当前节点是否有子节点数据
          if (item.children && item.children.length > 0) {
            //合并子节点返回的数据
            arr = arr.concat(this.getParentList(keyNmame, code, item.children));
            if (arr.includes(code)) {
              //如果当前数据中已包含默认节点,则退出循环、返回数据
              return arr;
            }
          }
        }
      }
    },
  },
};
</script>
   
<style scoped ></style>

需要的同学可以把代码直接粘贴到自己demo中,验证使用!

### ElementUI 级联选择器解决方案 对于ElementUI级联选择器(Cascader),当需要实现已选值的功能时,可以通过配置`v-model`绑定的数据以及调整组件属性来完成。具体来说,在处理仅拥有最底层节点ID的情况下,为了使这些选定项能够正确示于界面中,需确保级联选择器能依据给定的最后一层节点识别并加载其完整的路径信息。 #### 绑定模型数据与设定选项 在HTML模板部分定义了一个表单项用于展示“上菜单”,其中嵌入了`<el-cascader>`组件,并通过`:options`指定了可供选择的数据源列表;同时利用`:props`自定义了一些内部参数,比如指定value字段对应的是对象内的哪个键名(`'id'`)作为唯一标识符,label则决定了每一层示的文字内容来自对象里的哪一部分(`'name'`)。另外设置了两个重要属性: - `checkStrictly=true`允许半选状态,即可以单独选择某一层而不需要连带上下一起被选中; - `emitPath=false`表示输出的结果仅为叶子结点对应的那一串值而不是整个路径上的所有节点组成的数组[^3]。 ```html <el-form-item label="上菜单" prop="pid"> <el-cascader ref="selectMenu" :options="productCategoryLists" :props="{ value: 'id', label: 'name', checkStrictly: true, emitPath: false }" clearable @change="onSelectPMenu" v-model="categoryIds" ></el-cascader> </el-form-item> ``` #### 处理逻辑 为了让已经存储下来的子节点ID能够在页面重新加载或者切换路由之后仍然保持高亮示的状态,可以在获取到服务器响应后的适当位置执行如下操作:遍历当前所有的分类树结构(productCategoryLists),找到匹配的目标节点及其祖先链路,最后将这条路径赋值给`v-model`关联变量(categoryIds)即可达到预期效果[^5]。 假设存在一个名为`findFullPathById`的方法负责查找完整路径,则可按照下面的方式调用它并将结果同步至视图层面: ```javascript // 假设这是从服务端接收到的一组顶类别加上它们各自的孩子们... let productCategoryLists = [...]; function findFullPathById(id){ let path = []; function traverse(node){ if (node.id === id || node.children && node.children.some(child => traverse(child))){ path.unshift(node); return true; } return false; } for(let topNode of productCategoryLists){ if(traverse(topNode)){ break; } } return path.map(item=>item.id); // 返由各别ID构成的数组 } // 当前场景下的最后一个子类别的ID是从数据库读取出来的 const lastChildIdFromServer = ...; this.categoryIds = findFullPathById(lastChildIdFromServer); ``` 上述方法实现了基于单个子节点ID找整条路径的功能,从而解决了仅有末端节点信息情况下的难题。值得注意的是,实际项目开发过程中可能还需要考虑更多边界条件,例如不存在该ID的情形或是性能优化等方面的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值