在不少應用中,每每都涉及到記錄用戶所在省份、城市、區縣或者街道等信息,通常咱們能夠經過聯動的Select或者相似的界面組件進行展現,或者使用Element中的el-cascader界面組件進行展現,而全國的省份、城市、區縣或者街道等信息咱們能夠經過官方的數據進行獲取,能夠直接存放在JS裏面,也能夠存儲在本身的數據庫裏面,最後統一進行聯動展現便可。本篇隨筆介紹幾種組件對省市區縣聯動處理的效果及作法,能夠直接應用在咱們項目中,也能夠作爲一個組件開發的參考學習。html
在github每每有不少咱們須要的開源組件,咱們能夠拿來直接使用,如這個地址是:https://github.com/Plortinus/element-china-area-data ,在Vue+Element的項目中,直接經過npm進行安裝組件便可:前端
npm install element-china-area-data -S
而後在頁面組件中引入對象數據,綁定在el-cascader界面組件便可。vue
import { provinceAndCityData, regionData, rovinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } from 'element-china-area-data';
例如界面代碼以下所示。ios
<div class="three"> <span class="imp">3. 三級聯動(不帶「所有」選項)</span> <el-cascader v-model="selectedOptions2" class="long" size="large" :options="regionData" @change="handleChange" /> </div>
<div class="bind"> <div>綁定值:{{ selectedOptions2 }}</div> <div>區域碼轉漢字:{{ CodeToText[selectedOptions2[0]] }},{{ CodeToText[selectedOptions2[1]] }},{{ CodeToText[selectedOptions2[2]] }}</div> <div>漢字轉區域碼:{{ convertTextToCode(CodeToText[selectedOptions2[0]], CodeToText[selectedOptions2[1]], CodeToText[selectedOptions2[2]]) }}</div> </div>
其中數據selectedOptions2格式以下所示git
selectedOptions2: ['120000', '120100', '120101'],
而選中數據後,得到的數據格式一樣是一個數組集合,以下所示github
幾種界面組件的效果以下所示。數據庫
省市區三級聯動的案例Demo代碼以下。npm
<template> <div id="app"> <el-cascader size="large" :options="options" v-model="selectedOptions" @change="handleChange"> </el-cascader> </div> </template> <script> import { regionDataPlus } from 'element-china-area-data' export default { data () { return { options: regionDataPlus, selectedOptions: [] } }, methods: { handleChange (value) { console.log(value) } } } </script>
除了上面的 element-china-area-data 第三方組件,還有一個v-region的省市區街道的組件也作的不錯,地址是:https://github.com/TerryZ/v-region 。後端
它的主要特色是支持 「省/直轄市」、「市」、「區/縣」、「鄉/鎮/街道」 4級行政區域選擇,能夠選擇Select的方式,或者分組方式展現,功能比較多樣化一些。api
或者
這個v-region已經封裝爲組件進行使用,因此使用上更加簡化一些,以下簡單的界面聲明便可使用。
<h3>常規表單下拉選擇元素模式</h3> <p>Regular form element with select tag</p> <v-region :town="true"></v-region>
街道能夠包含,也能夠省略,若是省略就是省市區縣的三級選擇了。這個組件的幾種用法以下所示。
<span class="imp">基於v-region控件省市區街道選擇組件</span> <div class="vregion"> <h3>常規表單下拉選擇元素模式</h3> <v-region v-model="selectedRegion" :town="true" @values="regionChange" /> <br><br> <h3>多分組切換模式</h3> <v-region v-model="modelGroup" :town="true" type="group" @values="regionChange" /> <br><br><br> <h3>多列豎排模式</h3> <p>Column group</p> <v-region type="column" @values="regionChange" /> <br><br><br> <h3>城市選擇器</h3> <p>City picker</p> <v-region type="city" :city-picker="true" @values="regionChange" /> </div>
這個組件若是是省市區縣街道模式的話,須要設置初始化值就是一個對象的格式,以下所示。
selectedRegion: { province: '350000', city: '350100', area: '350104', town: '350104008' }
例如,我在一個業務表的案例界面中,就涉及到了省市區街道的選擇處理,就是採用了這個v-region的組件進行展現處理的。界面效果以下所示。
若是是新建窗體的時候,咱們能夠指定組件的默認值,以下的數據格式
selectedRegion: { province: '440000', city: '440100', area: '440111', town: '440111010' },
另外,咱們通常須要在數據庫裏面存儲對應的省市區縣的數據,以便查詢或者其餘須要,那麼咱們就須要在選擇數據變化的時候,設置一下對應的屬性字段,以下所示。
// 修改編輯窗體的省市區街道 changeEditRegion(data) { console.log(data) if (data) { this.editForm.province = data.province ? data.province.key : ''; this.editForm.city = data.city ? data.city.key : ''; this.editForm.district = data.area ? data.area.key : ''; this.editForm.street = data.town ? data.town.key : ''; // console.log(this.editForm) } },
而在展現對話框的時候,咱們則能夠組合省市區數據,做爲v-region組件的初始化值,以下代碼使用。
通常狀況上,使用上面的方式就能解決問題了,不過這裏介紹另一種思路,就是基於數據庫數據的方式進行省市區聯動的處理。
之前我在開發系統的時候,引入了省市區的數據,存儲在幾個數據庫表裏面,而後經過接口的方式檢索省市區及處理器聯動過程。
那麼在基於這些數據的基礎上,咱們也能夠這樣處理的。
首先咱們建立省、市、區縣的表,並在後端發佈對應的API接口,如個人ABP後端接口展現。
而後在根據這些接口,構建好對應的API客戶端,再在界面引入使用,經過定義自定義組件的方式來整合使用則更加簡單。
在定義一個自定義組件my-citypicker,組件代碼以下所示。
<!--用來演示聯動的案例--> <template> <div class="flex-container"> <div class="flex-item"> <label>省</label> <el-select v-model="provinceValue" placeholder="請選擇省" @change="chooseProvince"> <el-option v-for="item in provinceData" :key="item.id" :label="item.provinceName" :value="item.id" /> </el-select> </div> <div class="flex-item"> <label>市</label> <el-select v-model="cityValue" placeholder="請選擇市" @change="chooseCity"> <el-option v-for="item in cityData" :key="item.id" :label="item.cityName" :value="item.id" /> </el-select> </div> <div class="flex-item"> <label>區、縣</label> <el-select v-model="areaValue" placeholder="請選擇區、縣" @change="chooseArea"> <el-option v-for="item in areaData" :key="item.id" :label="item.districtName" :value="item.id" /> </el-select> </div> </div> </template> <script> // 導入Axios的HTTP請求處理封裝類 import { Province, City, District } from '@/api/city' export default { data() { return { provinceValue: '', cityValue: '', areaValue: '', provinceData: [], cityData: [], areaData: [] } }, created() { Province.GetAll().then(res => { if (res.result) { this.provinceData = res.result.items // console.log(res.result); } }).catch(e => { this.$message.error('網絡鏈接超時'); }) }, methods: { chooseProvince(value) { this.cityValue = ''; this.areaValue = ''; this.cityData = []; this.areaData = []; var data = { ProvinceID: value }; City.GetAll(data).then(res => { if (res.result) { this.cityData = res.result.items } }).catch(e => { this.$message.error('網絡鏈接超時'); }) }, chooseCity(value) { this.areaValue = ''; var data = { CityID: value }; District.GetAll(data).then(res => { if (res.result) { this.areaData = res.result.items } }).catch(e => { this.$message.error('網絡鏈接超時'); }) }, chooseArea() { } } } </script> <style> .flex-container { display: flex; flex-flow: row wrap; justify-content: space-around; padding: 0; margin: 0; list-style: none; } .flex-item { padding: 5px; height: auto; color: tomato; font-weight: bold; text-align: center; } </style>
同樣能夠實現省市區縣的聯動處理
以上就是幾種VUE+Element 前端應用中,關於省市區縣聯動處理的組件使用的案例分析,但願你們在借鑑使用別人組件的基礎上,也豐富本身的組件處理,畢竟Vue賦予咱們強大的組件定製能力。
爲了方便讀者理解,我列出一下前面幾篇隨筆的鏈接,供參考:
按部就班VUE+Element 前端應用開發(1)--- 開發環境的準備工做
按部就班VUE+Element 前端應用開發(2)--- Vuex中的API、Store和View的使用
按部就班VUE+Element 前端應用開發(3)--- 動態菜單和路由的關聯處理
按部就班VUE+Element 前端應用開發(4)--- 獲取後端數據及產品信息頁面的處理
按部就班VUE+Element 前端應用開發(5)--- 表格列表頁面的查詢,列表展現和字段轉義處理
按部就班VUE+Element 前端應用開發(6)--- 常規Element 界面組件的使用
按部就班VUE+Element 前端應用開發(7)--- 介紹一些常規的JS處理函數
按部就班VUE+Element 前端應用開發(8)--- 樹列表組件的使用
按部就班VUE+Element 前端應用開發(9)--- 界面語言國際化的處理
按部就班VUE+Element 前端應用開發(10)--- 基於vue-echarts處理各類圖表展現
按部就班VUE+Element 前端應用開發(11)--- 圖標的維護和使用
按部就班VUE+Element 前端應用開發(12)--- 整合ABP框架的前端登陸處理
按部就班VUE+Element 前端應用開發(13)--- 前端API接口的封裝處理
按部就班VUE+Element 前端應用開發(14)--- 根據ABP後端接口實現前端界面展現
按部就班VUE+Element 前端應用開發(15)--- 用戶管理模塊的處理
按部就班VUE+Element 前端應用開發(16)--- 組織機構和角色管理模塊的處理
按部就班VUE+Element 前端應用開發(17)--- 菜單管理
按部就班VUE+Element 前端應用開發(18)--- 功能點管理及權限控制
按部就班VUE+Element 前端應用開發(19)--- 後端查詢接口和Vue前端的整合
按部就班VUE+Element 前端應用開發(20)--- 使用組件封裝簡化界面代碼
按部就班VUE+Element 前端應用開發(21)--- 省市區縣聯動處理的組件使用
按部就班VUE+Element 前端應用開發(22)--- 簡化main.js處理代碼,抽取過濾器、全局界面函數、組件註冊等處理邏輯到不一樣的文件中
按部就班VUE+Element 前端應用開發(23)--- 基於ABP實現先後端的附件上傳,圖片或者附件展現管理