Cascader 级联选择器 - 动态加载

2,703 阅读1分钟

Cascader 级联选择器 - 动态加载

应用场景

电商后台里创建优惠券,指定那些分类可以使用此优惠券,分类为多选,分类层级最高3级

Element 样例

通过lazy开启动态加载,并通过lazyload来设置加载数据源的方法。lazyload方法有两个参数,第一个参数node为当前点击的节点,第二个resolve为数据加载完成的回调(必须调用)。为了更准确的显示节点的状态,还可以对节点数据添加是否为叶子节点的标志位 (默认字段为leaf,可通过props.leaf修改),否则会简单的以有无子节点来判断是否为叶子节点。

// 当选中某一级时,动态加载该级下的选项

<el-cascader :props="props"></el-cascader>

<script>
  let id = 0;
  export default {
    data() {
      return {
        props: {
          lazy: true,
          lazyLoad (node, resolve) {
            const { level } = node;
            setTimeout(() => {
              const nodes = Array.from({ length: level + 1 })
                .map(item => ({
                  value: ++id,
                  label: `选项${id}`,
                  leaf: level >= 2
                }));
              // 通过调用resolve将子节点数据返回,通知组件数据加载完成
              resolve(nodes);
            }, 1000);
          }
        }
      };
    }
  };
</script>

实际代码示例

  • 选择任意一级选项 {checkStrictly: true}
  • 多选 {multiple: true}
data(){
return {
    prop: {
        lazy: true,
        lazyLoad: this.lazyLoad,
        multiple: true,
        checkStrictly: true
    }
}
},
method(){
    lazyLoad (node, resolve){
        if(node.level === 3){
                this.$message.warning('无子分类')
            } else {
                setTimeout(()=>{
                    this.getFloor(node, resolve)
                },500)
            }
    },
    getFloor (node,resolve){
          // 三级时不能点击调用
          // 调用接口,参数
            CategoryService.getFloorList(node.value ? node.value.categoryId : 0,node.level+1 ||1)
            .then(res=>{
                const nodes = res.map(item=>({
                    value: {categoryId: item.cid, title: item.name || item.selfName, level: item.level},
                    label: item.name || item.selfName,
                    leaf: node.level >=2
                }))
                resolve(nodes)
            }).catch(error=>{
                this.$message.error(error)
            })
    }
}