ElementUI Select组件 filter-method问题
粉丝福利 : 关注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必然无法办到这个事情。。。各位大神们对于这种需求有什么更好的解决方案吗