VUE + Element-UI 使用Cascader 级联选择器,后端返回的字段和我们需要的不一致怎么办?

我们先看 Cascader 级联选择器 官方文档提供的数据格式:

      options: [
        {
          value: "zhinan",
          label: "指南",
          children: [
            {
              value: "shejiyuanze",
              label: "设计原则",
              children: [
                {
                  value: "yizhi",
                  label: "一致",
                },
                {
                  value: "fankui",
                  label: "反馈",
                },
                {
                  value: "xiaolv",
                  label: "效率",
                },
                {
                  value: "kekong",
                  label: "可控",
                },
              ],
            },
          ],
        },
      ],

而一般后台给我们返回的数据格式是这样的:

      data: [
        {
          id: 1,
          children: [
            {
              id: 2,
              children: [
                {
                  id: 6,
                  children: null,
                  label: "测试组",
                },
              ],
              label: "研发部",
            },

            {
              id: 4,
              children: null,
              label: "商务部",
            },
          ],
          label: "万物互联",
        },
      ],

跟官方文档要求的完全不一样,这样就会在使用的过程中出现一系列的问题:(比如下面这个)

选中一个直接全部选中,这显然不是我们想要的那种结果,那怎么办呢????

我们只能通过改变后台返回的数据来实现想要的功能,我们可以给el-cascader 绑定 props(:props="optionProps") 属性来进行设置:

        <el-cascader
          ref="cascader"
          v-model="values"
          :options="options"
          @change="handleChange"
          :props="optionProps"
          :show-all-levels="false"
        ></el-cascader>

在data中:

// 使用Cascader 级联选择器后台返回的数据和要求的不一致时,做出相应改变
optionProps: {
    value: "id",
    label: "label",
    children: "children",
},

这样就完美的解决了上面所出现的问题:

如果只想选中最后一级,只需要加上这个属性就可以了::show-all-levels="false" 

如果想要获取当前选中的对象,文档中并没有提供直接获取当前选择的Object

这里特别需要注意element-ui的版本问题

2.7.0版本之前

可以用this.$refs['cascader'].currentLabels获取选中节点

        <el-cascader
          ref="cascader"
          v-model="values"
          :options="options"
          @change="handleChange"
          :props="optionProps"
          :show-all-levels="false"
        ></el-cascader>
    handleChange(value) {
      let nodesObj = this.$refs['cascader'].currentLabels
      console.log(nodesObj);
    },

这里着重说一下 2.7.0版本之后

可以用this.$refs['cascader'].getCheckedNodes()获取选中节点

this.$refs['cascader'].currentLabels在2.7版本给移除了 可以通过this.$refs['件名'].getCheckedNodes()获取到选中的节点 

        <el-cascader
          ref="cascader"
          v-model="values"
          :options="options"
          @change="handleChange"
          :props="optionProps"
          :show-all-levels="false"
        ></el-cascader>
    handleChange(value) {
      let nodesObj = this.$refs["cascader"].getCheckedNodes();
      console.log(nodesObj);
      console.log(nodesObj[0].data); //打印当前选中的节点的信息
      console.log(nodesObj[0].data.id);
    },

可以选择其中某一级的:

级联选择器默认只能选择最后一级的,想要选择任意一级,我们可以在属性设置时加上:checkStrictly: true  或  加上属性 change-on-select(不推荐)

推荐 :(在data中写)

      optionProps: {
        value: "id",
        label: "label",
        children: "children",
        checkStrictly: true // 可选择任意一级
      },

不推荐element已废弃

                <el-cascader
                  v-model="temperatureFrom.options.organizationId"
                  :options="options"
                  ref="cascader"
                  @change="handleChange"
                  size="small"
                  :props="optionProps"
                  change-on-select
                  clearable
                ></el-cascader>

当你给你的层级选择器写上 clearable 属性之后,可以清空输入框内的内容 但是有时候你会发现引起一系列的报错:(比如这样)

这是因为你点击清楚数据之后,里面数据是空,但是我后面又调用里面的数据,所以才会报错:不过我们可以对先对齐进行判断一下:

    handleChange(value) {
      // console.log(value)
      let nodesObj = this.$refs["cascader"].getCheckedNodes();
        // this.normalHearForm.organizationId = nodesObj[0].data.id;
      if (nodesObj.length != 0) {
        this.normalHearForm.organizationId = nodesObj[0].data.id;
        console.log(this.normalHearForm.organizationId);
      } else {
        this.normalHearForm.organizationId = 0;
      }
    },

这样就好了!!!

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值