elementUi的cascader级联选择器,最后一级如果没有数据,选中的checkbox清空不了的问题排查。

1,603 阅读1分钟

问题原因:

二级选中 但是三级没有的情况下点击清空。会导致清不掉. 组件的选中是以最后一级为准,组件自带的clearCheckedNodes会有问题 所以需要我们去手动清除。

附上源码文件: node_modules\element-ui\packages\cascader-panel\src\cascader-panel.vue

接下来直接上解决代码

<!-- 前两级是工种分类,最后一级是工种 三级选择器 -->
<template>
  <el-cascader
    v-model="select"
    :options="list"
    :props="props"
    clearable
    collapse-tags
    style="width: 100%;"
    :placeholder="placeholder"

    @change="change"
    :disabled="$attrs.disabled"
    ref="cascader"
  >
  </el-cascader>
</template>
<script lang="ts">
 
  export default class extends Vue {
    // el-cascader-panel组件实例 重点
    panel: any = null
    @Ref('cascader') cascader: any
    mounted() {
       // 拿到组件实例
      this.panel = this.cascader.$refs.panel
    }


    // 配置项 一些配置项可以无视
    props: any = {
      multiple: false
    }
    select: string | Array<string> = ''
    list: Array<WorkTypeCategoryTreeWithWorkType> = []

    async created() {
       // 请求
    }
    
    
    @Watch('value')
    watchValue(val: string | Array<string>) {
      // 看这边 看这边 重点  外部如果把数据清空了 手动删除
      this.select = Array.isArray(val) ? cloneDeep(val) : val
      if (!val || !val?.length) {
        this.clear()
      }
    }

    @Emit('input')
    change() {
      return this.select
    }

    // 问题原因: 二级选中 但是三级没有的情况下点击清空。会导致清不掉. 组件的选中是以最后一级为准
    // 自带的clearCheckedNodes会有问题 所以手动清除
    // 源码文件 node_modules\element-ui\packages\cascader-panel\src\cascader-panel.vue
    clear() {
      this.panel.getCheckedNodes().forEach((node: any) => {
        node.doCheck(false)
      })
    }
  }
</script>