作移動端的都知道 常常會有省市區這種三級聯動的功能 今天研究了一下午~vue
1.準備工做 vue+mintui+省市區的json數據git
下載好後須要3個json文件 進入dist找到這3個文件github
將這3個文件放入到vue項目裏 json
新建一個處理這3個json方法的文件ide
import provinces from '../../static/provinces.json' import areas from '../../static/areas.json' import cities from '../../static/cities.json' export const zmGetProvinces = () => { return provinces; } export const zmGetcities = (provinceCode) => { if (!provinceCode) { provinceCode = '11' } let citiesArr = []; cities.forEach(function (item) { if (item.provinceCode == provinceCode) { console.log(item) citiesArr.push(item) } }) return citiesArr } export const zmGetareas = (cityCode) => { // console.log(areas) if (!cityCode) { cityCode = '1101' } let areasArr = []; areas.forEach(function (item) { if (item.cityCode == cityCode) { areasArr.push(item) } }) return areasArr }
在這文件處理下數據依次導出flex
接着能夠將省市區作成一個組件方便後續使用 這裏我使用的是mintui裏的popup和picker這2個組件來搭配ui
<template> <div> <mt-popup class="pop" v-model="sexpopup" position="bottom"> <mt-picker :slots="slots" valueKey="name" @change="onValuesChange"></mt-picker> </mt-popup> </div> </template> <script> import { zmGetProvinces, zmGetcities, zmGetareas } from "@/utils/zmRegion.js"; export default { props: ["result"], data() { return { slots: [ { flex: 1, values: zmGetProvinces(), className: "slot1", textAlign: "right" }, { divider: true, content: "", className: "slot2" }, { flex: 1, values: zmGetcities("11"), className: "slot1", textAlign: "conter" }, { divider: true, content: "", className: "slot2" }, { flex: 1, values: zmGetareas("1101"), className: "slot3", textAlign: "center" } ], region: "", regionInit: false, sexpopup: this.result }; }, watch: { result(val) { this.sexpopup = val; }, sexpopup(val) { this.$emit("changepop", val); } }, methods: { onValuesChange(picker, values) { if (this.regionInit) { if (values[0] && values[1] && values[2]) { this.region = values[0]["name"] + values[1]["name"] + values[2]["name"]; console.log(this.region); //給市、縣賦值 let area = ""; if (values[0].name == "北京市") { area = "1101"; } else if (values[0].name == "天津市") { area = "1201"; } else { area = values[1]["code"]; } picker.setSlotValues(1, zmGetcities(values[0]["code"])); picker.setSlotValues(2, zmGetareas(area)); // this.$emit("getRegion", this.region); } else { console.log("數據不全"); } } else { this.regionInit = true; } console.log(this.regionInit); } }, created() {} }; </script> <style scoped> .pop { width: 100%; } </style>
這裏有個坑就是天津和北京市這2個地方滑動的時候數據不會從新刷新 在這裏作了個處理this
最後將組件導入須要用到的地方spa
這裏用到了props組件見的雙向綁定 自行百度~~3d
使用一個點擊事件改變sexpopup的狀態
最後附上效果圖 大功告成 記錄下!~~~~~