Element Plus中el-cascader多选时默认高度为0如何解决?

element Plus
在el-form中使用 el-cascader,如果el-cascader为多选,默认el-cascader的input的高度不足,计算高度为0
image.png

<el-form ref="searchConditionsRef" :model="searchConditions" label-width="80px">
  <el-form-item :label="`${t('alarm.GL_ALARM_REGION_NAME')}`">
      <el-cascader
          v-model="searchConditions.regionIds"
          :options="regionList"
          :props="cascaderProps"
          clearable
          style="width: 100%"
          collapse-tags-tooltip
      ></el-cascader>
  </el-form-item>
</el-form>

const cascaderProps: CascaderProps = {
    children: 'children',
    label: 'name',
    value: 'id',
    emitPath: false,
    checkStrictly: true,
    multiple: true
}

如果将multiple设为false,高度正常;
如果将el-cascader放在el-form之外,高度也正常。
请问将el-cascader设置为多选且放到el-form中使用,默认高度不足的原因是什么,如何变成正常高度?

阅读 662
avatarAI BotBETA
### 解决方案

在使用 Element Plus 的 `el-cascader` 组件时,如果遇到多选模式下默认高度为 0 的问题,通常是由于 CSS 样式冲突或组件内部的布局计算问题导致的。在 `el-form` 中使用 `el-cascader` 时,由于表单项的布局和样式可能会影响内部组件的渲染,特别是当 `el-cascader` 处于多选模式时。

为了解决这个问题,可以尝试以下几种方法:

1. **确保样式正确加载**:
   确保你的项目中已经正确引入了 Element Plus 的样式文件。如果使用的是按需加载,检查是否所有必要的样式都已经被引入。

2. **手动设置高度**:
   如果自动计算的高度不正确,你可以尝试为 `el-cascader` 的 input 容器手动设置一个固定高度。这可以通过覆盖相关的 CSS 样式来实现。例如:

.el-form-item .el-cascader__tags {

 height: auto !important; /* 或者设置一个具体的高度值 */

}


注意,`!important` 可能会覆盖其他样式,使用时需要谨慎。

3. **检查父元素样式**:
检查 `el-form` 和 `el-form-item` 的样式,确保它们没有设置影响 `el-cascader` 高度计算的属性,如 `overflow: hidden` 或 `height` 限制。

4. **更新 Element Plus 版本**:
确保你使用的是 Element Plus 的最新版本。有时候,这类问题可能是由于旧版本的 bug 导致的,新版本可能已经修复了这些问题。

5. **使用 Vue 的 `key` 强制重新渲染**:
如果问题依然存在,可以尝试在 `el-cascader` 上使用 Vue 的 `key` 属性,并在某些条件下改变这个 `key` 的值,以强制组件重新渲染。这有时可以解决由 Vue 渲染机制导致的问题。

通过上述方法,你应该能够解决 `el-cascader` 在多选模式下高度为 0 的问题。如果问题依然存在,建议检查 Element Plus 的官方文档或社区,看看是否有其他开发者遇到并解决了类似的问题。
2 个回答

在 Element Plus 的 el-cascader 组件中,当开启多选(multiple)并嵌套在 el-form 中时,出现高度计算为 0 的问题,可能是由于 el-form 的默认弹性布局(Flex)与多选级联组件内部结构冲突导致的。下面是一些是具体原因和解决方案:


原因分析

  1. 布局冲突
    el-form 默认使用 inline 布局(内部通过 Flex 实现),而多选模式下的 el-cascader 需要完整块级(Block)布局才能正确计算高度。
  2. 空状态下的占位符
    当未选择任何值时,多选 el-cascader 的输入框高度依赖于 placeholder 文本或默认最小高度,但在 el-form 的弹性布局中可能被压缩。

解决方案

1. 强制指定 el-form 为块级布局(推荐)

el-form 外层包裹一个 <div> 并设置 display: block,覆盖默认弹性布局:

<el-form ref="searchConditionsRef" :model="searchConditions" label-width="80px">
  <el-form-item :label="`${t('alarm.GL_ALARM_REGION_NAME')}`">
    <!-- 添加外层 div -->
    <div style="display: block">
      <el-cascader
        v-model="searchConditions.regionIds"
        :options="regionList"
        :props="cascaderProps"
        clearable
        style="width: 100%"
        collapse-tags-tooltip
      ></el-cascader>
    </div>
  </el-form-item>
</el-form>

2. 通过 CSS 覆盖 el-form-item 的弹性布局

直接修改 el-form-item 的样式,强制其子元素使用块级布局:

/* 全局样式或当前组件作用域内 */
.el-form-item__content {
  display: block !important;
}

3. el-cascader 设置最小高度

为多选输入框添加最小高度,确保空状态时有默认高度:

<el-cascader
  v-model="searchConditions.regionIds"
  :options="regionList"
  :props="cascaderProps"
  clearable
  style="width: 100%; min-height: 40px"  <!-- 设置最小高度 -->
  collapse-tags-tooltip
></el-cascader>

4. 强制触发布局更新(临时方案)

在组件挂载后手动触发 DOM 更新(适用于动态加载数据的场景):

import { nextTick } from 'vue'

onMounted(() => {
  nextTick(() => {
    const cascader = document.querySelector('.el-cascader')
    if (cascader) cascader.style.display = 'none'
    setTimeout(() => {
      if (cascader) cascader.style.display = 'block'
    }, 50)
  })
})

你这是选项没加载出来吧?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏