背景
現在大部分電商的網站、app都需要使用者或者管理者去選擇設定地區等位置資訊。下面我就介紹一下前端開發者用vue,axios,element-ui開發一個省市區三級聯動的元件。
實現
1.準備工作,首先我們需要全中國的省市區資源的json資料(科普一下:前六位數字是身份證前六位)
2.搭建vue-cli,安裝axios,element-ui,建立vue,webpack專案
(1) 在控制檯或者終端執行以下程式碼,其中只需要路由(y),其他e2e,eslint這些不需要(n)
vue init webpack threelink
cd threelink
npm run dev
複製程式碼
(2) 在專案threelink->src->main.js裡面新增,呼叫element-ui外掛得程式碼
// 載入element_ui
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import axios from 'axios'
Vue.use(ElementUI);
Vue.prototype.$axios = axios;
複製程式碼
(3) 在static下建立json資料夾,資料夾裡面放map.json,就是全國地址的資料資訊,目錄結構如下
(4) 元件裡面的程式碼
<div class="linkage">
<el-select
v-model="sheng"
@change="choseProvince"//這個change事件是select的,不是option的,別寫在option裡面
placeholder="省級地區">
<el-option
v-for="item in province"
:key="item.id"
:label="item.value"
:value="item.id">
</el-option>
</el-select>
<el-select
v-model="shi"
@change="choseCity"
placeholder="市級地區">
<el-option
v-for="item in shi1"
:key="item.id"
:label="item.value"
:value="item.id">
</el-option>
</el-select>
<el-select
v-model="qu"
@change="choseBlock"
placeholder="區級地區">
<el-option
v-for="item in qu1"
:key="item.id"
:label="item.value"
:value="item.id">
</el-option>
</el-select>
</div>
import axios from 'axios'
export default {
data () {
return {
mapJson:'../static/json/map.json',
province:'',
sheng: '',
shi: '',
shi1: [],
qu: '',
qu1: [],
city:'',
block:'',
}
},
methods:{
// 載入china地點資料,三級
getCityData:function(){
var that = this
axios.get(this.mapJson).then(function(response){
if (response.status==200) {
var data = response.data
that.province = []
that.city = []
that.block = []
// 省市區資料分類
for (var item in data) {
if (item.match(/0000$/)) {//省
that.province.push({id: item, value: data[item], children: []})
} else if (item.match(/00$/)) {//市
that.city.push({id: item, value: data[item], children: []})
} else {//區
that.block.push({id: item, value: data[item]})
}
}
// 分類市級
for (var index in that.province) {
for (var index1 in that.city) {
if (that.province[index].id.slice(0, 2) === that.city[index1].id.slice(0, 2)) {
that.province[index].children.push(that.city[index1])
}
}
}
// 分類區級
for(var item1 in that.city) {
for(var item2 in that.block) {
if (that.block[item2].id.slice(0, 4) === that.city[item1].id.slice(0, 4)) {
that.city[item1].children.push(that.block[item2])
}
}
}
}
else{
console.log(response.status)
}
}).catch(function(error){console.log(typeof+ error)})
},
// 選省
choseProvince:function(e) {
for (var index2 in this.province) {
if (e === this.province[index2].id) {
this.shi1 = this.province[index2].children
this.shi = this.province[index2].children[0].value
this.qu1 =this.province[index2].children[0].children
this.qu = this.province[index2].children[0].children[0].value
this.E = this.qu1[0].id
}
}
},
// 選市
choseCity:function(e) {
for (var index3 in this.city) {
if (e === this.city[index3].id) {
this.qu1 = this.city[index3].children
this.qu = this.city[index3].children[0].value
this.E = this.qu1[0].id
// console.log(this.E)
}
}
},
// 選區
choseBlock:function(e) {
this.E=e;
// console.log(this.E)
},
},
created:function(){
this.getCityData()
}
}
複製程式碼
(5) 效果圖
結語
OK我個人感覺效果還不錯,也不卡
github專案地址:github.com/846187209/l…
需要的話可自行下載哦