<template> <view class="multi-selector picker-item" :style="{ height: height }"> <picker-view :value="pickerValue" :indicator-style="indicatorStyle" :style="{ height: height }" @change="handleChange"> <picker-view-column v-for="(column, index) in pickerColumns" :key="index"> <view v-for="(item, i) in column || []" :class="[ 'lb-picker-column', item[props.value] === selectValue[index] ? 'lb-picker-column-active' : '' ]" :key="i" :style="{ height: columnHeight, 'line-height': columnHeight }"> <view class="lb-picker-column-label"> {{ item[props.label] }} </view> </view> </picker-view-column> </picker-view> </view> </template> <script> import { getIndicatorHeight } from '../utils.js' const indicatorHeight = getIndicatorHeight() export default { props: { value: Array, list: Array, props: Object, level: Number, visible: Boolean, height: String }, data () { return { pickerValue: [], pickerColumns: [], selectValue: [], selectItem: [], columnHeight: indicatorHeight + 'px', indicatorStyle: `height: ${indicatorHeight}px` } }, created () { this.init('init') }, methods: { init (changeType) { this.setPickerItems(this.list) this.$emit('change', { value: this.selectValue, item: this.selectItem, index: this.pickerValue, change: changeType }) }, handleChange (item) { const pickerValue = item.detail.value const columnIndex = pickerValue.findIndex( (item, i) => item !== this.pickerValue[i] ) const valueIndex = pickerValue[columnIndex] this.setPickerChange(pickerValue, valueIndex, columnIndex) }, setPickerChange (pickerValue, valueIndex, columnIndex) { for (let i = 0; i < this.level; i++) { if (i > columnIndex) { pickerValue[i] = 0 const column = this.pickerColumns[i - 1][valueIndex] || this.pickerColumns[i - 1][0] this.$set(this.pickerColumns, i, column[this.props.children] || []) valueIndex = 0 } this.pickerValue = pickerValue this.selectItem[i] = this.pickerColumns[i][pickerValue[i]] if (this.selectItem[i]) { this.selectValue[i] = this.selectItem[i][this.props.value] } else { const spliceNum = this.level - i this.pickerValue.splice(i, spliceNum) this.selectValue.splice(i, spliceNum) this.selectItem.splice(i, spliceNum) this.pickerColumns.splice(i, spliceNum) break } } this.$emit('change', { value: this.selectValue, item: this.selectItem, index: this.pickerValue, change: 'scroll' }) }, setPickerItems (list = [], index = 0) { if (!list.length) return const defaultValue = this.value || [] if (index < this.level) { const value = defaultValue[index] || '' let i = list.findIndex(item => item[this.props.value] === value) i = i > -1 ? i : 0 this.$set(this.pickerValue, index, i) this.$set(this.pickerColumns, index, list) if (list[i]) { this.$set(this.selectValue, index, list[i][this.props.value]) this.$set(this.selectItem, index, list[i]) this.setPickerItems(list[i][this.props.children] || [], index + 1) } } } }, watch: { value (newVal) { this.init('value') }, list () { this.init('list') } } } </script> <style lang="scss" scoped> @import "../style/picker-item.scss"; </style>