multi-selector-picker.vue 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. },
  38. mixins: [commonMixin],
  39. data () {
  40. return {
  41. pickerValue: [],
  42. pickerColumns: [],
  43. selectValue: [],
  44. selectItem: []
  45. }
  46. },
  47. methods: {
  48. handleChange (item) {
  49. const pickerValue = item.detail.value
  50. const columnIndex = pickerValue.findIndex(
  51. (item, i) => item !== this.pickerValue[i]
  52. )
  53. const valueIndex = pickerValue[columnIndex]
  54. this.setPickerChange(pickerValue, valueIndex, columnIndex)
  55. },
  56. setPickerChange (pickerValue, valueIndex, columnIndex) {
  57. for (let i = 0; i < this.level; i++) {
  58. if (i > columnIndex) {
  59. pickerValue[i] = 0
  60. const column =
  61. this.pickerColumns[i - 1][valueIndex] ||
  62. this.pickerColumns[i - 1][0]
  63. this.$set(this.pickerColumns, i, column[this.props.children] || [])
  64. valueIndex = 0
  65. }
  66. this.$set(this.pickerValue, i, pickerValue[i])
  67. const selectItem = this.pickerColumns[i][pickerValue[i]]
  68. if (selectItem) {
  69. this.selectItem[i] = selectItem
  70. this.selectValue[i] = selectItem[this.props.value]
  71. } else {
  72. const spliceNum = this.level - i
  73. this.pickerValue.splice(i, spliceNum)
  74. this.selectValue.splice(i, spliceNum)
  75. this.selectItem.splice(i, spliceNum)
  76. this.pickerColumns.splice(i, spliceNum)
  77. break
  78. }
  79. }
  80. this.$emit('change', {
  81. value: this.selectValue,
  82. item: this.selectItem,
  83. index: this.pickerValue,
  84. change: 'scroll'
  85. })
  86. }
  87. }
  88. }
  89. </script>
  90. <style lang="scss" scoped>
  91. @import "../style/picker-item.scss";
  92. </style>