vue+element 的可输入查询的搜索框el-select的blur事件

本文介绍了一种在使用Element UI时遇到的关于两个级联下拉框的实现问题及其解决方案。具体讨论了如何避免因快速选择而导致的页面卡死问题,并提供了一种通过失去焦点来延迟加载数据的有效方法。

最近在开发项目问题的时候遇到的问题

有两个下拉搜索框  当第一个有选择的值时 第二个根据第一个的值进行过滤除对应的数据

类似于这种

这个是可输入的下拉多选框是 element  

刚开始在第一个下拉框中的@change事件中 写的第一个框有值然后第二框会调用 但是因为是下拉多选框 他会选择一个 第二框的接口就会调用一次 本地环境和线上环境都没问题,但是到了生产环境  可能因为一只调用第二个框的列表 点击速度跟不上渲染速度 所以会报错导致页面卡死

       第一个框的change事件里面的 代码
      // const vcIds = { vcList: this.form.vcIds.toString() }
      // clusterListApi(vcIds).then(res => {
      //   if (res.code == 200) {
      //     if (res.data.length > 0) {
      //       this.clusterList = res.data
      //       console.log(this.clusterList)
      //     } else {
      //       this.clusterList = []
      //       console.log('无数据')
      //     }
      //   }
      // })

 

为了解决这个问题 我用了另一个思路 就是在第一个框失去焦点的时候再去调用第二个框的方法 但是element 上失去焦点的方法@blur 在这上面是没有作用的  后来加了.native也没有触发

所以有了以下方法

 <el-select
                ref="reqMsgRef"
                v-model="form.vcIds"
                multiple
                filterable
                collapse-tags
                placeholder="请选择vCenter"
                @blur.native.capture="selectChange('request_msg', 'reqMsgRef')"
              >
                <el-option
                  v-for="item in vcList"
                  :key="item.vc_ip"
                  :label="item.vc_alias"
                  :value="item.vc_ip"
                />
              </el-select>

 

selectChange(flag, ref) {
      this.$refs[ref].$refs.input.blur = () => {
        const vcIds = { vcList: this.form.vcIds.toString() }
        clusterListApi(vcIds).then(res => {
          if (res.code == 200) {
            if (res.data.length > 0) {
              this.clusterList = res.data
              console.log(this.clusterList)
            } else {
              this.clusterList = []
              console.log('无数据')
            }
          }
        })
      }

    },

<think>好的,用户想在Element UI中实现el-select的可输入功能。我需要回想一下Element UI的文档和相关组件。记得el-select本身有一个filterable属性,允许用户输入过滤选项。但用户可能希望输入不在选项中的值,这时候可能需要结合自定义的输入处理。 首先,检查用户提供的引用内容。引用[1]提到了结合el-selectel-tree,可能涉及到自定义下拉内容。引用[3]提到显示name但传递id,这和处理输入可能有关系。用户可能需要允许输入新值并绑定到表单。 Element UI的el-select组件支持filterable和allow-create属性。allow-create属性可以让用户创建新条目,但需要版本支持。不过,有时候可能需要结合el-input或其他方法来实现更灵活的可输入功能。 另外,用户可能需要监听输入事件,比如当用户输入时,将输入的值添加到选项中,或者直接使用输入的值作为选择的值。这可以通过在el-select使用@blur事件或者在输入时动态更新选项。 可能还需要处理表单绑定的问题,确保输入的值能够正确保存到v-model绑定的变量中。比如,当用户输入的值不在选项中时,可能需要手动添加一个选项或者直接使用该值。 还需要考虑样式问题,确保输入框和下拉菜单的显示正常。可能需要隐藏原有的输入框,或者调整el-select的样式来容纳输入功能。 参考引用中的例子,比如引用[1]中的代码结构,可能需要将el-selectel-input结合使用,或者利用slot来自定义下拉内容。例如,在el-select内部放置一个el-input,并通过控制下拉的显示来实现可输入功能。 此外,用户可能需要示例代码,所以需要提供一个基本的Vue组件示例,展示如何配置el-select的filterable和allow-create属性,以及如何处理输入的新值。如果用户使用的是旧版本的Element UI,可能需要使用其他方法,如自定义事件处理。 最后,确保代码正确,语法符合Element UI的要求,比如正确使用v-model事件绑定和选项处理。同时,提醒用户注意版本兼容性和可能需要的额外处理,比如去重或验证输入值。</think>在Element UI中实现el-select组件的可输入功能,可以通过`filterable`属性结合`allow-create`特性实现。以下是具体实现方法和示例代码: ### 一、基础实现方式 1. **启用过滤与创建功能** ```html <el-select v-model="selectedValue" filterable allow-create placeholder="请输入或选择"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> ``` 2. **数据绑定示例** ```javascript data() { return { selectedValue: '', options: [ { value: '001', label: '选项1' }, { value: '002', label: '选项2' } ] } } ``` 通过`allow-create`属性可直接输入新值,输入的新值会自动添加到选择器中[^3] ### 二、进阶实现(动态更新选项) 当需要将输入的新值动态添加到选项列表时: ```html <el-select v-model="form.id" filterable allow-create @change="handleInputCreate"> <el-option v-for="item in dynamicOptions" :key="item.id" :label="item.name" :value="item.id"> </el-option> </el-select> ``` ```javascript methods: { handleInputCreate(val) { if (!this.dynamicOptions.some(item => item.id === val)) { this.dynamicOptions.push({ id: val, name: val }); } } } ``` 这种方法会在用户输入新值时自动扩展选项列表[^1] ### 三、与远程搜索结合(带输入建议) ```html <el-select v-model="searchValue" filterable remote :remote-method="remoteSearch" placeholder="请输入关键词"> <el-option v-for="item in searchResults" :key="item.id" :label="item.name" :value="item.id"> </el-option> </el-select> ``` ```javascript methods: { remoteSearch(query) { axios.get('/api/search?q=' + query).then(res => { this.searchResults = res.data; }); } } ``` 这种模式适用于需要调用接口获取建议选项的场景[^2]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值