el-cascader级联选择器-懒加载下的数据回显问题(多选/单选)

很多时候我们需要使用el-cascader去做级联的选择,同时在编辑的时候会有回显的问题,在element的文档中并没有很好的体现出el-cascader的回显问题,这个时候需要我们自己去深究一下。

首先我们会发现el-cascader的option属性:

也就是需要options才可以回显,格式一般为:

 children是二级的数据。如果有三级继续在children加入children,以此类推。

所以el-cascader回显的关键在于options的数据整合。

但是我们是在懒加载下的,并没有二级和二级以后的数据,所以要做递归循环,根据v-model拿到的值去取到二级或者多级的数据。

v-model取到的值是:[ [zhinan,shejiyuanze],[ziyuan,jiaohu] ]。

[ [一级的value,二级的value],[一级的value,二级的value] ]。

以下用valueList代替v-model

在做编辑的时候根据后端返回值我们需要转成以上格式!!!

那么开始我们的回显之旅吧。

判断是否是回显, 如果this.valueList>0 代表需要回显,调用formatting 如果不回显直接调取一 级数据resolve回去。

  lazyLoads(node, resolve) {
      console.log(node);
      if (node.level == 0) {
          debugger
        // 判断是否回显 如果this.valueList>0 代表需要回显,调用formatting 如果不回显直接调取一            
           级数据resolve回去。
        if (this.valueList.length > 0) {
          this.formatting(); 
        } else {
          let res = this.getfristChild()
          resolve(res);
        }
      } else {
        let list = this.valueList;
        //如果有children 证明有子集可以继续调取 
        if (!node.data.children) {
          let res = this.getChildrenList(node.data.value);
          setTimeout(() => {
            // 延时可加可不加
            resolve(res);
          }, 100);
        } else {
          resolve([]);
        }
        // 先合并在去重
        this.valueList = [...new Set([...this.valueList, ...list])];
        console.log(this.valueList)
      }
    },
  formatting() {
      // 拿一级数据 根据 this.valueList去判断哪些一级数据需要回显
      let res =  this.getfristChild();
      this.valueList.forEach((item) => {
        if (item.length > 1) {
          item.forEach( (sitem, index) => {
            if (index == item.length - 1) {
              return;
            }
            let arr = this.getChildrenList(sitem);
            this.findItem(res, arr, sitem);
          });
        }
      });
    },
  // 递归判断
  findItem(res, arr, id) {
       for (let i = 0; i < res.length; i++) {
          if (res[i].value === id) {
            res[i].children = arr; 
            this.optionsList = res;
          }
          if (res[i].children) {
            this.findItem(res[i].children, arr, id);
          }
        }
         
      },
 // 请求一级节点 我这里没走接口。
  getfristChild() {
    return this.list1;
  },
//获取子集数据  没到取接口,假数据模仿
  getChildrenList(value){
      let res = [];
      if (value == 'zhinan') {
        res = [
            {
                value: 'shejiyuanze',
                label: '设计原则',
                leaf:true
            },
           {
            value: 'daohang',
            label: '导航',
           }
        ];
      }
      if (value == 'ziyuan') {
        res = [
            {
                value: 'axure',
                label: 'Axure Components',
                leaf:true
            }, 
            {
                value: 'sketch',
                label: 'Sketch Templates',
                leaf:true
            }, 
            {
                value: 'jiaohu',
                label: '组件交互文档',
                leaf:true
            }
        ];
      }
      return res;
    },

 至此,el-cascader的回显就OK了,有此需求的小伙伴可以直接copy使用或者去gitHub拉取,

git地址:GitHub - wydxiansheng/el-cascaderContribute to wydxiansheng/el-cascader development by creating an account on GitHub.https://github.com/wydxiansheng/el-cascader.git

Cascader 级联选择器懒加载,一般是通过在 `load` 事件中异步加载子选项实现的。当用户选择某一级选项时,会触发 `load` 事件,此时可以根据当前选中的选项,请求后台数据获取下一级选项列表,然后更新 Cascader 的选项列表。 在懒加载时,如果需要回显已选中的选项,可以通过 `lazy` 属性配合 `value` 属性实现。`lazy` 属性表示是否启用懒加载模式,`value` 属性表示级联选择器的选中值,是一个数组。 以下是一个简单的示例: ```html <el-cascader v-model="selectedOptions" :options="options" :lazy="true" :value="selectedOptions" @load="handleLoad" ></el-cascader> ``` 在这个示例中,`selectedOptions` 是一个数组,用于绑定级联选择器的值。`options` 是一个数组,表示级联选择器的选项列表。`lazy` 属性设置为 `true`,表示启用懒加载模式。`value` 属性设置为 `selectedOptions`,表示级联选择器的选中值与 `selectedOptions` 绑定。 当用户选择某一级选项时,会触发 `load` 事件,此时会调用 `handleLoad` 方法,该方法需要异步请求后台数据,获取下一级选项列表,然后更新级联选择器的选项列表。在加载完成后,需要将 `selectedOptions` 设置为对应的数组,以便回显已选中的选项。以下是一个简单的 `handleLoad` 方法示例: ```js methods: { async handleLoad(selectedOptions) { const res = await axios.get('/api/cascader', { params: { selectedOptions: selectedOptions } }) const options = res.data // 更新级联选择器的选项列表 this.$set(selectedOptions[selectedOptions.length - 1], 'children', options) // 回显已选中的选项 this.selectedOptions = [...selectedOptions] } } ``` 在这个示例中,`handleLoad` 方法异步请求后台数据,获取下一级选项列表,然后使用 `$set` 方法更新级联选择器的选项列表,最后将 `selectedOptions` 设置为对应的数组,以便回显已选中的选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值