ElementUI Select组件 filter-method问题
发布于 3 年前 作者 banyungong 2887 次浏览 来自 问答
粉丝福利 : 关注VUE中文社区公众号,回复视频领取粉丝福利

有一个需求是这样的,Select选城市的时候需要模糊搜索,不仅要支持中文,而且要支持拼音,缩写等等,后端会给我相应的字段,但是我发现使用filter-method传入函数实现的这种办法会让自己写很多多余的代码,直接上例子

<el-select v-model="value8" :filter-method="handleCityFilter" filterable placeholder="请选择">
    <el-option
      v-for="item in filterOptions"
      :key="item.value"
      :label="item.label"
      :value="item.value">
    </el-option>
  </el-select>

handleCityFilter (val) {
   // filter balabalbalb....
}

这种方式还要缓存一次options,每次在过滤函数里把缓存的options过滤然后赋值给filterOptions,感觉会非常麻烦,也不优雅,理想情况下应该是在handleCityFilter这个函数里面把事情都办了

<el-select v-model="value8" filterable placeholder="请选择">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value">
    </el-option>
  </el-select>

官方这个例子只是传入了options没做缓存,但是也可以模糊搜索,于是想去源码里看看怎么实现的

// select.vue
this.broadcast('ElOption', 'queryChange', val);

// option.vue
      queryChange(query) {
        // query 里如果有正则中的特殊字符,需要先将这些字符转义
        let parsedQuery = String(query).replace(/(\^|\(|\)|\[|\]|\$|\*|\+|\.|\?|\\|\{|\}|\|)/g, '\\$1');
        this.visible = new RegExp(parsedQuery, 'i').test(this.currentLabel) || this.created;
        if (!this.visible) {
          this.select.filteredOptionsCount--;
        }
      }

最终锁定在这里,发现是将options组建正则隐藏,那么通过filterMethod必然无法办到这个事情。。。各位大神们对于这种需求有什么更好的解决方案吗

回到顶部