NumberRange.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <template>
  2. <div class="vc-number-range d-flex flex-row align-items-center">
  3. <a-input-number placeholder="最小值" :disabled="disabled" :value="realValue[0]" @update:value="(v: number) => onUpdateValue(v, 0)" v-bind="customProps" />
  4. <span class="p-2">-</span>
  5. <a-input-number placeholder="最大值" :disabled="disabled" :value="realValue[1]" @update:value="(v: number) => onUpdateValue(v, 1)" v-bind="customProps" />
  6. </div>
  7. </template>
  8. <script lang="ts" setup>
  9. /**
  10. * 下拉框表单控件,用于解决 a-select 不能选择对象的问题
  11. */
  12. import { Form, type InputNumberProps } from 'ant-design-vue';
  13. import { type PropType, ref, watch, onMounted } from 'vue';
  14. const props = defineProps({
  15. /**
  16. * 是否禁用
  17. */
  18. disabled: {
  19. type: Boolean,
  20. default: false
  21. },
  22. /**
  23. * 选择值
  24. */
  25. value: {
  26. },
  27. /**
  28. * a-number-input 其他自定义参数
  29. */
  30. customProps: {
  31. type: Object as PropType<InputNumberProps>,
  32. default: null,
  33. },
  34. });
  35. const emits = defineEmits([
  36. 'update:value',
  37. ]);
  38. const realValue = ref<number[]>([]);
  39. const { onFieldChange } = Form.useInjectFormItemContext();
  40. watch(() => props.value, (v) => {
  41. if ((v as number[])?.length == 2)
  42. realValue.value = v as number[];
  43. else {
  44. if (realValue.value.length === 1 && realValue.value[0] === undefined) {
  45. realValue.value = [];
  46. emits('update:value', []);
  47. } else {
  48. realValue.value = [];
  49. }
  50. }
  51. });
  52. onMounted(() => {
  53. realValue.value = (props.value as number[])?.length == 2 ? props.value as number[] : [];
  54. });
  55. function onUpdateValue(v : number, index: number) {
  56. realValue.value[index] = v;
  57. if (realValue.value.length < 2)
  58. realValue.value.push(0);
  59. emits('update:value', realValue.value);
  60. onFieldChange();
  61. }
  62. </script>