vue全国省市选择vue组件

没用懂checkbox,干脆自己定义布尔值,方便数据页面响应。

可以再原始省市数据 下载address.js文件

1.初始化数据格式:

 2页面样式:

 3.对应输出的数据格式:

 4.源码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>省市任意选组件vue</title>
<style>
/* 数据多的时候v-cloak的妙用,一定要将样式加载在高级 */
[v-cloak]{
    display: none!important; 
}
</style>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>
<body>
    <div id="app" v-cloak>
        <div class="tableArea">
            <div class="pro" v-for='(item,index) in areasList' :key='index' 
            @mouseover="mouseover(index,item)"
            @mouseleave="mouseleave(index,item)">
                <label class="provinces"  @click='clicks(item)'>
                    <span :class='{selected:item.IsCheckeds}'></span>{{item.province}}({{item.citys.length}})
                </label>
                <div class="citys" v-show='item.show'>
                    <p>{{item.province}}</p>
                    <label class="city" v-for='(i,s) in item.citys' :key='s' @click='click(item,s)'>
                        <span :class='{selected:i.IsChecked}'></span>{{i.city}}
                    </label>
                </div>
            </div>
            <div class="clear"></div>
        </div>
    </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="./address.js"></script>
<script>
new Vue({
    el: '#app',
    data(){
        return{
            show:false,
            areasList:{},
            data:[]
        }
    },
    created:function(){
        let areasList = []
        for(item in areas){
            let citys = []
            let objs = {
                province:item,
                citys:item.indexOf("") != -1?'':citys,
                show:false,
                IsCheckeds:false
            }
            for(i in areas[item]){
                let obj = {
                    city:areas[item][i],
                    IsChecked:false
                }
                citys.push(obj)
            }
            areasList.push(objs)
        }
        this.areasList = areasList
        console.log(areasList)               //处理省市数据类型
    },
    methods:{
        // 当前默认直辖市无下级选择,无弹窗
        mouseover(index,item){
            if(item.citys.length>0){
                item.show = true
            }
        },
        mouseleave(index,item){
            if(item.citys.length>0){
                item.show = false
            }
        },
        // 点击省级按钮时,对应所以子市级状态响应
        clicks(item){
            item.IsCheckeds = !item.IsCheckeds
            if(item.citys){
                item.citys.forEach(element => {
                    element.IsChecked = item.IsCheckeds
                });
            }
            this.Statistics()
        },
        //点击市级按钮时,改变数量时,对应的省的状态与其响应
        click(item,s){
            let citys = item.citys[s]
            citys.IsChecked = !citys.IsChecked
            let arr_filter = item.citys.filter(function(element,index,self){
                return element.IsChecked==true;           // 返回市级已选的数组
            })
            if(arr_filter.length==0){
                item.IsCheckeds = false
            }else{
                item.IsCheckeds = true
            }
            this.Statistics()
        },
        // 每次状态的额改变触发方法统计当前已选状态
        Statistics(){
            let areasList = this.areasList 
            let arrData = []
            areasList.forEach(element => {
                if(element.IsCheckeds){
                    if(element.citys){
                        let citys = element.citys
                        citys.forEach( e => {
                            if(e.IsChecked){
                                let obj = {                                //每一条市级数据都作为一个单独的对象
                                    province:element.province,   
                                    city:e.city,
                                }
                                arrData.push(obj)
                            }
                        });
                    }else{
                        let obj = {                                //直辖市级数据也作为一个单独的对象
                            province:element.province,   
                            city:element.province,
                        }
                        arrData.push(obj)
                    }
                }
            });
            console.log(arrData)      //当前已选
        }
    }
})
</script>
</html>
<style>
.clear{
    clear:both
}
.tableArea{
    width: 800px;
    font-size: 15px;
    color: #606266;
}
.tableArea .pro, .tableArea .city{
    float: left;
    margin: 6px 16px;
}
label{
    line-height: 32px;
}
label span{
    width: 10px;
    height: 10px;
    background: #ececec;
    display: inline-block;
    border-radius: 3px;
    border:1px solid #c1bfbf
}
.selected{
    background: #409EFF;
}
.tableArea .pro{
    position: relative;
}
.citys{
    overflow: hidden;
    border: 1px solid #ececec;
    position: absolute;
    left: 0;
    width: 600px;
    z-index: 1;
    border-radius: 4px;
    color: #606266;
    background: #ffffff;
    border: 1px solid #EBEEF5;
    box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
}
.citys p{
    text-indent: 15px;
    color: black;
}
</style>
原文地址:https://www.cnblogs.com/wd163/p/13524861.html