最近做项目经常用到 el-Cascader 这个级联选择器,也是踩过好过坑,这里记录下自己踩的坑。

先说一下问题:

当在鼠标移动到 组件 位置触发子菜单后,再移动到 指南 位置,但是 组件 的子级菜单并没有收起 ,如此移来移去,让人感觉就像是 指南 下面有子级菜单,其实指南并没有子级菜单。

1. 总结一句话:移到父菜单 相应子菜单出现 没有子菜单 则所有子菜单消失

在这里插入图片描述

2. 解决办法

  • 通过 slot-scope 插槽获取 node 和 data 去渲染,不要使用 :options 去做渲染
  • 通过 node.isLeaf 判断是不是有子级菜单,为 true 就是没有,false就是存在子级菜单
  • 给 没有子级菜单添加 鼠标移入移出事件,控制 .el-cascader-menu dom元素的显示隐藏来实现
  • 附上后端返回的数据结构
    在这里插入图片描述

3. 实现代码

html

<template>
	<el-cascader
	   ref="refSubCat"
	   :show-all-levels="false"
	   :options="allSubCatList"
	   :props="subCatProps"
	   @change="handleSubCat"
	   clearable
	   expand-trigger="hover"
	   v-model="subCatValue"
	   popper-class="subCat"
	 >
	   <template slot-scope="{ node, data }">
	     <span
	       class="tag"
	       v-if="node.isLeaf"
	       @mouseenter="mouseenterSubcat(node)"
	       @mouseleave="mouseleaveSubcat(node)"
	     >{{ data.className }}</span>
	     <span v-if="!node.isLeaf">{{ data.className }}</span>
	   </template>
	 </el-cascader>
</template>

部分核心的js代码,通过移入移除控制

<script>
export default {
	data(){
		return:{
			allSubCatList: [], // 工单分类列表
			subCatProps: {
				value: "id",
		        label: "className",
		        children: "subcat"
		    }, // 格式化映射工单信息
		}
	},
	created() {
	    this.getAllSubCatList();
	},
	methods: {
		// 移入事件
	    mouseenterSubcat(node) {
	      // 获取dom 元素,他是一个数组
	      var el_l = document.querySelectorAll(
	        ".el-popper.el-cascader__dropdown.subCat .el-cascader-panel .el-cascader-menu"
	      );
	      if (el_l[node.level] && el_l.length > 0) {
	        if (node.level == 1) {
	          el_l[node.level].style.display = "none";
	          if (el_l[node.level + 1]) {
	            el_l[node.level + 1].style.display = "none";
	          }
	        } else if (node.level == 2) {
	          el_l[node.level].style.display = "none";
	        } else {
	          el_l[node.level].style.display = "none";
	        }
	      }else{
	        console.log(111)
	      }
	    },
	    // 移出事件
	    mouseleaveSubcat(node) {
	      var el_l = document.querySelectorAll(
	        ".el-popper.el-cascader__dropdown.subCat .el-cascader-panel .el-cascader-menu"
	      );
	      if (el_l[node.level] && el_l.length > 0) {
	        if (node.level == 1) {
	          el_l[node.level].style.display = "block";
	        } else if (node.level == 2) {
	          el_l[node.level].style.display = "block";
	        } else {
	          el_l[node.level].style.display = "block";
	        }
	      }
	    },
	    // 获取data数据
		getAllSubCatList() {
	      this.$axios.get(this.$httpServer.getSubCats, {}).then(res => {
	        if (res && res.data.code == "0") {
	          this.allSubCatList = res.data.data;
	        }
	      });
	    },
	}
}
</script>

css,主要是设置为块级,解决有的空白区域移入移除事件没有触发问题

.el-popper.el-cascader__dropdown.subCat .el-cascader-node__label .tag{
  display: block;
  width: 100%;
  height: 100;
}

4. 最后看下效果 (gif录屏 有色差,效果都是可以的)

在这里插入图片描述

Logo

前往低代码交流专区

更多推荐