vue实现省市县三级联动,超简单

vue实现省市县三级联动,超简单

最近在朋友的项目中碰到用vue实现省市县三级联动的需求,按照我以往的套路来说,基本都是找ui框架里的联级选择器一把梭哈,但是朋友说需要自己实现。好吧,既然朋友都说了要自己实现,那就安排吧!!

一、vue实现省市县三级联动(不用插件版)

必备条件:
1.全国省市县数据(json格式)
2.vue基础

实现步骤:

html部分

<div id="app">
    <select  v-model="sheng" >
        <option disabled value="">请选择省份</option>
        <option  v-for="shengs of base_citys" :key="shengs.code" :value="shengs.name" :label="shengs.name"></option>
    </select>
    <select  v-model="shi" v-if="this.shi_citys.length > 1">
        <option disabled value="">请选择市</option>
        <option v-for="shi of shi_citys" :key="shi.code" :value="shi.name" :label="shi.name"></option>
    </select>
    <select  v-model="xian_qu" >
        <option disabled value="">请选择县/区</option>
        <option v-for="qu of qu_citys" :key="qu.code" :value="qu.name" :label="qu.name"></option>
    </select>
    <div>
        <label>你当前选择的地址:</label>{{fullAddress}}
    </div>
</div>

js部分

var vm = new Vue({
            el:"#app",
            data:{
                sheng:"",
                shi:"",
                xian_qu:"",
                base_citys:[],
                shi_citys:[],
                qu_citys:[]
            },
            mounted(){
                this.handleGetCitys()
            },
            watch:{
                sheng:function(){
                    this.handleSheng()
                    this.handleShi()
                },
                shi:function(){
                    this.handleShi()
                }
            },
            computed:{
                fullAddress:function(){
                    if(this.sheng === this.shi){
                        return this.sheng + "-" + this.xian_qu;
                    }else{
                        return this.sheng + "-" + this.shi + "-" + this.xian_qu
                    }
                }
            },
            methods:{
                async handleGetCitys(){
                    const {data,status} = await axios.get('./citys.json');
                    if(status !== 200) return;
                    this.base_citys = data;
                },
                handleSheng(){
                    this.shi_citys = [];
                    this.qu_citys = [];
                    if(this.base_citys.length >0){
                        this.base_citys.forEach(item => {
                            if(this.sheng === item.name){
                                this.shi_citys = Object.assign([],item.cityList);
                                this.shi = this.shi_citys[0].name;
                            }
                        });
                    }
                },
                handleShi(){
                    if(this.shi_citys.length > 0){
                        this.shi_citys.forEach(item => {
                            if(this.shi === item.name){
                                this.qu_citys = Object.assign([],item.areaList)
                                this.xian_qu = this.qu_citys[0].name;
                            }
                        })
                    } 
                }
            }
        })

最终结果
实现效果

二、vue实现省市县三级联动(插件版)

前提条件

安装v-distpicker
创建工程化的vue项目

实现步骤

1.假设项目搭建好了,安装v-distpicker

npm install v-distpicker --save

2.项目中引入v-distpicker
2.1全局引入

#在main.js中引入
import VDistpicker from 'v-distpicker'
Vue.component('v-distpicker', VDistpicker)

2.2指定文件中引入

import VDistpicker from 'v-distpicker'
export default {
  components: { VDistpicker }
}

3.template部分的代码

<div class="wrap">
   <v-distpicker @selected="onSelected"></v-distpicker>
   <div>
        你当前选的的地址:{{fullAddress}}
   </div> 
</div>

4.js部分的代码

import VDistpicker from 'v-distpicker'
export default {
    data(){
        return{
            selected:{
                province: "",
                city: "",
                area: ""
            }
        }
    },
    computed:{
        fullAddress:function(){
            return this.selected.province +"-"+ this.selected.city +"-"+ this.selected.area
        }
    },
    methods:{
        onSelected(data){
            const {province,city,area} = data;
            if(!province.code && !city.code && !city.code) return;
            this.selected.province = province.value;
            this.selected.city = city.value;
            this.selected.area = area.value;
        }
    },
    components:{
        VDistpicker
    }
}

5.运行结果
在这里插入图片描述

三、结尾

将文章中的代码复制到对应的位置即可运行实现结果

整个实现过程比较简单,写的过程中并没有写注释,若有不懂的可以评论交流

  • 22
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
好的,我可以为您介绍一下如何使用 Vue 实现省市三级联动。 首先,我们需要在 Vue 中定义三个变量,分别表示省、市、的列表。可以使用数组来存储这些数据。 接下来,我们需要在 Vue 的模板中定义三个下拉框,分别用来显示省、市、的列表。每当用户选择一个省份时,我们需要根据这个省份来动态更新市的列表。当用户选择一个城市时,我们需要根据这个城市来动态更新的列表。 为了实现这个功能,我们可以使用 Vue 的计算属性来实现动态更新。具体来说,我们可以定义一个计算属性来返回当前选中的省份,另一个计算属性来返回当前选中的城市,最后一个计算属性来返回当前选中的。这些计算属性可以根据用户选择的省份、城市来动态计算出来。 最后,我们需要在 Vue 的方法中定义一个函数,每当用户选择一个省份或者城市时,就会调用这个函数来更新列表。 下面是一个简单的示例代码,用来实现省市三级联动: ```html <template> <div> <select v-model="selectedProvince" @change="updateCities"> <option v-for="province in provinces" :value="province">{{ province }}</option> </select> <select v-model="selectedCity" @change="updateCounties"> <option v-for="city in cities" :value="city">{{ city }}</option> </select> <select v-model="selectedCounty"> <option v-for="county in counties" :value="county">{{ county }}</option> </select> </div> </template> <script> export default { data() { return { provinces: ["北京", "上海", "广东"], cities: [], counties: [], selectedProvince: "", selectedCity: "", selectedCounty: "", }; }, computed: { filteredCities() { return this.cities.filter((city) => city.province === this.selectedProvince); }, filteredCounties() { return this.counties.filter((county) => county.city === this.selectedCity); }, }, methods: { updateCities() { // 根据省份更新城市列表 this.cities = [{ name: "北京市", province: "北京" }, { name: "上海市", province: "上海" }, { name: "广州市", province: "广东" }]; this.selectedCity = ""; this.counties = []; }, updateCounties() { // 根据城市更新区列表 this.counties = [{ name: "海淀区", city: "北京市" }, { name: "闵行区", city: "上海市" }, { name: "天河区", city: "广州市" }]; this.selectedCounty = ""; }, }, }; </script> ``` 以上是一个简单实现省市三级联动Vue 示例代码,您可以根据自己的需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值