InputNumberRange.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <script lang="tsx">
  2. // import { t } from 'lance-element-vue/src/locale'
  3. import { defineComponent, unref, ref, computed } from 'vue'
  4. import { useI18n } from 'vue-i18n'
  5. import InputNumber from './InputNumber.vue'
  6. import { useFormSize } from 'element-plus'
  7. // import { getPropValue, /*$log*/ } from '@/utils'
  8. export default defineComponent({
  9. name: 'LeInputNumberRange',
  10. emits: {
  11. 'update:modelValue': (value: [] | {[prop: string]: any}) => true,
  12. 'blur': (e: Event) => true,
  13. 'change': (value: number|null|undefined, local_propEnd: string) => true
  14. },
  15. components: {
  16. InputNumber
  17. },
  18. props: {
  19. modelValue: {
  20. type: [Object, Array],
  21. required: true
  22. },
  23. // 是否为 数组类型
  24. isValueArray: {
  25. type: Boolean,
  26. default: false
  27. },
  28. // 数值精度
  29. precision: {
  30. type: Number,
  31. default: 0
  32. },
  33. // 前缀 min prop
  34. propStart: {
  35. type: String
  36. },
  37. // 后缀 max prop
  38. propEnd: {
  39. type: String
  40. },
  41. // 默认prop
  42. prop: {
  43. type: String,
  44. default: ''
  45. // 若不定义 propStart propEnd 则为 最小值(`${prop}Start`) 最大值(`${prop}End`)
  46. },
  47. // 最小值多语言
  48. placeholderStart: {
  49. type: String,
  50. default: 'le.el.input.min'
  51. },
  52. // 最大值多语言
  53. placeholderEnd: {
  54. type: String,
  55. default: 'le.el.input.max'
  56. },
  57. // 自定义样式(最大值/最小值)
  58. itemStyle: {
  59. type: String,
  60. default: ''
  61. }
  62. },
  63. setup(props, { attrs, slots, emit }) {
  64. const { t, te } = useI18n()
  65. const { prepend, append, controlsPosition, min, max, size, ...others } = attrs
  66. const _controlsPosition = controlsPosition ?? 'right'
  67. const { prepend: slot_prepend, append: slot_append, ...childSlots } = slots
  68. const inputNumberSize = size || unref(useFormSize())
  69. const placeholderStart = te(props.placeholderStart) ? t(props.placeholderStart) : props.placeholderStart
  70. const placeholderEnd = te(props.placeholderEnd) ? t(props.placeholderEnd) : props.placeholderEnd
  71. const _prepend = prepend ? <span class="le-input-number-range_addon prepend">{prepend}</span> : ''
  72. const _append = append ? <span class="le-input-number-range_addon append">{append}</span> : ''
  73. const propStart = computed(() => {
  74. if (props.isValueArray) return 0
  75. return props.propStart || `${props.prop}Start`
  76. })
  77. const propEnd = computed(() => {
  78. if (props.isValueArray) return 1
  79. return props.propEnd || `${props.prop}End`
  80. })
  81. const localModelValue = computed({
  82. get() {
  83. if (props.isValueArray) {
  84. if (Array.isArray(props.modelValue)) {
  85. return props.modelValue
  86. }
  87. emit('update:modelValue', [])
  88. return []
  89. }
  90. const val = props.modelValue
  91. if(!val) {
  92. emit('update:modelValue', {})
  93. return {}
  94. }
  95. return props.modelValue || {}
  96. },
  97. set(val) {
  98. console.error('localModelValue set', val)
  99. emit('update:modelValue', val)
  100. }
  101. })
  102. const onChangeStart = (value, oldValue) => {
  103. emit('change', value, propStart.value)
  104. }
  105. const onChangeEnd = (value, oldValue) => {
  106. emit('change', value, propEnd.value)
  107. }
  108. return () => {
  109. const local_propStart = propStart.value as string
  110. const local_propEnd = propEnd.value as string
  111. return <div class={`le-input-number-range le-input-number-range--${inputNumberSize}`}>
  112. {slot_prepend ? slot_prepend() : _prepend}
  113. <InputNumber
  114. class="le-input-number-range_start"
  115. size={inputNumberSize}
  116. {...others}
  117. min={min}
  118. max={localModelValue.value[local_propEnd] ?? max}
  119. precision={props.precision}
  120. controlsPosition={_controlsPosition}
  121. placeholder={placeholderStart}
  122. style={props.itemStyle}
  123. modelValue={localModelValue.value[local_propStart]}
  124. v-model={localModelValue.value[local_propStart]}
  125. onChange={onChangeStart}
  126. onBlur={event => emit('blur', event, local_propStart)}
  127. v-slots={childSlots}
  128. />
  129. <span class="le-input-number-range_line">-</span>
  130. <InputNumber
  131. class="le-input-number-range_end"
  132. size={inputNumberSize}
  133. {...others}
  134. min={localModelValue.value[local_propStart] ?? min}
  135. max={max}
  136. precision={props.precision}
  137. controlsPosition={_controlsPosition}
  138. placeholder={placeholderEnd}
  139. style={props.itemStyle}
  140. modelValue={localModelValue.value[local_propEnd]}
  141. v-model={localModelValue.value[local_propEnd]}
  142. // v-model={getPropValue(localModelValue.value, local_propEnd)}
  143. onChange={onChangeEnd}
  144. onBlur={event => emit('blur', event, local_propEnd)}
  145. v-slots={childSlots}
  146. />
  147. {slot_append ? slot_append() : _append}
  148. </div>
  149. }
  150. }
  151. })
  152. </script>