el-cascader多层级联点击动态加载子级

功能场景:

区划级联,例如从全国各省->市->县->乡->村,五级结构,那么如果通过一个接口数据量势必太大了。可能会出现接口请求慢的情况,所以就需要点击父级再去请求下一级这样一个实现思路。

效果图:

在这里插入图片描述
在这里插入图片描述

实现代码:

element的el-cascader 是提供了动态加载方法。

在这里插入图片描述
接口的数据结构
在这里插入图片描述

<!--行政区级联下拉框-->
<template>
  <div class="cas-wrap">
    <el-cascader 
      :title="getCascaderTitle()"
      :ref="refId" 
      :placeholder="_areaName||'请选择区域'" 
      :show-all-levels="false"
      :props="propsTree" 
      @change="change" 
      v-model="curXzq" 
      size="small">
    </el-cascader>
  </div>
  
</template>

<script>
import api from '../../../../../api/api_configcenter'
let defaultareaCode = ''
let xzqLevel = 12
export default {
  name: "xzqSelect",
  data(){
    return {
      refId:'',
      curXzq:['1'],

      options:[],

      cTitle:undefined,

      /*行政区划*/
      propsTree: {
        expandTrigger:"click",
        checkStrictly:true,
        emitPath:false,
        lazy: true,
        lazyLoad(node, resolve) {
          let qhdm;

          if (node.root) {
            qhdm = defaultareaCode
          } else {
            qhdm = node.value
          }
          api.getAreaTree({qhdm: qhdm?qhdm:1}).then(res => {
            if (res.code == 0 && res.data && res.data.length>0) {
              const nodes = Array.from(res.data).map(item => ({
                value: item.qhdm,
                label: item.qhmc,
                leaf: item.qhdm.length >= xzqLevel,
              }));
              resolve(nodes);
            } else {
              resolve([]);
            }
          })
        }
      },
    }
  },
  props:{
    "areaCode":{
      type:String,
      default:''
    },
    "areaName":{
      type:String,
      default:''
    },

    /*默认级联级别,到村12, 省2,市4,县6,乡镇9,村12*/
    level:{
      default: 12
    }
  },
  computed:{
    _areaCode:{
      get(){
        return this.areaCode||''
      },
      set(val){
        this.$emit('update:areaCode',val)
      }
    },
    _areaName:{
      get(){
        return this.areaName||''
      },
      set(val){
        this.$emit('update:areaName',val)
      }
    }
  },
  created() {
    xzqLevel = this.level
    this.refId= 'xzqSelect' + (Math.random() * 1000)
  },
  methods:{

    /*获取行政区记录下拉的title*/
    getCascaderTitle(){
      if(!this.$refs[this.refId]){return ""}
      let selectedNodes =  this.$refs[this.refId].getCheckedNodes();
      let title = '';
      if(selectedNodes[0]){
        this.cTitle = selectedNodes[0].label
        let pathNodes = selectedNodes[0].pathNodes;
        pathNodes.forEach(item => {
          title += item.label + "-"
        });
        if(title){title = title.slice(0,title.length -1 );}
      }      
      return title;
    },

    getCheckedNodes(){
      return  this.$refs[this.refId].getCheckedNodes()
    },

    change(row){
      let checkedNodes = this.$refs[this.refId].getCheckedNodes()
      let res = ''
      if(checkedNodes && checkedNodes.length > 0){
       res = this.$refs[this.refId].getCheckedNodes()[0].data
      }
      this.$nextTick(() =>{
        let obj = {
          qhdm:row,
          qhmc:this.cTitle
        }
        console.log('这里就拿到最后一级区划名称和区划代码',obj)
        this._areaCode = obj.qhdm
        this._areaName = obj.qhmc
        // this.$emit('changeQhdm',obj)
      })
    },
  }
}
</script>

<style scoped lang="scss">
  .blue_select{
    width: 100%;
  }
  .sys_background_image{
    /deep/ .el-input__inner{
      &:-moz-placeholder,   
      textarea:-moz-placeholder {   
          color: #333;   
      }   
        
      &:-ms-input-placeholder,   
      textarea:-ms-input-placeholder {   
          color: #333;   
      }   
        
      &::-webkit-input-placeholder,   
      textarea::-webkit-input-placeholder {   
          color: #333;   
      }  
    }
  }
  .cas-wrap{
  }
  .words{
    border-color: #E4E7ED;
    color: #606266;
    height: 30px;
    line-height: 30px;
    border-radius: 4px;
    border: 1px solid #DCDFE6;
    padding: 0 15px;
    box-sizing: content-box;
    font-size: 13px;
    margin-top: 3px;
    cursor: pointer;
  }
</style>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_小郑有点困了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值