use-pickeraddr.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <template>
  2. <view>
  3. <picker @change="bindPickerChange" @columnchange="columnchange" :range="array" range-key="name" :value="value" mode="multiSelector">
  4. <slot></slot>
  5. </picker>
  6. </view>
  7. </template>
  8. <script>
  9. import AllAddress from './data.js'
  10. let selectVal = ['', '', '']
  11. export default {
  12. data() {
  13. return {
  14. value: [0, 0, 0],
  15. array: [],
  16. index: 0
  17. }
  18. },
  19. created() {
  20. this.initSelect()
  21. },
  22. methods: {
  23. // 初始化地址选项
  24. initSelect() {
  25. this.updateSourceDate() // 更新源数据
  26. .updateAddressDate() // 更新结果数据
  27. .$forceUpdate() // 触发双向绑定
  28. },
  29. // 地址控件改变控件
  30. columnchange(d) {
  31. this.updateSelectIndex(d.detail.column, d.detail.value) // 更新选择索引
  32. .updateSourceDate() // 更新源数据
  33. .updateAddressDate() // 更新结果数据
  34. .$forceUpdate() // 触发双向绑定
  35. },
  36. /**
  37. * 更新源数据
  38. * */
  39. updateSourceDate() {
  40. this.array = []
  41. this.array[0] = AllAddress.map(obj => {
  42. return {
  43. name: obj.name
  44. }
  45. })
  46. this.array[1] = AllAddress[this.value[0]].city.map(obj => {
  47. return {
  48. name: obj.name
  49. }
  50. })
  51. this.array[2] = AllAddress[this.value[0]].city[this.value[1]].area.map(obj => {
  52. return {
  53. name: obj
  54. }
  55. })
  56. return this
  57. },
  58. /**
  59. * 更新索引
  60. * */
  61. updateSelectIndex(column, value) {
  62. let arr = JSON.parse(JSON.stringify(this.value))
  63. arr[column] = value
  64. if (column === 0) {
  65. arr[1] = 0
  66. arr[2] = 0
  67. }
  68. if (column === 1) {
  69. arr[2] = 0
  70. }
  71. this.value = arr
  72. return this
  73. },
  74. /**
  75. * 更新结果数据
  76. * */
  77. updateAddressDate() {
  78. selectVal[0] = this.array[0][this.value[0]].name
  79. selectVal[1] = this.array[1][this.value[1]].name
  80. selectVal[2] = this.array[2][this.value[2]].name
  81. return this
  82. },
  83. /**
  84. * 点击确定
  85. * */
  86. bindPickerChange(e) {
  87. this.$emit('change', {
  88. index: this.value,
  89. data: selectVal
  90. })
  91. return this
  92. }
  93. }
  94. }
  95. </script>
  96. <style>
  97. </style>