使⽤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="de" @change="getCitys">
<option value="">选择省份</option>
<option v-for="(item, index) in provinceList"
:value="index"
:key="index">
{{ item }}
</option>
</select>
js获取json的key和value
<select name="city" class="form-control" v-show="showcitys" v-model="de" @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="de" @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 >{{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 = Districts();
},
methods: {
getDefault() {
if (this.defaultProvince !== '') {
this.showcitys = true;
let provinceCode = AreaCode(this.defaultProvince);
this.cityList = Districts(provinceCode);
this.province = {
code: provinceCode,
value: this.defaultProvince
}
}
if (this.defaultCity !== '') {
this.showareas = true;
let cityCode = AreaCode(this.defaultCity);
this.areaList = Districts(cityCode);
this.city = {
code: cityCode,
value: this.defaultCity
}
}
if (this.defaultArea !== '') {
let areaCode = AreaCode(this.defaultArea);
this.area = {
code: areaCode,
value: this.defaultArea
}
}
},
getSelectVal() {
this.selected = this.province.value + this.city.value + this.area.value;
console.log(de + '-'+ de + '-' + de);
},
//名称转代码
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 = de;
return DISTRICTS[provinceCode][code];
} else { //
let cityCode = de;
return DISTRICTS[cityCode][code];
}
},
getDistricts(code = DEFAULT_CODE) {
return DISTRICTS[code] || []
},
cleanList(name) {
this[name] = []
},
getCitys(e) {
this.cityList = Districts(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 = Districts(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: CodeValue(code, level),
}
},
}
}
运⾏
我们需要实现的效果是:默认显⽰省级下拉选择框,下拉选项中应该默认载⼊省级名称,然后当选择省级下拉框中的省份列表(省级)选项时,显⽰选中省份的城市列表(市级),然后选择市级城市选项,显⽰选择城市的区县列表(县级)。在选择完每个选项时,我们应该即时记录选项对应的编号和名称。如果在 data() 部分设置了省市区县的默认值,则三个下拉框都要显⽰。
效果是实现了,但是如果要在⼀个页⾯调⽤多个三级联动效果则就⽐较尴尬了,下节我给⼤家讲述如何把这个三级联动效果封装成vue组件,造好轮⼦,⽅便在更多地⽅调⽤,敬请关注。
总结
以上所述是⼩编给⼤家介绍的使⽤vue2实现带地区编号和名称的省市县三级联动效果,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论