vue el-cascader组件change失效以及下拉框不消失的问题

1.前言

最近项目上用到el-cascader这个组件,需要可以选第一级菜单,也需要可以选第二级菜单,点击完成之后需要关闭下拉框。其实功能比较简单,找了很多资料,没有找到合适的方案,下面还是自己想了个方案才解决问题

2. 碰到的问题

1.如何让下拉框消失?
2.change方法只是值发生改变才会触发,如果是同一个值就不会触发这个方法,我看有些人还去改源码?

3. 如何解决这两个问题

首先需要change方法

    //关闭联级面板
    cascaderChange() {
      //监听值发生变化就关闭它
      this.$refs.cascaderLocation.dropDownVisible = false;
      this.$refs.cascaderType.dropDownVisible = false;
    },

然后还需要visible-change这个方法,当下拉框出现值为true,下拉框消失值为false

//地点
<el-cascader
  v-model="formSearch.location"
  :show-all-levels="false"
  :options="locations"
  :props="{ checkStrictly: true, expandTrigger: 'hover' }"
  ref="cascaderLocation"
  @change="cascaderChange"
  clearable
  style="width:210px;"
  @visible-change="value => cascaderVisibleChange(value, 'location')"
></el-cascader>

//算法类型
<el-cascader
  v-model="formSearch.type"
  :show-all-levels="false"
  :options="algorithms"
  :props="{ checkStrictly: true, expandTrigger: 'hover' }"
  style="width:130px;"
  ref="cascaderType"
  @change="cascaderChange"
  @visible-change="value => cascaderVisibleChange(value, 'type')"
></el-cascader>

项目里面用了两种类型的,逻辑是当点开下拉框,先把原始值保存起来,再把值直接赋值为空,保存起来的目的是防止用户没选直接关闭了下拉框,这种情况就需要用到原来保存起来的值

cascaderVisibleChange(value, type) {
  if (value) {
    if (type == "location") {
      this.oldLocation = this.formSearch.location;
      this.formSearch.location = "";
    } else if (type == "type") {
      this.oldType = this.formSearch.type;
      this.formSearch.type = "";
    }
  } else {
    if (type == "location" && !this.formSearch.location) {
      this.formSearch.location = this.oldLocation;
    } else if (type == "type" && !this.formSearch.type) {
      this.formSearch.type = this.oldType;
    }
  }
}

结果如下图:
在这里插入图片描述

<think>好的,我现在需要解决用户的问题,即如何手动触发el-cascader组件收起下拉选择框。用户提到了在Vue3和Element Plus中使用el-cascader组件的情况,尤其是在开启严格单选模式(checkStrictly: true)后,想要在点击文字后自动收起下拉框。根据用户提供的引用内容,之前他们已经实现了点击文字选中选项的功能,现在需要进一步处理下拉框的收起。 首先,我需要回忆Element Plus的el-cascader组件的API。通常,这种UI组件会有一些方法或者事件来控制下拉框的状态。比如,可能有blur方法用于失去焦点,或者toggleDropDownVisible方法来切换下拉框的显示。此外,使用ref来访问组件实例,然后调用其方法是常见的做法。 根据引用中的内容,当用户选择选项后,希望自动收起下拉框。这应该在选中选项的事件处理函数中触发。例如,在@change事件或者某个自定义的点击事件中,调用组件的方法来关闭下拉框。 接下来,我需要验证Element Plus的el-cascader是否提供了这样的方法。查阅官方文档,发现el-cascader有一个hide方法,可以用于手动关闭下拉框。因此,解决方案可能是通过ref获取组件实例,然后在需要的时候调用hide()方法。 此外,用户可能在开启严格单选模式后,通过点击文字触发选中,这时候可能需要在处理选中的回调函数中调用hide方法。例如,在@change事件中,或者在使用自定义的点击事件处理文字点击时,执行this.cascaderRef.hide()。 需要注意的是,在Vue3中,使用composition API,可能需要使用ref来引用组件,并通过.value来访问实例。例如,在模板中给el-cascader设置ref="cascaderRef",然后在脚本中使用const cascaderRef = ref(null),之后通过cascaderRef.value.hide()来调用方法。 另外,用户可能遇到的问题是如何在点击选项后自动关闭下拉框。这时候,除了在@change事件中调用hide方法,还需要确保事件触发的时机正确,可能在选项被选中的同时关闭。 总结步骤:1.el-cascader设置ref;2. 在需要收起下拉框事件处理函数中,通过ref调用hide方法;3. 确保在选项选中后触发该事件,比如在@change或者自定义的点击处理函数中。 同时,考虑到用户之前已经实现了点击文字选中,可能需要将hide方法的调用整合到现有的代码逻辑中,确保选中操作完成后立即关闭下拉框。例如,在点击文字的事件处理函数中,先设置选中的值,然后调用hide()。 最后,需要提供一个示例代码,展示如何正确使用ref和hide方法,并说明在Vue3中的写法,比如使用setup语法糖和ref。</think>在 Vue3 + Element Plus 中手动触发 el-cascader 组件收起下拉框,可通过调用组件实例的 `hide()` 方法实现。以下是具体实现步骤: ### 实现步骤 1. **绑定组件引用** 使用 `ref` 获取 el-cascader 组件实例 ```html <el-cascader ref="cascaderRef" /> ``` 2. **调用隐藏方法** 在需要触发的代码位置(如选中选项后)调用: ```typescript const cascaderRef = ref(); // 获取组件实例 // 手动触发收起下拉框 const handleClose = () => { cascaderRef.value?.hide(); // 调用组件隐藏方法 }; ``` ### 完整示例 ```html <template> <el-cascader ref="cascaderRef" :options="options" :props="{ checkStrictly: true }" @change="handleChange" /> </template> <script setup> import { ref } from 'vue'; const cascaderRef = ref(); const options = [/* 你的级联数据 */]; // 选中后自动收起 const handleChange = () => { cascaderRef.value.hide(); }; // 其他触发场景(如按钮点击) const manualTrigger = () => { cascaderRef.value.hide(); }; </script> ``` ### 关键点说明 1. **hide() 方法** Element Plus 的 el-cascader 组件内置了 `hide()` 方法,可直接控制下拉框显隐[^2] 2. **严格模式下的整合** 若已实现点击文字选中功能(通过 CSS 隐藏单选框 + 事件代理),在选中事件回调中调用 `hide()` 可实现"选中即关闭"的交互效果[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值