Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

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