美文网首页
el-cascader级联选择器多级动态选择

el-cascader级联选择器多级动态选择

作者: de_self | 来源:发表于2019-07-24 20:53 被阅读0次

项目要进行机构选择,后端给的接口设置了id 与pid也就是本机构id与所属机构的id,所以要逐级查询展示。在机构中又分为直属与非直属,导致机构的层级不定,有两层的,有三层的,效果如下

基于ElementUI版本为2.8.2
image.png

html 部分

<el-cascader
  ref="cascaderAddr"
  class="el-cascader"
  expand-trigger="hover"
  :props="optionProps"
  :options="raw.combination"//对应的数据源
  v-model="combination"
  @active-item-change="handleItemChange"//鼠标悬浮触发方法
>
 </el-cascader>

页面加载时发送请求接收到第一级菜单,并给第一级菜单所有项赋空children

    // 获取组织机构列表
    getCombinationList2: async function () {
      const that = this
      try {
        let paramObj = {
          CODE:'140300'
        }
        // 服务端返回成功
        let result = await GET_REGION_TREE(paramObj)
        that.raw.combination = result.regionOrgTree
        that.raw.combination.map((item, index, array) => {
          // 因为数组和对象更新后不会更新视图,这里必须用$set方法
          this.$set(array[index], 'CHILDREN', [])
        })
      } catch (e) {
        // 服务端返回失败
        this.$message.error(e.message)
      }
    }

@active-item-change="handleItemChange"//鼠标悬浮触发方法
当悬停时,触发方法,进行判断,首先判断此时鼠标的层级,如果为一级继续请求

    //处理一级菜单展示二级菜单
    handleItemChange:async function (val){
      let parentId
      const that = this
      if (val.length === 1) {
        parentId = val[0]
        that.raw.combination.map((item, index) => {
          if (item.CODE === parentId && item.CHILDREN.length === 0) {
            that.handleItemChange2(parentId,index,item);
          }
        })
      }else{
       // 如果点击的是二级分类,则直接将三级分类绑定到platOptions
        parentId = val[1]
        that.raw.combination.map((item, index) => {
          if(item.CHILDREN && item.CHILDREN.length!=0){
            item.CHILDREN.map((innerItem, innerIndex) => {
           if (innerItem.CODE === parentId && innerItem.CHILDREN.length === 0) {
              // 当二级分类的的child为空时才请求一次数据
              that.handleItemChange3(parentId,innerIndex,item);
            }
          })
          }
        })
      }
    },
//处理一级菜单展示二级菜单
    handleItemChange2:async function (parentId,index,item){
      const that = this
      try {
          let paramObj = {
            CODE : parentId
          }
          // 服务端返回成功
          let result = await GET_REGION_TREE(paramObj)
          if(result.regionOrgTree.length!=0){
            that.$set(that.raw.combination[index], 'CHILDREN', result.regionOrgTree)
            item.CHILDREN.map((innerItem, innerIndex) => {
              // 二级分类下必须要设置一个空的child数组,不然点击@active-item-change没反应
              this.$set(item.CHILDREN[innerIndex], 'CHILDREN', [])
            })
          }else{
          //  that.$set(that.raw.combination[index], 'CHILDREN','')
           
          }

        } catch (e) {
          // 服务端返回失败
          this.$message.error(e.message)
        }
    },
    handleItemChange3:async function (parentId,index,item){
      const that = this
      try {
          let paramObj = {
            CODE : parentId
          }
          // 服务端返回成功
          let result = await GET_REGION_TREE(paramObj)
          if(result.regionOrgTree.length!=0){
              this.$set(item.CHILDREN[index], 'CHILDREN', result.regionOrgTree)
          }else{
           this.$set(item.CHILDREN[index], 'CHILDREN', '')
          }

        } catch (e) {
          // 服务端返回失败
          this.$message.error(e.message)
        }
    },

相关文章

网友评论

      本文标题:el-cascader级联选择器多级动态选择

      本文链接:https://www.haomeiwen.com/subject/xmczlctx.html