element-plus Cascader 级联选择器实现点击文本选择之后懒加载失效

el-cascader 级联选择器

点击文本选中主要是修改radio标签样式,直接上代码

vue

<el-form-item label="区域">
        <el-cascader v-model="queryParams.areaId" ref="cityTree"  @change="queryList()" @visible-change="handleChange()" @expand-change="handleChange()"
          :props="props" popper-class="hiddenRadio" :show-all-levels="false" placeholder="请选择区域" />
 </el-form-item>

css

.el-cascader-panel .el-radio {
  width: 100%;
  height: 100%;
  z-index: 10;
  position: absolute;
  top: 0px;
  right: 0px;
  vertical-align: middle;
}

.el-cascader-panel .el-radio__input {
  visibility: hidden;
}

上面都没什么问题,设置

checkStrictly:true

之后去点击发现懒加载失效了,个人推测是由于改了radio样式导致文本lable部分被覆盖,不能触发点击事件,百度了很久都没找到解决办法,可能是个人脸黑触发了这个bug,在此记录一下

解决办法:重新给元素添加事件监听就可以解决  @visible-change事件一定要添加,否则获取不到元素

function handleChange() {
  // 事件监听实现懒加载选择任意一级
  nextTick(function () {
    //获取label
    const labelDoms = document.querySelectorAll('.el-cascader-node .el-cascader-node__label')
    //获取radio
    const radioDoms = document.querySelectorAll('.el-cascader-node .el-radio')
    //由于label是被radio覆盖,所以循环raidoDoms,反之循环labelDoms
    radioDoms.forEach((item, index) => {
      item.removeEventListener('click', function () {
        const labelDom = labelDoms[index] as HTMLElement
        labelDom.click()
      })
      item.addEventListener('click', function () {
        const labelDom = labelDoms[index] as HTMLElement
        labelDom.click()
      })
    })
  })
}

有其他解决方法可以留意让我学习一下,我真的被这个bug恶心了很久

posted @ 2023-03-14 16:53  初生土豆  阅读(1065)  评论(0编辑  收藏  举报