123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- <template>
- <view>
- <!-- 触发按钮 -->
- <view class="picker-trigger" @click="showPicker">
- <view class="picker-action">
- <view class="text-grey">{{ label }}</view>
- </view>
- </view>
- <!-- 弹出层 -->
- <picker
- mode="multiSelector"
- :value="pickerValue"
- :range="pickerRange"
- @change="PickerChange"
- @columnchange="PickerColumnChange"
- :show="show"
- >
- <view class="picker-content">
- <view class="picker-column">{{ pickerRange[0][pickerValue[0]][rangeKey] }}</view>
- <view class="picker-column">{{ pickerRange[1][pickerValue[1]][rangeKey] }}</view>
- </view>
- </picker>
- </view>
- </template>
- <script>
- export default {
- data() {
- return {
- show: false, // 控制选择器的显示
- pickerValue: [0, 0], // 两列的默认选中索引
- pickerRange: [[], []], // 两列数据
- label: '请选择', // 显示的标签
- };
- },
- props: {
- value: {
- type: Array,
- default: () => [null, null] // 两列的绑定值
- },
- empty: {
- type: String,
- default: ''
- },
- rangeKey: {
- type: String,
- default: 'label'
- },
- rangeValue: {
- type: String,
- default: 'value'
- },
- range1: {
- type: Array,
- default: () => []
- },
- range2: {
- type: Array,
- default: () => []
- },
- disabled: {
- type: Boolean,
- default: false
- },
- onChangeNew: {
- type: Function,
- default: null,
- }
- },
- watch: {
- range1: {
- handler(newRange) {
- this.pickerRange[0] = newRange;
- },
- immediate: true
- },
- range2: {
- handler(newRange) {
- this.pickerRange[1] = newRange;
- },
- immediate: true
- },
- value: {
- handler(newVal) {
- if (newVal && newVal.length === 2) {
- const [val1, val2] = newVal;
- this.label = `${this.findLabel(this.pickerRange[0], val1)} - ${this.findLabel(this.pickerRange[1], val2)}`;
- }
- },
- immediate: true
- }
- },
- methods: {
- showPicker() {
- if (!this.disabled) {
- this.show = true;
- }
- },
- PickerChange(e) {
- const [index1, index2] = e.detail.value;
- const value1 = this.pickerRange[0][index1][this.rangeValue];
- const value2 = this.pickerRange[1][index2][this.rangeValue];
- this.label = `${this.pickerRange[0][index1][this.rangeKey]} - ${this.pickerRange[1][index2][this.rangeKey]}`;
- this.$emit('input', [value1, value2]);
- this.show = false; // 关闭选择器
- if (this.onChangeNew) {
- this.onChangeNew();
- }
- },
- PickerColumnChange(e) {
- const { column, value } = e.detail;
- this.pickerValue[column] = value;
- },
- findLabel(range, value) {
- const option = range.find(item => item[this.rangeValue] === value);
- return option ? option[this.rangeKey] : '请选择';
- }
- },
- mounted() {
- if (this.empty) {
- this.label = this.empty;
- }
- this.pickerRange = [this.range1, this.range2];
- }
- };
- </script>
- <style>
- .picker-trigger {
- padding: 10px;
- border: 1px solid #ccc;
- border-radius: 4px;
- background-color: #fff;
- display: flex;
- align-items: center;
- }
- .text-grey {
- color: #999;
- margin-left: 8px;
- }
- </style>
|