循序漸進VUE+Element 前端應用開發(21)--- 省市區縣聯動處理的元件使用
在很多應用中,往往都涉及到記錄使用者所在省份、城市、區縣或者街道等資訊,一般我們可以通過聯動的Select或者類似的介面元件進行展示,或者使用Element中的el-cascader介面元件進行展示,而全國的省份、城市、區縣或者街道等資訊我們可以通過官方的資料進行獲取,可以直接存放在JS裡面,也可以儲存在自己的資料庫裡面,最後統一進行聯動展示即可。本篇隨筆介紹幾種元件對省市區縣聯動處理的效果及做法,可以直接應用在我們專案中,也可以做為一個元件開發的參考學習。
1、基於element-china-area-data 第三方元件的使用
在github往往有很多我們需要的開源元件,我們可以拿來直接使用,如這個地址是:https://github.com/Plortinus/element-china-area-data ,在Vue+Element的專案中,直接通過npm進行安裝元件即可:
npm install element-china-area-data -S
然後在頁面元件中引入物件資料,繫結在el-cascader介面元件即可。
import { provinceAndCityData, regionData, rovinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } from 'element-china-area-data';
例如介面程式碼如下所示。
<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格式如下所示
selectedOptions2: ['120000', '120100', '120101'],
而選中資料後,獲得的資料格式同樣是一個數組集合,如下所示
幾種介面元件的效果如下所示。
省市區三級聯動的案例Demo程式碼如下。
<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>
2、基於v-region控制元件省市區街道選擇元件
除了上面的 element-china-area-data 第三方元件,還有一個v-region的省市區街道的元件也做的不錯,地址是:https://github.com/TerryZ/v-region 。
它的主要特點是支援 “省/直轄市”、“市”、“區/縣”、“鄉/鎮/街道” 4級行政區域選擇,可以選擇Select的方式,或者分組方式展示,功能比較多樣化一些。
或者
這個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元件的初始化值,如下程式碼使用。
3、自定義省市區的元件
一般情況上,使用上面的方式就能解決問題了,不過這裡介紹另外一種思路,就是基於資料庫資料的方式進行省市區聯動的處理。
以前我在開發系統的時候,引入了省市區的資料,儲存在幾個資料庫表裡面,然後通過介面的方式檢索省市區及處理器聯動過程。
那麼在基於這些資料的基礎上,我們也可以這樣處理的。
首先我們建立省、市、區縣的表,並在後端釋出對應的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)--- 省市區縣聯動處理的元件使用