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