element级联选择器:已选中一个二级节点,随后又点击了一个一级节点(仅浏览,未确认选择),此时下拉框失去焦点并关闭

解决办法:点击一级节点,默认选中二级节点的第一个

级联选择器组件:

javascript 复制代码
<template>
  <el-cascader
    :class="['basic-cascader', text && 'is-text', suffixIcon]"
    v-bind="$attrs"
    v-on="$listeners"
    :style="{ '--w': width, '--h': height }"
    :popper-class="popperClass"
  ></el-cascader>
</template>
<script>
export default {
  name: "basicCascader",
  props: {
    // 是否为文字下拉框-没有边框和背景色
    text: {
      type: Boolean,
      default: false,
    },
    width: {
      type: Number,
      default: 96,
    },
    height: {
      type: Number,
      default: 19,
    },
    popperClass: {
      type: String,
      default: "basic-cascader-pover", //样式名
    },
    suffixIcon: {
      type: String,
      default: "", //自定义后缀图标组件 caretTop 实心箭头
    },
  },
};
</script>
<style lang="less" scoped>
.basic-cascader {
  width: calc(1px * var(--w));
  height: calc(1px * var(--h));
  /deep/.el-input {
    &.el-input--suffix {
      width: 100%;
      height: 100%;
    }
  }
  &.is-text /deep/.el-input {
    .el-input__inner {
      background: transparent;
      padding: 0;
      color: transparent;
      border-width: 0;
    }
    .el-input__suffix {
      display: flex;
      align-items: center;
    }
  }
  &.caretTop {
    /deep/.el-input__suffix {
      right: 0;
      .el-input__icon {
        &:before {
          content: "\e790";
        }
      }
    }
  }
}
</style>
<style lang="less">
.basic-cascader-pover {
  .el-cascader-menu__list {
    padding: 0;
    .el-cascader-node__label {
      padding-left: 0;
    }
  }
  .el-scrollbar__wrap {
    height: 232px;
    overflow: auto;
    padding: 14px 5px 10px;
    &::-webkit-scrollbar-thumb {
      display: none;
    }
  }
  .popper__arrow {
    display: none;
  }
  background: rgba(20, 51, 88, 0.5);
  box-shadow: 0px 2px 12px 0px rgba(0, 0, 0, 0.25);
  border-radius: 4px;
  backdrop-filter: blur(20px);
  border: 1px solid transparent;
  .el-cascader-menu {
    border-color: rgba(232, 232, 232, 0.1);
  }
  .el-cascader-node:not(.is-disabled),
  .el-cascader-node:not(.is-disabled) {
    &.is-active,
    &:focus,
    &:hover,
    &.in-active-path {
      background: linear-gradient(
        270deg,
        rgba(0, 128, 240, 0.1) 0%,
        rgba(0, 128, 240, 0.3) 100%
      );
    }
  }
  .el-cascader-node.in-active-path,
  .el-cascader-node.is-active,
  .el-cascader-node.is-selectable.in-checked-path {
    color: #ffffff;
  }
  .el-cascader-menu {
    font-family: SourceHanSansCN, SourceHanSansCN;
    font-weight: 500;
    font-size: 14px;
    color: rgba(140, 194, 255, 0.8);
    .el-cascader-node {
      height: 40px;
      padding-left: 15px;
      padding-right: 60px;
      .el-icon-check {
        position: absolute;
        right: 12px;
        left: auto;
        width: 18px;
        height: 100%;
        font-size: 18px;
        display: flex;
        align-items: center;
      }
      &:not(:last-child) {
        margin-bottom: 2px;
      }
    }
  }
}
</style>

组件使用:

javascript 复制代码
<BasicCascader
      v-model="areaCode"
      text
      class="area-type-select"
      :options="areaTypeList"
      :props="{ label: 'areaName', value: 'areaCode', children: 'children' }"
      :show-all-levels="false"
      @change="handleChangeArea"
      :disabled="disabled"
      suffixIcon="caretTop"
      @expand-change="expandChange"
    />


import BasicCascader from "@/components/basic/basicCascader";


  components: { BasicCascader },


  data() {
    return {
      areaCode: "", //选中的areaCode
      areaTypeList: [], //区域类型列表
    };
  },


  methods: {   
   // 展开节点发生变化时
    expandChange(e) {
      this.areaCode = [e?.[0], ""];
      this.handleChangeArea(this.areaCode);
    },
  },
相关推荐
Kel16 分钟前
深入剖析 openai-node 源码:一个工业级 TypeScript SDK 的架构之美
javascript·人工智能·架构
SuperEugene1 小时前
Vue3 模板语法规范实战:v-if/v-for 不混用 + 表达式精简,避坑指南|Vue 组件与模板规范篇
开发语言·前端·javascript·vue.js·前端框架
Luna-player1 小时前
Vue 3 + Vue Router 的路由配置,简单示例
前端·javascript·vue.js
敲代码的约德尔人2 小时前
JavaScript 设计模式完全指南
javascript·设计模式
angerdream2 小时前
最新版vue3+TypeScript开发入门到实战教程之Vue3详解props
javascript·vue.js
~欲买桂花同载酒~2 小时前
项目优化-vite打包优化
前端·javascript·vue.js
kyriewen3 小时前
JavaScript 继承的七种姿势:从“原型链”到“class”的进化史
前端·javascript·ecmascript 6
wangfpp3 小时前
性能优化,请先停手:为什么我劝你别上来就搞优化?
前端·javascript·面试
踩着两条虫3 小时前
AI 驱动的 Vue3 应用开发平台 深入探究(二十):CLI与工具链之构建配置与Vite集成
前端·vue.js·ai编程