记录下el-select实现下拉选择与输入功能(转载)

690 阅读1分钟

【需求:el-select 输入下拉搜索,匹配不到数据时也保留输入值,同时input获取焦点时保留其value值

需要注意的地方

1. 为了在匹配不到数据时也保留其输入的值,可以用 filter-method 自定义筛选

  1. el-select添加上filterable之后,点击展开,点击收起,会导致focus和blur事件不触发,但点击页面其他地方才可正常触发 ,可利用visible-change 事件来解决些问题

3. input获取焦点时保留其value值用focus事件做相关赋值处理

具体实现代码如下

<template>
  <el-select id="selectInput" v-model="value" filterable placeholder="请选择" ref="searchSelect" :filter-method="dataFilter" @visible-change="visibleChange" @focus="selectFocus" @blur="selectBlur" @change="selectChange">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value">
    </el-option>
  </el-select>
</template>
 
<script>
  export default {
    data() {
      return {
        options: [{
          value: '选项1',
          label: '黄金糕'
        }, {
          value: '选项2',
          label: '双皮奶'
        }],
        optionsFilter: [{
          value: '选项1',
          label: '黄金糕'
        }, {
          value: '选项2',
          label: '双皮奶'
        }],
        value: ''
      }
    },
    methods: {
        dataFilter(val) {
            this.value = val;
            if (val) {
            this.options = this.optionsFilter.filter((item) => {
                if (item.label.includes(val) || item.label.toUpperCase().includes(val.toUpperCase())) {
                  return true
                }
            })
            } else {
            this.options = this.optionsFilter;
            }
    },
    selectFocus(e){
      let value = e.target.value;
       setTimeout(() => {
          let input = this.$refs.searchSelect.$children[0].$refs.input;
          input.value = value;
      })
    },
    selectBlur(){
      //console.log('失去')
    },
    selectChange(){
 
    },
    visibleChange(val){
      if(!val){
        let input = this.$refs.searchSelect.$children[0].$refs.input;
        input.blur();
      }
 
    }
    }
  }
</script>

原文链接:www.cnblogs.com/dibaosong/p…