You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

pick-regions - 副本.vue 5.1KB

2 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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(this.)
  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>