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

本文介绍如何正确配置Element UI的级联选择器组件,解决不同数据格式问题,并演示如何获取选中项及处理多级选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们先看 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;
      }
    },

这样就好了!!!

### 如何在 Element UI 的 `el-cascader` 中取消选中项 在使用 Element UI 的 `el-cascader` 组件时,如果需要清除已选中的值,可以通过绑定的 `v-model` 数据来实现。具体来说,将该数据设置为空数组即可完成清空操作[^1]。 以下是具体的实现方式: #### 方法一:通过 Vue 数据模型控制 由于 `el-cascader` 是基于双向绑定设计的组件,其选中状态由 `v-model` 控制。因此,只需将绑定的数据重置为一个空数组,就可以达到清空的效果。 ```vue <template> <div> <el-cascader v-model="selectedValue" :options="options"></el-cascader> <el-button @click="clearSelection">清空</el-button> </div> </template> <script> export default { data() { return { selectedValue: [], // 初始值为空数组 options: [ { value: 'zhinan', label: '指南', children: [ { value: 'shejiyuanze', label: '设计原则' } ] } ] }; }, methods: { clearSelection() { this.selectedValue = []; // 将绑定值设为空数组以清空选择 } } }; </script> ``` 此方法利用了 Vue 的响应式特性,在点击按钮时调用 `clearSelection` 函数,将 `selectedValue` 设置为空数组,从而实现了清空功能[^2]。 #### 方法二:解决动态更新后的高亮问题 当级联选择器的内容需要动态变化时,可能会遇到即使清空了选中值,下拉框仍然示之前的选项被高亮的情况。这是因为组件内部缓存了一些状态信息。为了彻底解决问题,可以尝试重新渲染整个组件或者手动触发更新逻辑。 一种简单的方式是通过 `key` 属性强制刷新组件实例: ```vue <template> <div> <el-cascader :key="cascaderKey" v-model="selectedValue" :options="dynamicOptions"></el-cascader> <el-button @click="resetCascader">清空并重置</el-button> </div> </template> <script> export default { data() { return { cascaderKey: 0, selectedValue: [], dynamicOptions: [] }; }, methods: { resetCascader() { this.selectedValue = []; this.dynamicOptions = []; // 动态修改选项列表 this.cascaderKey += 1; // 改变 key 值以强制重新渲染 } } }; </script> ``` 这种方法能够有效避免因组件未及时更新而导致的状态残留问题。 #### 注意事项 需要注意的是,某些情况下如果小心删除了最后一层节点的子集字段 (`children`),可能导致无法正常触发展开或折叠行为以及抛出异常错误(如 `Cannot read property ‘level’ of null`)。为了避免此类情况发生,请确保传入的数据结构始终符合预期格式[^3]。 ### 总结 以上介绍了两种主要的方式来处理 `el-cascader` 的取消选中需求——直接清空绑定变量结合动态加载场景下的额外优化措施。实际开发过程中可以根据项目具体情况灵活选用合适方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值