フロントエンド-「要素のグループ化+検索+あいまい一致の複数選択ドロップダウンボックス(vue)

最初のレンダリング:

この機能は実際には実装が難しくありません。主に注意が必要な詳細がいくつかあります。

1.vueでのjsモジュールのエクスポート

2.linqの使用

3.一次および二次グループ化のビジネスロジック処理

主な実装手順は次のとおりです。

1つ:linqを準備する

1.linqをインストールします。

npm install linq

2.main.jsでの参照

import linq from 'linq';
Vue.prototype.Enumerable=linq;

3.linqの理解。個人的には、Java8のストリーム操作に似ていると思います。

要約をお勧めしますhttps//blog.csdn.net/jsjpanxiaoyu/article/details/76560182

2:テンプレートページ

<el-form-item v-if="editDailogFormType=='region'" label="需求省份" prop="channelName">
                    <el-select v-model="regionConfigForm.citys" placeholder="请选择区域"
                               multiple
                               filterable
                               remote
                               reserve-keyword
                               :remote-method="(queryString)=>{remoteMethod(queryString);}"
                               style="width: 100%;">
                        <el-option-group
                                v-for="group in multipleSelectOption"
                                :key="group.province"
                                :label="group.province"
                                @click.native="checkProvince(group.province)">
                            <el-option
                                    v-for="item in group.city"
                                    :key="item.value"
                                    :label="item.city_name"
                                    :value="item.city_name">
                            </el-option>
                        </el-option-group>
                    </el-select>
</el-form-item>

 

 el-selectドロップダウンボックスのこれらの属性を過剰に説明する

multipe:複数選択を開く

フィルタリング可能:検索を開く

リモート:リモート検索を開く

予約語:キーワード

:リモート方式:リモート検索トリガーの方式。

 

el-selectの下のel-option-groupはグループ名(州など)であり、el-optionはグループの下の特定のオプション(都市など)です。

@ click.nativeは、グループ名がクリックされたときにトリガーされるメソッドです。

三:

1.jsonデータの準備。私のjson形式は[{province:xxx、city:[{city_name:xxx}]}]です。以下はリンクです。必要に応じてダウンロードできます。

https://download.csdn.net/download/nienianzhi1744/12084829

都道府県は静的リソースなので、jsonファイルを作成できます。動的リソースの場合は、バックグラウンドインターフェイスをリクエストしてバックグラウンドからデータを取得できます。

2.拼音関連のjs。

一般的に使用されるjsメソッドを以下に示します。注意してください。以下のコードのpinyinグローバル変数は1つのpinyinのみを定義していることに気付くかもしれません。この拼音変数はjson形式の文字列であり、長すぎてスペースを取りすぎて読み取りに影響します。ダウンロードに入れて、必要に応じてダウンロードできます。

https://download.csdn.net/download/nienianzhi1744/12084844

漢字の拼音への変換、最初の呪文の抽出、漢字の比較と包含の方法、ピン全体、および最初のピンが含まれています。

特定の操作:pinYinForVueという名前のjsファイルを作成します。次のコンテンツをコピーします

export const pinyin = {
    'a': '\u554a\u963f\u9515',
}
export default {

    arraySearch: function (l1, l2) {
        for (let name in pinyin) {
            if (pinyin[name].indexOf(l1) !== -1) {
                return this.ucfirst(name)
            }
        }
        return false
    },
    ucfirst: function (l1) {
        if (l1.length > 0) {
            let first = l1.substr(0, 1).toUpperCase();
            let spare = l1.substr(1, l1.length);
            return first + spare
        }
    },
    /*获取首字母*/
    getInitials: function (text) {
        let pinyin="";
        for (let i = 0; i < text.length; i++) {
            pinyin=pinyin+this.convertToPinYin(text[i])[0];
        }
        return pinyin; //若取拼音,则返回 pinyin
    },

    /*判断text中是否包含key,通过汉字、拼音、首拼判断*/
    wordInclude:function (text,key) {
        if(this.convertToPinYin(text).toLowerCase().indexOf(key) != -1||//全拼是否包含
            this.convertToPinYin(text).indexOf(key) != -1 ||//全拼转小写是否包含
            this.getInitials(text).toLowerCase().indexOf(key) != -1||//首拼是否包含
            this.getInitials(text).indexOf(key) != -1 ||//首拼转小写是否包含
            text.indexOf(key) != -1 //汉字是否包含
        ){
           return true;
        }else{
            return false;
        }
    },
    /*这个转拼音的方法可以单独拿出去用(更灵活),也可以在下方的wordInclude中被调用*/
    convertToPinYin: function (l1) {
        let l2 = l1.length;
        let I1 = '';
        let reg = new RegExp('[a-zA-Z0-9]');
        for (let i = 0; i < l2; i++) {
            let val = l1.substr(i, 1);
            let name = this.arraySearch(val, pinyin);
            if (reg.test(val)) {
                I1 += val
            } else if (name !== false) {
                I1 += name
            }
        }
        I1 = I1.replace(/ /g, '-');
        while (I1.indexOf('--') > 0) {
            I1 = I1.replace('--', '-')
        }
        return I1
    },
} 

3.電話する

这个注释是我写的最详细的一次
import pinyin  from '../../utils/pinYinForVue'
import cityjson from '../../assets/city'

export default {
   data(){
        return {
            regionConfigForm:{
                    citys:[]
            }
            multipleSelectOption:cityjson,
        }
   },
   methods: {
        remoteMethod(queryString) {
                /*json中的一级分组是省份,二级分组是城市*/
                this.multipleSelectOption=cityjson;
                /*去掉重复key,linq中的distinct,where,select 类似Java8的stream流操作*/
                this.multipleSelectOption=this.Enumerable.from(this.multipleSelectOption).distinct("o=>o.province").toArray();
                /*遍历所有省份数据,根据输入框中的值对所有的一级分组过滤,保留符合条件的数据再重新组装成list*/
                let parentSearchList=this.Enumerable.from(this.multipleSelectOption).where((data)=>{
                    let jsonHasQueryString=false;
                    /*如果省份的汉字、全拼、首拼是否包含输入的值*/
                    if(pinyin.wordInclude(data.province,queryString)){
                        jsonHasQueryString=true;
                    }
                    return jsonHasQueryString;
                }).toArray();

                let childSearchList=[];
                /*遍历所有城市数据,根据json数据结构先遍历省份,再遍历省份下城市。*/
                for(let i=0;i<this.multipleSelectOption.length;i++){
                    let parentItem=this.multipleSelectOption[i];
                    for(let j=0;j<parentItem.city.length;j++){
                        let childName=parentItem.city[j].city_name;
                        /*如果城市的汉字、全拼、首拼是否包含输入的值*/
                        if(pinyin.wordInclude(childName,queryString)){
                            childSearchList.push({province:parentItem.province,city:[{city_name:childName}]});
                        }
                    }
                }
                /*合并一级分组和二级分组的值,比如 输入 “hb”,
                会出现一级分组“河北”及下属的多个二级城市,也会出现 单独的二级分组“淮北”以及所属的一级省份“安徽”*/
                let nowmultipleSelectOption =parentSearchList.concat(childSearchList);
                /*去掉key相同的重复数据,key相同虽然不影响使用,但控制台会报红*/
                this.multipleSelectOption = this.Enumerable.from(nowmultipleSelectOption).distinct("o=>o.province").toArray();
            },
            /*一级分组名点击全选*/
            checkProvince(province){
                /*定义一个临时数组*/
                let addProvinceCitys= [];
                /*这个for循环是为了实现点击一级分组全部勾选的功能*/
                for(let i=0;i<cityjson.length;i++){
                    /*遍历所有省份*/
                    let parentItem=cityjson[i];
                    if(parentItem.province==province){
                        /*若省份能跟此次点击的省份匹配,遍历城市*/
                        for(let j=0;j<parentItem.city.length;j++){
                            /*获取已选中元素中是否包含 此次省份下的城市,如果不包含则添加到临时数组中*/
                            let childName=parentItem.city[j].city_name;
                            let index=this.regionConfigForm.citys.indexOf(childName);
                            if(index==-1){
                                addProvinceCitys.push(childName);
                            }
                        }
                    }
                }
                /*其实还想做一个反选功能的,但思路暂时还没捋顺,以后再补充*/
                /*将临时数组中合并到下拉框的已选择数组中,即可完成赋值选中*/
                this.regionConfigForm.citys = this.regionConfigForm.citys.concat(addProvinceCitys);
            },
   }
}

以上。

明けましておめでとうございます

おすすめ

転載: blog.csdn.net/nienianzhi1744/article/details/103860554