懒加载下el-cascader级联选择器实现回显

ElementUI中级联选择器如果是懒加载模式下,单纯赋值级联的数组是没办法回显的,因为无法获取下一级的数据。记录一下遇到此场景的一种解决方案。

思路:通过回显的数组form.positioning,加载并选中该数组在级联选择器中的位置,并拼接名字放到 placeholder 里。

效果如下


// html
<el-cascader :props="cityProps" :options="cityList" v-model="form.positioning" :placeholder="positioningName" style="width: 100%;"></el-cascader>

//js
<script>
export default {
    data(){
        return {
            cityList: [],
            cityProps: {
                label: 'name',
                value: 'id',
                lazy: true,
                lazyLoad: this.getNext
      },
          positioningName: ''
        }
    }
    methods: {
        reshowPositioning(positioning) {
          let promiseArr = []
          let cityList = []
          for(let i=0;i<positioning.length;i++) {
            // 获取下一层级调用的接口,可以根据自身的情况放入链式调用的接口,我这里是一样的所以    直接push
            promiseArr.push(this.getCityList(positioning[i]))
          }
          Promise.all(promiseArr).then(res=>{
            let pointerInd = null
            let obj = null
            res.forEach((item,index)=>{
              if(item.data.code == 200 ) {
                if(index===0) {
                  cityList = item.data.data
                  pointerInd = item.data.data.findIndex(ele=> ele.id ==         positioning[index+1])
              obj = cityList[pointerInd]
              this.positioningName = obj.name
            }
            else {      
              if(pointerInd && positioning[index+1]) {
                pointerInd = item.data.data.findIndex(ele=> ele.id == positioning[index+1])
                obj.children = item.data.data
                obj = obj.children[pointerInd]
                this.positioningName = this.positioningName + "/" +obj.name
              }
            }
          }
        })
          }).then(_=>{
            this.cityList = cityList
          })
        },
        getCityList(value) { 
          return this.$http.post(`/city/getList`,{
            pid: value ? value : 0
          })
        },
        getNext(node,resolve) { //lazyLoad的回调
          const {value} = node
          this.$http.post(`/city/getList`,{
            pid: value ? value : 0
          }).then(res=>{
            if(res.data.code == 200) {
            // 这里要注意,因为选中路径的各级列表已经加载过了,所以再加载时传[],避免数据重复
              if(this.form.positioning 
                && this.form.positioning.includes(value)) 
                resolve([])
              else resolve(res.data.data)
            }
          })
        },
    },
    mounted(){
        this.reshowPositioning(this.form.positioning)
    }
}
</script>

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值