pick-regions.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <template>
  2. <picker mode="multiSelector"
  3. :value="multiIndex"
  4. :range="multiArray"
  5. @change="handleValueChange"
  6. @columnchange="handleColumnChange">
  7. <slot></slot>
  8. </picker>
  9. </template>
  10. <script>
  11. const CHINA_REGIONS = require('./regions.json')
  12. export default {
  13. props:{
  14. defaultRegions:{
  15. type:Array,
  16. default(){
  17. return []
  18. }
  19. },
  20. defaultRegionCode:{
  21. type:String
  22. },
  23. defaultRegion:[String,Array]
  24. },
  25. data() {
  26. return {
  27. cityArr:CHINA_REGIONS[0].childs,
  28. districtArr:CHINA_REGIONS[0].childs[0].childs,
  29. multiIndex: [0, 0, 0],
  30. isInitMultiArray:true,
  31. }
  32. },
  33. watch:{
  34. defaultRegion:{
  35. handler(region,oldRegion){
  36. console.log(region)
  37. console.log(oldRegion)
  38. if(Array.isArray(region)){
  39. // 避免传的是字面量的时候重复触发
  40. oldRegion = oldRegion || []
  41. if(region.join('')!==oldRegion.join('')){
  42. this.handleDefaultRegion(region)
  43. }
  44. }else if(region&&region.length == 6){
  45. this.handleDefaultRegion(region)
  46. }else{
  47. console.warn('defaultRegion非有效格式')
  48. }
  49. },
  50. immediate:true,
  51. }
  52. },
  53. computed:{
  54. multiArray(){
  55. return this.pickedArr.map(arr=>arr.map(item=>item.name))
  56. },
  57. pickedArr(){
  58. // 进行初始化
  59. if(this.isInitMultiArray){
  60. return [
  61. CHINA_REGIONS,
  62. CHINA_REGIONS[0].childs,
  63. CHINA_REGIONS[0].childs[0].childs
  64. ]
  65. }
  66. return [CHINA_REGIONS,this.cityArr,this.districtArr];
  67. }
  68. },
  69. methods: {
  70. handleColumnChange(e){
  71. // console.log(e);
  72. this.isInitMultiArray = false;
  73. const that = this;
  74. let col = e.detail.column;
  75. let row = e.detail.value;
  76. that.multiIndex[col] = row;
  77. try{
  78. switch(col){
  79. case 0:
  80. if(CHINA_REGIONS[that.multiIndex[0]].childs.length==0){
  81. that.cityArr = that.districtArr = [CHINA_REGIONS[that.multiIndex[0]]]
  82. break;
  83. }
  84. that.cityArr = CHINA_REGIONS[that.multiIndex[0]].childs
  85. that.districtArr = CHINA_REGIONS[that.multiIndex[0]].childs[that.multiIndex[1]].childs
  86. break;
  87. case 1:
  88. that.districtArr = CHINA_REGIONS[that.multiIndex[0]].childs[that.multiIndex[1]].childs
  89. break;
  90. case 2:
  91. break;
  92. }
  93. }catch(e){
  94. // console.log(e);
  95. that.districtArr = CHINA_REGIONS[that.multiIndex[0]].childs[0].childs
  96. }
  97. },
  98. handleValueChange(e){
  99. // 结构赋值
  100. let [index0,index1,index2] = e.detail.value;
  101. let [arr0,arr1,arr2] = this.pickedArr;
  102. let address = [arr0[index0],arr1[index1],arr2[index2]];
  103. // console.log(address);
  104. this.$emit('getRegion',address)
  105. },
  106. handleDefaultRegion(region){
  107. const isCode = !Array.isArray(region)
  108. this.isInitMultiArray = false;
  109. let children = CHINA_REGIONS
  110. for(let i=0;i<3;i++){
  111. for(let j=0;j<children.length;j++){
  112. let condition = isCode?children[j].code==region.slice(0,(i+1)*2):children[j].name.includes(region[i]);
  113. if(condition){
  114. // 匹配成功进行赋值
  115. // console.log(i,j,children.length-1);
  116. children = children[j].childs;
  117. if(i==0){
  118. this.cityArr = children
  119. }else if(i==1){
  120. this.districtArr = children
  121. }
  122. this.$set(this.multiIndex,i,j)
  123. // console.log(this.multiIndex);
  124. break;
  125. }else{
  126. // 首次匹配失败就用默认的初始化
  127. // console.log(i,j,children.length-1);
  128. if(i==0 && j==(children.length-1)){
  129. this.isInitMultiArray = true;
  130. }
  131. }
  132. }
  133. }
  134. }
  135. },
  136. }
  137. </script>