multi-selector-picker.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <template>
  2. <view class="lb-multi-selector lb-picker-item"
  3. :style="{ height: height }">
  4. <picker-view :value="pickerValue"
  5. :indicator-style="indicatorStyle"
  6. :style="{ height: height }"
  7. @change="handleChange">
  8. <picker-view-column v-for="(column, index) in pickerColumns"
  9. :key="index">
  10. <view v-for="(item, i) in column || []"
  11. :class="[
  12. 'lb-picker-column',
  13. item[props.value] === selectValue[index]
  14. ? 'lb-picker-column-active'
  15. : ''
  16. ]"
  17. :key="i">
  18. <text class="lb-picker-column-label">
  19. {{ item[props.label] || item }}
  20. </text>
  21. </view>
  22. </picker-view-column>
  23. </picker-view>
  24. </view>
  25. </template>
  26. <script>
  27. import { commonMixin } from '../mixins'
  28. export default {
  29. props: {
  30. value: Array,
  31. list: Array,
  32. mode: String,
  33. props: Object,
  34. level: Number,
  35. visible: Boolean,
  36. height: String,
  37. isConfirmChange: Boolean
  38. },
  39. mixins: [commonMixin],
  40. data () {
  41. return {
  42. pickerValue: [],
  43. pickerColumns: [],
  44. selectValue: [],
  45. selectItem: []
  46. }
  47. },
  48. methods: {
  49. handleChange (item) {
  50. const pickerValue = item.detail.value
  51. const columnIndex = pickerValue.findIndex((item, i) => item !== this.pickerValue[i])
  52. const valueIndex = pickerValue[columnIndex]
  53. this.setPickerChange(pickerValue, valueIndex, columnIndex)
  54. },
  55. setPickerChange (pickerValue, valueIndex, columnIndex) {
  56. for (let i = 0; i < this.level; i++) {
  57. if (i > columnIndex) {
  58. pickerValue[i] = 0
  59. const column =
  60. this.pickerColumns[i - 1][valueIndex] ||
  61. this.pickerColumns[i - 1][0]
  62. this.$set(this.pickerColumns, i, column[this.props.children] || [])
  63. valueIndex = 0
  64. }
  65. this.$set(this.pickerValue, i, pickerValue[i])
  66. const selectItem = this.pickerColumns[i][pickerValue[i]]
  67. if (selectItem) {
  68. this.selectItem[i] = selectItem
  69. this.selectValue[i] = selectItem[this.props.value]
  70. } else {
  71. const spliceNum = this.level - i
  72. this.pickerValue.splice(i, spliceNum)
  73. this.selectValue.splice(i, spliceNum)
  74. this.selectItem.splice(i, spliceNum)
  75. this.pickerColumns.splice(i, spliceNum)
  76. break
  77. }
  78. }
  79. this.$emit('change', {
  80. value: this.selectValue,
  81. item: this.selectItem,
  82. index: this.pickerValue,
  83. change: 'scroll'
  84. })
  85. }
  86. }
  87. }
  88. </script>
  89. <style lang="scss" scoped>
  90. @import "../style/picker-item.scss";
  91. </style>