el-cascader级联选择器手动赋值,input框不回显

文章描述了一种在Vue项目中使用el-cascader组件时,结合el-input实现既可以选择已有地区,又支持手动输入自定义或不存在地区的解决方案。通过级联选择器的filterable属性配合自定义事件和CSS调整,创建了一个既能过滤已有选项,又能保存输入的新值的输入体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到一个需求,使用级联选择器选择已有地区,也支持手动输入(自定义或者没有的地区)。在网上搜索了好久没有相关文章,只有el-select相关的使用,可是又不能通用,只好自己摸索,最终实现啦!

el-cascader的filterable属性是可搜索,但是只能输入:options="regionOptions" 里存在的值。

比如我的"regionOptions" 里是省市区,我输入‘北京’,就可以显示相关数据,但是如果输入‘aaa’,就会显示无匹配数据⬇

并且失去焦点后,‘aaa’也会丢失。

 那么又想使用级联panel里的值,又想输入之外的值并保存下来该怎么做呢?

大致思路:

1.在与级联组件同级的位置放置一个el-input标签,v-model与级联选择的绑定的变量相同,这样级联选择选什么都会赋给ei-input;

2.在外面用一个标签把他俩都包起来,我这里用的是li标签,给li标签绑定一个点击事件。

   点击li标签,就触发级联选择的click事件,这样级联的panel就会弹出来;

3.用样式把级联的input框隐藏掉,把弹出的panel位置调整一下,使它对准在el-input的正上方就ok!

html

<li @click="showPanel('startPointId')">
  <el-input
    v-model="startPoint"
    placeholder="请输入"
  ></el-input>
  <el-cascader
    id="startPointId"
    :options="regionOptions"
    v-model="startPoint"
    @change="handleRegionChange"
    filterable
    :props="{value:'label'}"
  >
  </el-cascader>
</li>

js

showPanel(val){
   document.getElementById(val).click()
},

handleRegionChange(value){
   this.$emit('provincesValueChang',value)
},

css

#startPointId {
  left: -190px;
  opacity: 0;
}

ps:可能会遇到只能点击不能输入的情况,是因为el-input被压到低下了,调整一下层级关系就可以,像这样。

最终效果:

 

升级!  (新增行id不重复,级联面板跟随el-input的位置走)

最后可以美化一下字符串的样式,从这样变到这样


    handleRegionChange(value){
       let val = value.toString().split(',').join('')
       this.startPoint = val
       this.$emit('provincesValueChang',value)
    },

### el-cascader 级联选择器回显自动选中的解决方案 对于 `el-cascader` 组件在懒加载模式下的回显问题,如果发现选项未能正常打勾,则可能是由于级联选择器无法识别已有的路径或节点。为了确保回显功能能够正确工作,可以采取以下措施: #### 设置 `props.lazyLoad` 当配置 `lazy-load` 属性时,需保证该函数仅负责异步加载子项,还应处理缓存机制以便于后续访问相同分支时重复请求数据。这有助于提高用户体验并减少必要的网络调用。 ```javascript // 定义 lazy load 方法 const lazyLoad = (node, resolve) => { const { level } = node; setTimeout(() => { let children; if (level === 0) { // 加载根级别数据... } else { // 根据当前节点获取其子节点... } // 缓存加载的结果供下次快速响应 cache[node.value] = children; resolve(children); }, 1000); // 模拟延迟效果 }; ``` #### 使用 `emitPath=false` 有时即使设置了正确的值也无法让对应的选项被标记为选中状态。此时可以通过设置属性 `emit-path="false"` 来改变默认行为,使得 v-model 接收整个对象而非仅限于 id 数组形式[^3]。 ```html <el-cascader :options="options" @expand-change="handleItemChange" :props="{ checkStrictly: true, emitPath: false }" ></el-cascader> ``` #### 处理 `checkStrictly=true` 通过启用严格模式 (`checkStrictly`) 可以允许单独选择任意层级上的节点而会影响其他关联的选择情况。这对于某些特殊业务逻辑非常有用,比如只关心最终叶子结点而必在意中间经过哪些父类目。 #### 初始化前预填充数据 考虑到懒加载特性可能导致初次渲染时缺少部分必要信息,建议提前准备好尽可能完整的初始树状结构用于支持即时反馈给用户的视觉提示。实际应用中可通过 API 请求预先抓取一部分常用分类作为基础架,之后再按需逐步展开剩余细节[^4]。 #### 示例代码片段 下面给出一段简单的 Vue 实现来说明上述要点的应用方式: ```vue <script setup lang="ts"> import { ref } from 'vue'; let options = ref([]); // 存储静态或动态获取到的菜单列表 </script> <template> <div class="block"> <!-- 配置 props 参数 --> <el-cascader placeholder="请选择地址" :options="options" filterable clearable :props="{ expandTrigger: 'hover', lazy: true, lazyLoad, checkStrictly: true, emitPath: false }" ></el-cascader> </div> </template> ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值