使用vue2實現(xiàn)帶地區(qū)編號和名稱的省市縣三級聯(lián)動效果
我們知道省市區(qū)縣都有名稱和對應的數(shù)字唯一編號,使用編號可以更方便查詢以及程序處理,我們今天來了解一下使用vue2來實現(xiàn)常見的省市區(qū)下拉聯(lián)動選擇效果。
準備數(shù)據(jù)源
我們的省市區(qū)縣的數(shù)據(jù)源來自本站文章 《基于Vue2的簡易的省市區(qū)縣三級聯(lián)動組件》 中的districts.js,感謝 v-distpicker 作者。districts.js中的數(shù)據(jù)格式大概是這樣的:
export default {
100000: {
110000: '北京市',
120000: '天津市',
130000: '河北省',
140000: '山西省',
...
},
130000: {
130100: '石家莊市',
130200: '唐山市',
130300: '秦皇島市',
130400: '邯鄲市',
...
},
130100: {
130102: '長安區(qū)',
130104: '橋西區(qū)',
130105: '新華區(qū)',
130107: '井陘礦區(qū)',
...
},
...
}
很顯然,districts.js導出的是一個key:value形式的json數(shù)據(jù)串,那么在js中我們就可以很方便的處理json數(shù)據(jù)串中的關系。
構(gòu)建項目
我們使用vue-cli構(gòu)建項目,需要安裝node和vue環(huán)境。然后命令行運行: vue init webpack distpicker 構(gòu)建好項目工程。具體如何操作的請參照vue官網(wǎng),這些基礎的本文不細講。
現(xiàn)在我們直接編輯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="">選擇區(qū)縣</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 當下拉選擇選項后觸發(fā)的事件。然后每個 select 下的 option 是讀取districts.js對應的數(shù)據(jù)。
JS代碼
我們現(xiàn)在來看JS部分,首先使用import導入省市區(qū)縣數(shù)據(jù),注意我們把districts.js文件放在項目的src目錄下,然后定義默認編號100000,因為我們第一個(省級)選擇框默認要下拉顯示所有的省/自治區(qū)/直轄市。然后在 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: '岳麓區(qū)',
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);
},
//名稱轉(zhuǎn)代碼
nameToCode(name) {
for(let x in DISTRICTS) {
for(let y in DISTRICTS[x]) {
if(name === DISTRICTS[x][y]) {
return y
}
}
}
},
//獲取區(qū)域代碼
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),
}
},
}
}
運行
我們需要實現(xiàn)的效果是:默認顯示省級下拉選擇框,下拉選項中應該默認載入省級名稱,然后當選擇省級下拉框中的省份列表(省級)選項時,顯示選中省份的城市列表(市級),然后選擇市級城市選項,顯示選擇城市的區(qū)縣列表(縣級)。在選擇完每個選項時,我們應該即時記錄選項對應的編號和名稱。如果在 data() 部分設置了省市區(qū)縣的默認值,則三個下拉框都要顯示。
運行 npm run dev ,在瀏覽器中輸入http://localhost:8080查看效果。
效果是實現(xiàn)了,但是如果要在一個頁面調(diào)用多個三級聯(lián)動效果則就比較尷尬了,下節(jié)我給大家講述如何把這個三級聯(lián)動效果封裝成vue組件,造好輪子,方便在更多地方調(diào)用,敬請關注。
總結(jié)
以上所述是小編給大家介紹的使用vue2實現(xiàn)帶地區(qū)編號和名稱的省市縣三級聯(lián)動效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
Vue+ElementUI?封裝簡易PaginationSelect組件的詳細步驟
這篇文章主要介紹了Vue+ElementUI?封裝簡易PaginationSelect組件,這里簡單介紹封裝的一個Pagination-Select組件幾個步驟,結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-08-08
vue 實現(xiàn)LED數(shù)字時鐘效果(開箱即用)
這篇文章主要介紹了vue 實現(xiàn)LED數(shù)字時鐘效果(開箱即用),每一個數(shù)字由七個元素構(gòu)成,即每一個segment元素,本文給大家分享實現(xiàn)實例,感興趣的朋友一起看看吧2019-12-12
npm?ERR!?code?E404在vscode安裝插件時報錯的兩種解決方案
這篇文章主要給大家介紹了關于npm?ERR!?code?E404在vscode安裝插件時報錯的兩種解決方案,關于這個問題,通常是由于插件名稱輸入錯誤、網(wǎng)絡問題或插件已被刪除引起的,文中將兩種解決方法都介紹的非常詳細,需要的朋友可以參考下2023-04-04
詳解vue中的動態(tài)組件component和keep-alive
這篇文章主要介紹了詳解vue中的動態(tài)組件component和keep-alive的相關資料,這大家需要注意include屬性和exclude屬性只能用一個,不能同時使用,本文給大家介紹的非常詳細,需要的朋友參考下吧2023-11-11
Vue項目el-upload?上傳文件及回顯照片和下載文件功能實現(xiàn)
本次需求是上傳多種固定格式的文件,且回顯的時候,圖片可以正常顯示,文件可以進行下載,主要采用element的el-upload組件實現(xiàn),對Vue項目el-upload?上傳文件及回顯照片和下載文件功能實現(xiàn)感興趣的朋友跟隨小編一起看看吧2023-12-12
詳解vue中使用vue-quill-editor富文本小結(jié)(圖片上傳)
這篇文章主要介紹了詳解vue中使用vue-quill-editor富文本小結(jié)(圖片上傳),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04

