my-select.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <view class="width-100">
  3. <!--<u-input disabled vModel={this.inputLabel} {...{ testFuture: true, on: on }} placeholder={this.placeholder} type="select" />
  4. <u-input vShow={false} vModel={this.value} placeholder="请选择仓库名称" type="select" />
  5. <u-select vModel={this.openState} defaultValue={defaultValue} {...{ props, on: mySelectOn }}></u-select>-->
  6. <view class="d-flex a-center" style="width:100%">
  7. <view @click="inputClick" class="d-flex px2" style="width:100%">
  8. <view class="input-box flex1">
  9. <view v-if="inputLabel" class="text-color-3">{{inputLabel}}</view>
  10. <view v-else class="text-color-9">{{placeholder}}</view>
  11. </view>
  12. <u-icon name="arrow-right"></u-icon>
  13. </view>
  14. </view>
  15. <u-select :list="list" :value-name="valueName" :label-name="labelName" :mode="mode" v-model="openState" :defaultValue="myDefaultValue" @cancel="selectCancel" @confirm="selectConfirm"></u-select>
  16. </view>
  17. </template>
  18. <script>
  19. import Emitter from '@/uview-ui/libs/util/emitter.js'
  20. export default {
  21. mixins: [Emitter],
  22. data() {
  23. return {
  24. myDefaultValue: [],
  25. openState: false,
  26. inputLabel: ''
  27. }
  28. },
  29. props: {
  30. placeholder: {
  31. type: String,
  32. default: ''
  33. },
  34. disabled: {
  35. type: [String, Number, Boolean],
  36. default: false
  37. },
  38. mode: {
  39. type: String,
  40. default: 'single-column'
  41. },
  42. list: {
  43. type: Array,
  44. default() {
  45. return []
  46. }
  47. },
  48. // 自定义value属性名
  49. valueName: {
  50. type: String,
  51. default: 'value'
  52. },
  53. // 自定义label属性名
  54. labelName: {
  55. type: String,
  56. default: 'label'
  57. },
  58. value: {
  59. type: [String, Number],
  60. default: ''
  61. }
  62. },
  63. watch: {
  64. value(nVal, oVal) {
  65. if (nVal != null) {
  66. // this.myDefaultValue = [nVal];
  67. // console.log(nVal)
  68. this.initValue(nVal + '')
  69. }
  70. },
  71. list(nVal) {
  72. if (nVal != null) {
  73. if (this.value == null) {
  74. return
  75. }
  76. const { valueName, labelName } = this
  77. let selectItem = null
  78. const defaultValue = []
  79. for (let i = 0; i < nVal.length; i++) {
  80. const item = nVal[i]
  81. item[valueName] = item[valueName] + ''
  82. if (item[valueName] === this.value) {
  83. selectItem = item
  84. defaultValue.push(i)
  85. break
  86. }
  87. }
  88. this.myDefaultValue = defaultValue
  89. if (selectItem != null) {
  90. this.inputLabel = selectItem[labelName]
  91. } else {
  92. this.inputLabel = ''
  93. }
  94. }
  95. }
  96. },
  97. created() {
  98. // // 初始化值
  99. this.$nextTick(() => {
  100. this.initValue(this.value)
  101. })
  102. },
  103. methods: {
  104. inputClick() {
  105. if (this.disabled) {
  106. uni.showToast({ title: '不允许选择', icon: 'none' })
  107. return
  108. }
  109. this.openState = !this.openState
  110. },
  111. initValue(val) {
  112. if (val == null) {
  113. return
  114. }
  115. const { valueName, labelName } = this
  116. let selectItem = null
  117. const defaultValue = []
  118. for (let i = 0; i < this.list.length; i++) {
  119. const item = this.list[i]
  120. item[valueName] = item[valueName] + ''
  121. if (item[valueName] === val) {
  122. selectItem = item
  123. defaultValue.push(i)
  124. break
  125. }
  126. }
  127. this.myDefaultValue = defaultValue
  128. if (selectItem != null) {
  129. this.inputLabel = selectItem[labelName]
  130. } else {
  131. this.inputLabel = ''
  132. }
  133. },
  134. selectCancel() {
  135. this.dispatch('u-form-item', 'on-form-change')
  136. },
  137. async selectConfirm(data) {
  138. if (this.value + '' === data[0].value + '') {
  139. return
  140. }
  141. this.$emit('input', data[0].value + '')
  142. const { valueName } = this
  143. this.inputLabel = data[0].label
  144. let selectItem = null
  145. for (let i = 0; i < this.list.length; i++) {
  146. const item = this.list[i]
  147. if (item[valueName] + '' === data[0].value + '') {
  148. selectItem = item
  149. break
  150. }
  151. }
  152. this.$emit('selected', data[0].value, selectItem)
  153. }
  154. }
  155. }
  156. </script>
  157. <style scoped>
  158. .width-100 {
  159. width: 100%;
  160. }
  161. </style>