di-select.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <template>
  2. <view class="di-select">
  3. <u-input ref="diSelect" v-model="label" @click="show = true" disabled :select-open="show"
  4. type="select" :placeholder="placeholder" />
  5. <u-select v-model="show" :mode='mode' :list="list" @confirm="handleSelectConfirm"></u-select>
  6. </view>
  7. </template>
  8. <script>
  9. /**
  10. * di-select选择框
  11. * @description select列表组件,基于u-select,适配form
  12. * @property {Number String Array} value 可以使用v-model双向绑定
  13. * @property {String} placeholder 提示信息
  14. * @property {Array} list select展示的列表数据,与u-select的list保持一直
  15. * @property {String} mode = [single-column|mutil-column|mutil-column-auto] 模式选择,"single-column"-单列模式,"mutil-column"-多列模式,"mutil-column-auto"-多列联动模式
  16. * @event {Function} confirm 点击确定按钮,返回u-select#confirm事件保持一致
  17. */
  18. export default {
  19. data() {
  20. return {
  21. show: false,
  22. label: ''
  23. };
  24. },
  25. methods: {
  26. /**
  27. * 点击确认
  28. *
  29. * @param {Object} e
  30. */
  31. handleSelectConfirm(e) {
  32. if(this.mode === 'mutil-column' || this.mode === 'mutil-column-auto') {
  33. let labelList = []
  34. let valueList = []
  35. e.forEach(item => {
  36. labelList.push(item.label)
  37. valueList.push(item.value)
  38. })
  39. this.label = labelList.join('-')
  40. this.handleInputEvent(valueList)
  41. } else {
  42. this.label = e[0].label
  43. this.handleInputEvent(e[0].value)
  44. }
  45. this.$emit("confirm", e)
  46. },
  47. async __setLabel(val) {
  48. let time = setTimeout(() => {
  49. clearTimeout(time)
  50. if(this.mode === 'mutil-column' || this.mode === 'mutil-column-auto') {
  51. let valueList = this.value.split(',')
  52. if(!!valueList) {
  53. return
  54. }
  55. let labelList = []
  56. valueList.forEach(valueItem => {
  57. let selectItem = val.filter(item => item.value === valueItem)
  58. selectItem && selectItem.length > 0 && labelList.push(selectItem[0].label)
  59. })
  60. this.label = labelList.join('-')
  61. } else {
  62. const selectItem = val.filter(item => item.value === this.value)
  63. this.label = selectItem && selectItem.length > 0 && selectItem[0].label || ''
  64. }
  65. // H5下,label值会覆盖value值
  66. this.value && this.handleInputEvent(this.value)
  67. }, 0)
  68. },
  69. /**
  70. * 发送input消息
  71. * 过一个生命周期再发送事件给u-form-item,否则this.$emit('input')更新了父组件的值
  72. * 但是微信小程序上 尚未更新到u-form-item,导致获取的值为空
  73. */
  74. handleInputEvent(value) {
  75. this.$emit('input', value)
  76. setTimeout(() => {
  77. this.$refs.diSelect.dispatch('u-form-item', 'on-form-change', value);
  78. }, 60)
  79. }
  80. },
  81. watch: {
  82. list: {
  83. immediate: true,
  84. handler(value) {
  85. this.__setLabel(value)
  86. }
  87. }
  88. },
  89. props: {
  90. placeholder: {
  91. type: String,
  92. default: '请选择'
  93. },
  94. value: {
  95. type: [Number, String, Array],
  96. require: true
  97. },
  98. mode: {
  99. type: String,
  100. default: 'single-column'
  101. },
  102. list: {
  103. type: Array,
  104. default: () => []
  105. }
  106. }
  107. }
  108. </script>
  109. <style scoped lang="scss">
  110. .di-select {
  111. width: 100%;
  112. }
  113. </style>