级联选择器回显 - 子节点反查各父级节点

文章介绍了在管理后台使用多级选择器时遇到的问题,即仅保存子ID但需初始化全路径。为了解决这个问题,提出了一个递归方法来查找并返回从根到指定子ID的所有父ID。该方法通过遍历多级数组结构,实现了从ID到包含所有上级ID的数组的转换。
应用场景

管理后台使用多级选择器,上送最终子id入库,后续预览后端只返回子id,无法进行多级选择器初始化

实现原理

使用递归子id查询方法,魔改记录各级父id。代码如下

// 数组反查递归
findId (array, id, arr) {
  for (let i = 0; i < array.length; i++) {
    if (array[i].id=== id) {
      arr.unshift(array[i].id) // 插入子id
      return array[i];
    } else if (Array.isArray(array[i].children)) {
      const result = this.findId(array[i].children, id, arr);
      if (result) {
        arr.unshift(array[i].id) // 递归,依次插入父级id到数组头
        return result;
      }
    }
  }
  return null;
},
// 多级数组反查记录并返回
findIdList (array, id) {
  return new Promise(resolve => {
    var arr = []
    this.findId(array, id, arr)
    resolve(arr)
  })
},
示例
const data = [
  {
    id: 1,
    children: [
      {
        id: 2,
        children: [
          {
            id: 3
          },
          {
            id: 4
          }
        ]
      },
      {
        id: 5
      }
    ]
  },
  {
    id: 6,
    children: [
      {
        id: 7
      },
      {
        id: 8
      }
    ]
  }
];

const temp = await this.findIdList(data, 4)
console.log(temp) // [1,2,4]
### el-cascader 级联选择器不自动选中的解决方案 对于 `el-cascader` 组件在懒加载模式下的问题,如果发现选项未能正常打勾,则可能是由于级联选择器无法识别已有的路径或节点。为了确保功能能够正确工作,可以采取以下措施: #### 设置 `props.lazyLoad` 当配置 `lazy-load` 属性时,需保证该函数不仅负责异步加载子项,还应处理缓存机制以便于后续访问相同分支时不重复请求数据。这有助于提高用户体验并减少不必要的网络调用。 ```javascript // 定义 lazy load 方法 const lazyLoad = (node, resolve) => { const { level } = node; setTimeout(() => { let children; if (level === 0) { // 加载根别数据... } else { // 根据当前节点获取其子节点... } // 缓存加载的结果供下次快速响应 cache[node.value] = children; resolve(children); }, 1000); // 模拟延迟效果 }; ``` #### 使用 `emitPath=false` 有时即使设置了正确的值也无法让对应的选项被标记为选中状态。此时可以通过设置属性 `emit-path="false"` 来改变默认行为,使得 v-model 接收整个对象而非仅限于 id 数组形式[^3]。 ```html <el-cascader :options="options" @expand-change="handleItemChange" :props="{ checkStrictly: true, emitPath: false }" ></el-cascader> ``` #### 处理 `checkStrictly=true` 通过启用严格模式 (`checkStrictly`) 可以允许单独选择任意层上的节点而不会影响其他关联的选择情况。这对于某些特殊业务逻辑非常有用,比如只关心最终叶子结点而不必在意中间经过哪些类目。 #### 初始化前预填充数据 考虑到懒加载特性可能导致初次渲染时缺少部分必要信息,建议提前准备好尽可能完整的初始树状结构用于支持即时反馈给用户的视觉提示。实际应用中可通过 API 请求预先抓取一部分常用分类作为基础框架,之后再按需逐步展开剩余细节[^4]。 #### 示例代码片段 下面给出一段简单的 Vue 实现来说明上述要点的应用方式: ```vue <script setup lang="ts"> import { ref } from 'vue'; let options = ref([]); // 存储静态或动态获取到的菜单列表 </script> <template> <div class="block"> <!-- 配置 props 参数 --> <el-cascader placeholder="请选择地址" :options="options" filterable clearable :props="{ expandTrigger: 'hover', lazy: true, lazyLoad, checkStrictly: true, emitPath: false }" ></el-cascader> </div> </template> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值