di-date-picker.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <template>
  2. <view class="di-date-picker">
  3. <u-input ref="diDate" v-model="tempVal" @click="show = true" disabled :select-open="show"
  4. type="select" :placeholder="placeholder" />
  5. <u-picker confirm-color="#18b566" v-model="show" :params="pickerParams" mode="time" @confirm="handlePicker" :default-time="value"></u-picker>
  6. </view>
  7. </template>
  8. <script>
  9. /**
  10. * 时间选择器
  11. * @property {String} value 可以使用v-model双向绑定
  12. * @property {String} placeholder 提示信息
  13. * @property {String} mode = [date|datetime] 模式选择,"date"-日期模式(默认),"datetime"-日期时间选择
  14. * @event {Function} confirm 点击确定按钮,传递出所选的完整的时间对象
  15. */
  16. export default {
  17. data() {
  18. return {
  19. show: false,
  20. tempVal: this.value
  21. }
  22. },
  23. watch: {
  24. value(val) {
  25. this.tempVal = val
  26. }
  27. },
  28. methods: {
  29. /**
  30. * 确认选择
  31. *
  32. * @param {Object} value
  33. */
  34. handlePicker(value) {
  35. let date = `${value.year}-${value.month}-${value.day}`
  36. if(this.mode === 'datetime') {
  37. date += ` ${value.hour}:${value.minute}:${value.second}`
  38. }
  39. this.tempVal = date
  40. this.handleInputEvent(date)
  41. this.$emit('confirm', value)
  42. },
  43. /**
  44. * 发送input消息
  45. * 过一个生命周期再发送事件给u-form-item,否则this.$emit('input')更新了父组件的值
  46. * 但是微信小程序上 尚未更新到u-form-item,导致获取的值为空
  47. */
  48. handleInputEvent(value) {
  49. this.$emit('input', value)
  50. this.$nextTick(function(){
  51. // 将当前的值发送到 u-form-item 进行校验
  52. this.$refs.diDate.dispatch('u-form-item', 'on-form-change', value);
  53. })
  54. }
  55. },
  56. computed: {
  57. pickerParams(){
  58. let params = {
  59. year: true,
  60. month: true,
  61. day: true
  62. }
  63. if(this.mode === 'datetime') {
  64. params.hour = true
  65. params.minute = true
  66. params.second = true
  67. }
  68. return params
  69. }
  70. },
  71. props: {
  72. placeholder: {
  73. type: String,
  74. default: '请选择'
  75. },
  76. value: {
  77. type: String,
  78. require: true
  79. },
  80. mode: {
  81. type: String,
  82. default: 'date'
  83. }
  84. }
  85. }
  86. </script>
  87. <style lang="scss">
  88. .di-date-picker {
  89. width: 100%;
  90. }
  91. </style>