在使用 Element-UI Select 组件时,遇到一个需求是根据汉字或汉字拼音来过滤选项,记录一下解决方案。
这里需要使用 Element-UI Select 组件的 filter-method 和 filterable属性。
另外需要使用 js 拼音库 CnChar ,这个库主要就是做汉字转拼音和汉字笔画数的。使用 npm i cnchar 就可以安装使用啦,详细的使用 CnChar 文档里有介绍。
需求大概是这样的:汉字匹配就不用多说了,拼音匹配有个要求,就是只能从某个汉字的拼音开始匹配,不能截断,比如说:双皮奶 不能被 huangpinai 匹配,但是可以被 pinai 匹配。
实现思路就是在 filter-method 中使用数组的filter方法对源数据进行过滤就可以,过滤方法使用 CnChar 提供的 .spell方法可以获取拼音数组。
其实也比较简单,我就直接上代码啦,注释写的比较完整,就不过多解释啦,有不理解的地方可以留言哈:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| <template> <div> <el-select v-model="value" :filter-method="filter" filterable placeholder="请选择"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" ></el-option> </el-select> </div> </template> <script> import cnchar from "cnchar"; export default { data() { return { copy: [], options: [ { value: "选项1", label: "黄金糕" }, { value: "选项2", label: "双皮奶" }, { value: "选项3", label: "先生" }, { value: "选项4", label: "西安城" }, { value: "选项5", label: "松下电器" }, { value: "选项6", label: "学习成果" } ], value: "" }; }, mounted() { this.copy = Object.assign(this.options); }, methods: { filter(v) { this.options = this.copy.filter((item) => { if (item.label.indexOf(v) !== -1) return true;
let arr = item.label.spell('low', 'array'); let spell = arr.join(''); let lengths = [0]; for (var i = 0; i < arr.length - 1; i++) { lengths.push(lengths[i] + arr[i].length); }; return lengths.indexOf(spell.indexOf(v)) !== -1; }) } } }; </script>
|