使用vue2实现带地区编号和名称的省市县三级联动效果
我们知道省市区县都有名称和对应的数字唯一编号,使用编号可以更方便查询以及程序处理,我们今天来了解一下使用vue2来实现常见的省市区下拉联动选择效果。
准备数据源
我们的省市区县的数据源来自本站文章 《基于vue2的简易的省市区县三级联动组件》 中的districts.js,感谢 作者。districts.js中的数据格式大概是这样的:
export default { 100000: { 110000: '北京市', 120000: '天津市', 130000: '河北省', 140000: '山西省', ... }, 130000: { 130100: '石家庄市', 130200: '唐山市', 130300: '秦皇岛市', 130400: '邯郸市', ... }, 130100: { 130102: '长安区', 130104: '桥西区', 130105: '新华区', 130107: '井陉矿区', ... }, ... }
很显然,districts.js导出的是一个key:value形式的json数据串,那么在js中我们就可以很方便的处理json数据串中的关系。
构建项目
我们使用vue-cli构建项目,需要安装node和vue环境。然后命令行运行: vue init webpack distpicker 构建好项目工程。具体如何操作的请参照vue官网,这些基础的本文不细讲。
现在我们直接编辑app.vue文件。
<template> <div id="app" class="container"> <div class="demo form-inline"> <select name="province" class="form-control" v-model="province.code" @change="getcitys"> <option value="">选择省份</option> <option v-for="(item, index) in provincelist" :value="index" :key="index"> {{ item }} </option> </select> <select name="city" class="form-control" v-show="showcitys" v-model="city.code" @change="getareas"> <option value="">选择城市</option> <option v-for="(item, index) in citylist" :value="index" :key="index"> {{ item }} </option> </select> <select name="area" class="form-control" v-show="showareas" v-model="area.code" @change="getdistvalue"> <option value="">选择区县</option> <option v-for="(item, index) in arealist" :value="index" :key="index"> {{ item }} </option> </select> <button class="btn btn-info" @click="getselectval">获取选中值</button> <div style="margin-top:20px;color:red">{{selected}}</div> </div> </div> </template>
这是一个简单三个下拉选择器模板,使用 v-model 可以设置默认值, @change 当下拉选择选项后触发的事件。然后每个 select 下的 option 是读取districts.js对应的数据。
js代码
我们现在来看js部分,首先使用import导入省市区县数据,注意我们把districts.js文件放在项目的src目录下,然后定义默认编号100000,因为我们第一个(省级)选择框默认要下拉显示所有的省/自治区/直辖市。然后在 data()部分设置变量。最后把 created()
和 methods
部分的代码加上,完整的代码如下:
import districts from './districts'; const default_code = 100000; export default { name: 'app', data() { return { showcitys: false, showareas: false, selected: '', defaultprovince: '湖南省', defaultcity: '长沙市', defaultarea: '岳麓区', province: {}, city: {}, area: {}, provincelist: [], citylist: [], arealist: [] } }, created() { this.provincelist = this.getdistricts(); this.getdefault(); }, methods: { getdefault() { if (this.defaultprovince !== '') { this.showcitys = true; let provincecode = this.getareacode(this.defaultprovince); this.citylist = this.getdistricts(provincecode); this.province = { code: provincecode, value: this.defaultprovince } } if (this.defaultcity !== '') { this.showareas = true; let citycode = this.getareacode(this.defaultcity); this.arealist = this.getdistricts(citycode); this.city = { code: citycode, value: this.defaultcity } } if (this.defaultarea !== '') { let areacode = this.getareacode(this.defaultarea); this.area = { code: areacode, value: this.defaultarea } } }, getselectval() { this.selected = this.province.value + this.city.value + this.area.value; console.log(this.province.code + '-'+ this.city.code + '-' + this.area.code); }, //名称转代码 nametocode(name) { for(let x in districts) { for(let y in districts[x]) { if(name === districts[x][y]) { return y } } } }, //获取区域代码 getareacode(value) { if(typeof value === 'string') { return this.nametocode(value); } return value; }, getcodevalue(code, level=1) { if (level == 1) { //省级 return districts[default_code][code]; } else if (level == 2) { let provincecode = this.province.code; return districts[provincecode][code]; } else { // let citycode = this.city.code; return districts[citycode][code]; } }, getdistricts(code = default_code) { return districts[code] || [] }, cleanlist(name) { this[name] = [] }, getcitys(e) { this.citylist = this.getdistricts(e.target.value); this.cleanlist('areas') this.province = this.setdata(e.target.value, 1); this.arealist = []; this.showareas = false; this.showcitys = true; }, getareas (e) { this.arealist = this.getdistricts(e.target.value); this.city = this.setdata(e.target.value, 2); this.showareas = true; }, getdistvalue (e) { this.area = this.setdata(e.target.value, 3); }, setdata(code, level = 1) { code = parseint(code); return { code: code, value: this.getcodevalue(code, level), } }, } }
运行
我们需要实现的效果是:默认显示省级下拉选择框,下拉选项中应该默认载入省级名称,然后当选择省级下拉框中的省份列表(省级)选项时,显示选中省份的城市列表(市级),然后选择市级城市选项,显示选择城市的区县列表(县级)。在选择完每个选项时,我们应该即时记录选项对应的编号和名称。如果在 data() 部分设置了省市区县的默认值,则三个下拉框都要显示。
运行 npm run dev ,在浏览器中输入查看效果。
效果是实现了,但是如果要在一个页面调用多个三级联动效果则就比较尴尬了,下节我给大家讲述如何把这个三级联动效果封装成vue组件,造好*,方便在更多地方调用,敬请关注。
总结
以上所述是小编给大家介绍的使用vue2实现带地区编号和名称的省市县三级联动效果,希望对大家有所帮助
下一篇: ps绘制精致的松下数码相机