el-select と el-tree を組み合わせて州と都市を設定し、各州の選択数を表示します

スタイルは次のとおりです。

htmlスタイル

 <el-form-item label="覆盖区域" :label-width="formLabelWidth" prop="coverageArea" class="classCover">
                    <div style="width: 100%;border: solid 1px #DCDFE6;position: relative;height:40px;cursor: pointer;overflow-y: auto" @click='handleControll' v-if="provinceName.length<=0"></div>
                    <div style="top:-6px;width: 100%;border: solid 1px #DCDFE6;cursor: pointer;overflow-y: auto" id="provinceNameDiv" v-else>
                        <el-button  v-for="item in provinceName" plain type="primary" style="margin-left: 6px" size="mini">{
   
   {item.name}}+{
   
   {item.num}}</el-button>
                    </div>
<!--                </div>-->
                <el-popover placement="bottom-start"
                        width="600"
                        v-model="visible" popper-class="max-h-300px overflow-auto">
                    <el-input placeholder="输入关键字搜索" v-model="filterText" @click.stop.native class="sel" style="width: 70%" clearable id="inputId"></el-input>
                    <el-checkbox v-model="checked">全国</el-checkbox>
                    <el-tree :data="CoverageAreaArry" :props="defaultProps" ref="tree" show-checkbox  :expand-on-click-node="false" :filter-node-method="filterNode" node-key="id" check-on-click-node @check-change="handleNodeClick" ></el-tree>
                    <template #reference>
                        <el-button style="width: 100%;position: absolute;top: 0;height:50px;opacity: 0" id="provinceNameDiv2"></el-button>
                    </template>
                </el-popover>

            </el-form-item>

 CSSスタイル

  <style>
 .option-style{
        padding:0;
        width: 100%;
        height: 100%;
        background-color: #FFFFFF;
    }
    /deep/.sel .el-input__inner{
        width: 70%;
        margin-left: 5%;
    }
    .el-select-dropdown .el-popper{
        width: 70% !important;
        transform-origin: center top;
        z-index: 2003 ;
        position: absolute;
        top: 249px !important;
        left: 150px !important;
    }
    .el-tree{
        display: block;
    }
    .el-tree-node__children{
        position: relative;
        top:30px;
        left: -60px;
       margin-bottom: 30px;
    }
    .setstyle {
        min-height: 200px;
        padding: 0 !important;
        margin: 0;
        overflow: auto;
        cursor: default !important;
    }
    .select_inpt .el-input input{
        opacity: 0;
    }
    #inputId{
        opacity: 1 !important;
    }
    .el-popover .el-popper{
        width: 100%;
    }
    .el-tree > div {
        display: flex;
         width: 100%;
    }
    .classCover .el-form-item__content{
        height: auto !important;
    }
</style>
<style scoped>
    .max-h-300px {
        max-height: 300px;
    }
    .overflow-auto {
        overflow: auto;
    }
    .option-style{
        padding:0;
        width: 100%;
        height: 100%;
        background-color: #FFFFFF;
    }
    /deep/.sel .el-input__inner{
        width: 70%;
        margin-left: 5%;
    }
</style>

アダプティブレイアウトの設定が必要です 選択した都道府県が複数行表示される場合は、

 window.resize=function (){
            $("#provinceNameDiv").parent().css("height", $("#provinceNameDiv").css("height"))
            $("#provinceNameDiv2").css("height", $("#provinceNameDiv").css("height"))
        }

見る, 聞く

  watch: {
        filterText(val) {
            this.$refs.tree.filter(val);
        },
        checked: {//侦听全国是否被勾选,也需要设置自定义布局,因为要显示所有省份,需要两三行
            handler(newValue,oldValue){
                // console.log(newValue,oldValue)
                if(newValue==true){
                    this.$refs.tree.setCheckedNodes(this.CoverageAreaArry)
                }else{
                    this.$refs.tree.setCheckedNodes([])

                }
                $("#provinceNameDiv").parent().css("height", $("#provinceNameDiv").css("height"))
                this.$nextTick().then (() => {
                    $("#provinceNameDiv2").css("height", $("#provinceNameDiv").css("height") ? $("#provinceNameDiv").css("height") : "40px")
                })

            },
            deep: true,
        },
        provinceName:{//如果不选全国,选较多省份也需要
            handler(newValue,oldValue){
                // console.log(newValue,oldValue)
                $("#provinceNameDiv").parent().css("height", $("#provinceNameDiv").css("height"))
                this.$nextTick().then (() => {
                    $("#provinceNameDiv2").css("height", $("#provinceNameDiv").css("height") ? $("#provinceNameDiv").css("height") : "40px")
                })
            },
            deep: true,
        }
    },

州および地方自治体のデータの取得

       /*
        * 覆盖区域选择
        * */
        handleCoverageArea(){
            request2('/base/mediationCenterMaintain/queryProvinceAndCity', {}, this.callbackInitDataCoverageArea, 'GET')
        },
        callbackInitDataCoverageArea(_data){
            this.CoverageAreaArry=_data.map(v=>{
                v.label=v.bizProvinceDO.codeValueMean
                v.id=v.bizProvinceDO.codeValue
                v.children=v.bizCityDOS
                v.children.map(i=>{
                    i.label=i.codeValueMean
                    i.id=i.codeValue
                })
                return v
            })
            // console.log(this.CoverageAreaArry)
        },

フィルタリング、つまり検索関数は、filter-node-method を設定する必要があります。値はフィルタリング関数であり、watch によってリッスンされる入力ボックスの値と組み合わせて使用​​されます。

/*
        * 过滤
        * */
        filterNode(value, data,node) {
            // console.log(value, data)
            if (!value) return true;
            // 如果传入的value和data中的label相同说明是匹配到了
            if (data.label.indexOf(value) !== -1) {
                return true;
            }
            // 否则要去判断它是不是选中节点的子节点
            return this.checkBelongToChooseNode(value, data, node);
        },
        // 判断传入的节点是不是选中节点的子节点
        checkBelongToChooseNode(value, data, node) {
            console.log(node)
            const level = node.level;
            // 如果传入的节点本身就是一级节点就不用校验了
            if (level === 1) {
                return false;
            }
            // 先取当前节点的父节点
            let parentData = node.parent;
            // 遍历当前节点的父节点
            let index = 0;
            while (index < level - 1) {
                // 如果匹配到直接返回
                if (parentData.data.label.indexOf(value) !== -1) {
                    return true;
                }
                // 否则的话再往上一层做匹配
                parentData = parentData.parent;
                index ++;
            }
            // 没匹配到返回false
            return false;
        },

ツリー選択のロジックについてはelemenyuiのツリーイベントを参照してください。

    handlerCheck(_dataList) {
            let _this = this
            _this.provinceName = []
            // _dataList.forEach(item => {
            _this.CoverageAreaArry.forEach(area =>{
                // if (item.label == area.label) {
                let _num = 0
                let _children=[]
                let checkedId=[]
                if (area.children && area.children.length > 0) {
                    area.children.forEach(areaChild => {
                        _dataList.forEach(item => {
                            if (areaChild.label == item.label) {
                                _num++
                                _children.push(item.label)
                            }
                        })
                    })
                }else {//香港 澳门 台湾
                    _dataList.forEach(item => {
                        if (area.label == item.label) {
                            _num++
                        }
                    })
                }
                if (_num > 0) {
                    //省
                    _this.provinceName.push({
                        name:area.label,
                        num: _num,
                        children: _children,
                    })
                    // console.log(_this.provinceName)
                }
                // }
            })
            // })
            $("#provinceNameDiv").parent().css("height", $("#provinceNameDiv").css("height"))
            $("#provinceNameDiv2").css("height", $("#provinceNameDiv").css("height"))
        },
        handleNodeClick(data,self,child) {
            // console.log(this.$refs.tree.getCheckedNodes())
            let datalist = this.$refs.tree.getCheckedNodes()
            this.selectTree = [] //置空
            this.value = []
            datalist.forEach((item)=>{
                this.selectTree.push({id:item.id,label:item.label})
                this.value.push(item.label)
            })
            this.handlerCheck(datalist)
        },

おすすめ

転載: blog.csdn.net/yingw1/article/details/129702193