123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- <template>
- <picker
- mode="multiSelector"
- :value="multiIndex"
- :range="multiArray"
- @change="handleValueChange"
- @columnchange="handleColumnChange"
- >
- <slot></slot>
- </picker>
- </template>
- <script>
- const CHINA_REGIONS = require('./regions.json');
- export default {
- props: {
- defaultRegions: {
- type: Array,
- default() {
- return [];
- }
- },
- defaultRegionCode: {
- type: String
- },
- defaultRegion: [String, Array],
- value: [String, Array]
- },
- data() {
- return {
- cityArr: CHINA_REGIONS[0].childs,
- districtArr: CHINA_REGIONS[0].childs[0].childs,
- multiIndex: [0, 0, 0],
- isInitMultiArray: true
- };
- },
- watch: {
- defaultRegion: {
- handler(region, oldRegion) {
- if (Array.isArray(region)) {
- // 避免传的是字面量的时候重复触发
- oldRegion = oldRegion || [];
- if (region.join('') !== oldRegion.join('')) {
- this.handleDefaultRegion(region);
- }
- } else if (region && region.length == 6) {
- this.handleDefaultRegion(region);
- } else {
- console.warn('defaultRegion非有效格式');
- }
- },
- immediate: true
- }
- },
- computed: {
- multiArray() {
- return this.pickedArr.map(arr => arr.map(item => item.name));
- },
- pickedArr() {
- // 进行初始化
- if (this.isInitMultiArray) {
- return [
- CHINA_REGIONS,
- CHINA_REGIONS[0].childs,
- CHINA_REGIONS[0].childs[0].childs
- ];
- }
- return [CHINA_REGIONS, this.cityArr, this.districtArr];
- }
- },
- methods: {
- handleColumnChange(e) {
- // console.log(e);
- this.isInitMultiArray = false;
- const that = this;
- let col = e.detail.column;
- let row = e.detail.value;
- that.multiIndex[col] = row;
- try {
- switch (col) {
- case 0:
- if (CHINA_REGIONS[that.multiIndex[0]].childs.length == 0) {
- that.cityArr = that.districtArr = [
- CHINA_REGIONS[that.multiIndex[0]]
- ];
- break;
- }
- that.cityArr = CHINA_REGIONS[that.multiIndex[0]].childs;
- that.districtArr =
- CHINA_REGIONS[that.multiIndex[0]].childs[
- that.multiIndex[1]
- ].childs;
- break;
- case 1:
- that.districtArr =
- CHINA_REGIONS[that.multiIndex[0]].childs[
- that.multiIndex[1]
- ].childs;
- break;
- case 2:
- break;
- }
- } catch (e) {
- // console.log(e);
- that.districtArr = CHINA_REGIONS[that.multiIndex[0]].childs[0].childs;
- }
- },
- handleValueChange(e) {
- // 结构赋值
- let [index0, index1, index2] = e.detail.value;
- let [arr0, arr1, arr2] = this.pickedArr;
- let address = [arr0[index0], arr1[index1], arr2[index2]];
- // console.log(address);
- this.$emit('getRegion', address);
- this.$emit(
- 'input',
- `${address[0].name}${address[1].name}${address[2].name}`
- );
- },
- handleDefaultRegion(region) {
- const isCode = !Array.isArray(region);
- this.isInitMultiArray = false;
- let children = CHINA_REGIONS;
- for (let i = 0; i < 3; i++) {
- for (let j = 0; j < children.length; j++) {
- let condition = isCode
- ? children[j].code == region.slice(0, (i + 1) * 2)
- : children[j].name.includes(region[i]);
- if (condition) {
- // 匹配成功进行赋值
- // console.log(i,j,children.length-1);
- children = children[j].childs;
- if (i == 0) {
- this.cityArr = children;
- } else if (i == 1) {
- this.districtArr = children;
- }
- this.$set(this.multiIndex, i, j);
- // console.log(this.multiIndex);
- break;
- } else {
- // 首次匹配失败就用默认的初始化
- // console.log(i,j,children.length-1);
- if (i == 0 && j == children.length - 1) {
- this.isInitMultiArray = true;
- }
- }
- }
- }
- }
- }
- };
- </script>
|