Blame view

uni_modules/uview-plus/components/u-picker-data/u-picker-data.vue 2.63 KB
a2702f6d   刘淇   巡查计划
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
  <template>
  	<view class="u-picker-data">
  		<view class="u-picker-data__trigger">
  			<slot name="trigger" :current="current"></slot>
  			<up-input
  				v-if="!$slots['trigger']"
  				:modelValue="current"
  				disabled
  				disabledColor="#ffffff"
  				:placeholder="title"
  				border="none"
  			></up-input>
  			<view @click="show = true"
  				class="u-picker-data__trigger__cover"></view>
  		</view>
  		<up-picker
  			:show="show"
  			:columns="optionsInner"
  			:keyName="labelKey"
  			:defaultIndex="defaultIndex"
  			@confirm="confirm"
  			@cancel="cancel"
  			@close="close">
  		</up-picker>
  	</view>
  </template>
  
  <script>
  import { formValidate } from '../../libs/function/index';
  export default {
  	name: 'u-picker-data',
      props: {
  		modelValue: {
  			type: [String, Number],
  			default: ''
  		},
  		title: {
  			type: String,
  			default: ''
  		},
  		description: {
  			type: String,
  			default: ''
  		},
  		options: {
  			type: Array,
  			default: () => {
  				return []
  			}
  		},
  		valueKey: {
  			type: String,
  			default: 'id'
  		},
  		labelKey: {
  			type: String,
  			default: 'name'
  		}
      },
      data() {
          return {
  			show: false,
  			current: '',
  			defaultIndex: [],
          }
      },
      created() {
  		if (this.modelValue) {
  			this.options.forEach((ele, index) => {
  				if (ele[this.valueKey] == this.modelValue) {
  					this.current = ele[this.labelKey]
  					this.defaultIndex = [index]
  				}
  			})
  		} else {
  			this.clear();
  		}
      },
  	watch: {
  		modelValue() {
  			if (this.modelValue) {
  				this.options.forEach((ele, index) => {
  					if (ele[this.valueKey] == this.modelValue) {
  						this.current = ele[this.labelKey]
  						this.defaultIndex = [index]
  					}
  				})
  			} else {
  				this.clear();
  			}
  		}
  	},
  	computed: {
  		optionsInner() {
  			return [this.options];
  		}
  	},
      emits: ['update:modelValue', 'cancel', 'close', 'confirm'],
      methods: {
          hideKeyboard() {
              uni.hideKeyboard()
          },
  		cancel() {
  			this.show = false;
  			this.$emit('cancel')
  		},
  		close() {
  			this.$emit('close')
  		},
  		clear() {
  			this.current = '';
  			this.defaultIndex = [];
  		},
          confirm(e) {
  			const {
  			    columnIndex,
  			    index,
  				value,
  			} = e;
  			this.show = false;
  			// console.log(value);
              this.$emit('update:modelValue', value[0][this.valueKey]);
  			this.defaultIndex = columnIndex;
  			this.current = value[0][this.labelKey];
  			this.$emit('confirm')
  			// 表单验证
  			formValidate(this, 'change')
          }
      }
  }
  </script>
  
  <style lang="scss" scoped>
  	.u-picker-data {
  		&__trigger {
  			position: relative;
  			&__cover {
  				position: absolute;
  				top: 0;
  				left: 0;
  				right: 0;
  				bottom: 0;
  				z-index:10;
  			}
  		}
  	}
  </style>