InputNumber.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <template>
  2. <div class="wrap">
  3. <InputNumber
  4. class="input-number"
  5. placeholder="0"
  6. type="number"
  7. :value="value"
  8. @focus="onFocus"
  9. @change="onChange"
  10. @blur="onBlur"
  11. />
  12. <span>{{ reactData.tip }}</span>
  13. <span class="error-msg">{{ reactData.error }}</span>
  14. </div>
  15. </template>
  16. <script lang="ts">
  17. import { InputNumber } from 'ant-design-vue';
  18. import { defineComponent, reactive, toRefs, watch } from 'vue';
  19. import { validateType } from '/@/utils/validTools';
  20. const props = {
  21. value: { type: Number, default: 0 },
  22. tip: { type: String, default: '' },
  23. rules: { type: Array, default: [] },
  24. errMsg: { type: String, default: '' },
  25. };
  26. export default defineComponent({
  27. components: { InputNumber },
  28. props,
  29. emits: ['change'],
  30. setup(props, { emit }) {
  31. const reactData = reactive({
  32. tip: '',
  33. error: '',
  34. });
  35. watch(
  36. () => props.errMsg,
  37. (errMsg) => {
  38. reactData.error = errMsg;
  39. }
  40. );
  41. function onFocus() {
  42. reactData.error = '';
  43. reactData.tip = props.tip;
  44. }
  45. function onBlur(e) {
  46. reactData.tip = '';
  47. if (props.rules && props.rules[0]) {
  48. const res = validateType(props.rules, e.target.value);
  49. reactData.error = res.errMsg;
  50. }
  51. }
  52. function onChange(val) {
  53. emit('change', val);
  54. }
  55. return {
  56. onFocus,
  57. onBlur,
  58. onChange,
  59. reactData,
  60. ...toRefs(props),
  61. };
  62. },
  63. });
  64. </script>
  65. <style scoped>
  66. .wrap {
  67. display: flex;
  68. }
  69. .input-number {
  70. width: 65%;
  71. margin-right: 10px;
  72. }
  73. span {
  74. font-size: 13px;
  75. line-height: 250%;
  76. color: gray;
  77. }
  78. .error-msg {
  79. color: red;
  80. }
  81. </style>