原生JS封装:
moreSelect: function (url,elements) { function GetArea(url) { this.url = url this.init(elements) } GetArea.prototype = { num: 0, selections: null, list: [], createOptions(data, parent) { if (!parent) return if (parent.children) { var leng = parent.children.length for (var j = 0; j < leng; j++) { parent.lastElementChild.textContent = '' parent.lastElementChild.remove() } } for (var i = 0; i < data.length; i++) { var option = document.createElement('option'); option.textContent = data[i].name || data[i] parent.appendChild(option) } parent.addEventListener('change', this.changeHandler); parent.data = data parent.self = this }, init(elements) { this.selections = elements var xhr = new XMLHttpRequest(); xhr.addEventListener('load', this.loadHandler); xhr.open('get', this.url) xhr.send('') xhr.self = this }, loadHandler(e) { this.self.list = JSON.parse(this.response) this.self.createOptions(this.self.list, this.self.selections[this.self.num]) }, changeHandler(e) { var list; this.data.forEach((item) => { if (item.name === this.value) { list = item.city ? item.city : item } }); this.self.selections.forEach((item, val) => { if (item.id === this.id) { console.log(this.self.num) this.self.num = item.id.split('select')[1] - 1 } }) if (this.self.num > this.self.selections.length-1) { return } this.self.num++ this.self.createOptions(list, this.self.selections[this.self.num]) } } return getArea = new GetArea(url); }
基于Vue的mintUI三级联动:
本联动数据地址:https://github.com/modood/Administrative-divisions-of-China
Vue中使用mint-UI方法:
1、安装
cnpm install mint-ui --save-dev
2、引入
import MintUI from 'mint-ui'
import 'mint-ui/lib/style.css';
Vue.use(MintUI);
<template> <div> <mt-picker :slots="myAddressSlots" @change="onMyAddressChange"></mt-picker> <p>地址三级联动:{{myAddressProvince}} {{myAddressCity}} {{myAddresscounty}}</p> </div> </template> <style> </style> <script> import Vue from "vue"; import { Picker } from "mint-ui"; import myaddress from "../../data.json"; Vue.component(Picker.name, Picker); export default { data() { return { myAddressSlots: [ { flex: 1,//slot的CSS样式的flex 值 defaultIndex: 1,//slot的初始选中值 values: Object.keys(myaddress), //省份数组 className: "slot1",//slot的类名 textAlign: "center"//slot的对齐方式 }, { divider: true,//slot是否为分隔符 content: "-",//slot分隔符显示文本 className: "slot2" }, { flex: 1, values: [], className: "slot3", textAlign: "center" }, { divider: true, content: "-", className: "slot4" }, { flex: 1, values: [], className: "slot5", textAlign: "center" } ], myAddressProvince: "省", myAddressCity: "市", myAddresscounty: "区/县" }; }, created() {}, methods: { onMyAddressChange(picker, values) { if (myaddress[values[0]]) { //此判断可不加,但是vue会报错 picker.setSlotValues(1, Object.keys(myaddress[values[0]])); // Object.keys()会返回当前省的数组 picker.setSlotValues(2, myaddress[values[0]][values[1]]); // 区/县是一个数组 //省 this.myAddressProvince = values[0]; //市 this.myAddressCity = values[1]; //县 this.myAddresscounty = values[2]; } } }, mounted() { this.$nextTick(() => { this.myAddressSlots[0].defaultIndex = 0; }); } }; </script>