Skip to content

Commit df6a1fd

Browse files
refactor:inputnumber (#6265)
* refactor:inputnumber * docs:update & refactor: inputnumber type --------- Co-authored-by: tangjinzhou <[email protected]>
1 parent 321989b commit df6a1fd

File tree

12 files changed

+474
-445
lines changed

12 files changed

+474
-445
lines changed

components/input-number/index.en-US.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
category: Components
33
type: Data Entry
44
title: InputNumber
5-
cover: https://gw.alipayobjects.com/zos/alicdn/XOS8qZ0kU/InputNumber.svg
5+
cover: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*JvWbSYhuNlIAAAAAAAAAAAAADrJ8AQ/original
66
---
77

88
Enter a number within certain range with the mouse or keyboard.

components/input-number/index.tsx

+25-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { PropType, ExtractPropTypes, HTMLAttributes, App } from 'vue';
1+
import type { ExtractPropTypes, HTMLAttributes, App } from 'vue';
22
import { watch, defineComponent, ref, computed } from 'vue';
33
import classNames from '../_util/classNames';
44
import UpOutlined from '@ant-design/icons-vue/UpOutlined';
@@ -17,11 +17,16 @@ import PropTypes from '../_util/vue-types';
1717
import isValidValue from '../_util/isValidValue';
1818
import type { InputStatus } from '../_util/statusUtils';
1919
import { getStatusClassNames, getMergedStatus } from '../_util/statusUtils';
20+
import { booleanType, stringType } from '../_util/type';
21+
22+
// CSSINJS
23+
import useStyle from './style';
24+
2025
const baseProps = baseInputNumberProps();
2126
export const inputNumberProps = () => ({
2227
...baseProps,
23-
size: { type: String as PropType<SizeType> },
24-
bordered: { type: Boolean, default: true },
28+
size: stringType<SizeType>(),
29+
bordered: booleanType(true),
2530
placeholder: String,
2631
name: String,
2732
id: String,
@@ -31,7 +36,7 @@ export const inputNumberProps = () => ({
3136
prefix: PropTypes.any,
3237
'onUpdate:value': baseProps.onChange,
3338
valueModifiers: Object,
34-
status: String as PropType<InputStatus>,
39+
status: stringType<InputStatus>(),
3540
});
3641

3742
export type InputNumberProps = Partial<ExtractPropTypes<ReturnType<typeof inputNumberProps>>>;
@@ -48,6 +53,10 @@ const InputNumber = defineComponent({
4853
const formItemInputContext = FormItemInputContext.useInject();
4954
const mergedStatus = computed(() => getMergedStatus(formItemInputContext.status, props.status));
5055
const { prefixCls, size, direction } = useConfigInject('input-number', props);
56+
57+
// Style
58+
const [wrapSSR, hashId] = useStyle(prefixCls);
59+
5160
const mergedValue = ref(props.value === undefined ? props.defaultValue : props.value);
5261
const focused = ref(false);
5362
watch(
@@ -112,6 +121,7 @@ const InputNumber = defineComponent({
112121
},
113122
getStatusClassNames(preCls, mergedStatus.value),
114123
className,
124+
hashId.value,
115125
);
116126

117127
let element = (
@@ -153,6 +163,7 @@ const InputNumber = defineComponent({
153163
// className will go to addon wrapper
154164
[`${className}`]: !hasAddon && className,
155165
},
166+
hashId.value,
156167
);
157168
element = (
158169
<div
@@ -175,9 +186,14 @@ const InputNumber = defineComponent({
175186
) : null;
176187
const addonAfterNode = addonAfter ? <div class={addonClassName}>{addonAfter}</div> : null;
177188

178-
const mergedWrapperClassName = classNames(`${preCls}-wrapper`, wrapperClassName, {
179-
[`${wrapperClassName}-rtl`]: direction.value === 'rtl',
180-
});
189+
const mergedWrapperClassName = classNames(
190+
`${preCls}-wrapper`,
191+
wrapperClassName,
192+
{
193+
[`${wrapperClassName}-rtl`]: direction.value === 'rtl',
194+
},
195+
hashId.value,
196+
);
181197

182198
const mergedGroupClassName = classNames(
183199
`${preCls}-group-wrapper`,
@@ -188,6 +204,7 @@ const InputNumber = defineComponent({
188204
},
189205
getStatusClassNames(`${prefixCls}-group-wrapper`, mergedStatus.value, hasFeedback),
190206
className,
207+
hashId.value,
191208
);
192209
element = (
193210
<div class={mergedGroupClassName} style={style}>
@@ -199,7 +216,7 @@ const InputNumber = defineComponent({
199216
</div>
200217
);
201218
}
202-
return cloneElement(element, { style });
219+
return wrapSSR(cloneElement(element, { style }));
203220
};
204221
},
205222
});

components/input-number/index.zh-CN.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ category: Components
33
type: 数据录入
44
title: InputNumber
55
subtitle: 数字输入框
6-
cover: https://gw.alipayobjects.com/zos/alicdn/XOS8qZ0kU/InputNumber.svg
6+
cover: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*JvWbSYhuNlIAAAAAAAAAAAAADrJ8AQ/original
77
---
88

99
通过鼠标或键盘,输入范围内的数值。

components/input-number/src/InputNumber.tsx

+30-33
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ import StepHandler from './StepHandler';
55
import { getNumberPrecision, num2str, validateNumber } from './utils/numberUtil';
66
import useCursor from './hooks/useCursor';
77
import useFrame from './hooks/useFrame';
8-
import type { HTMLAttributes, PropType } from 'vue';
8+
import type { HTMLAttributes } from 'vue';
99
import { watch, computed, ref, defineComponent } from 'vue';
1010
import type { ChangeEvent, KeyboardEventHandler } from '../../_util/EventInterface';
1111
import KeyCode from '../../_util/KeyCode';
1212
import classNames from '../../_util/classNames';
13+
import { booleanType, stringType, someType, functionType } from '../../_util/type';
1314

1415
/**
1516
* We support `stringMode` which need handle correct type when user call in onChange
@@ -36,46 +37,42 @@ const getDecimalIfValidate = (value: ValueType) => {
3637

3738
export const inputNumberProps = () => ({
3839
/** value will show as string */
39-
stringMode: { type: Boolean as PropType<boolean> },
40-
41-
defaultValue: { type: [String, Number] as PropType<ValueType> },
42-
value: { type: [String, Number] as PropType<ValueType> },
43-
44-
prefixCls: { type: String as PropType<string> },
45-
min: { type: [String, Number] as PropType<ValueType> },
46-
max: { type: [String, Number] as PropType<ValueType> },
47-
step: { type: [String, Number] as PropType<ValueType>, default: 1 },
48-
tabindex: { type: Number as PropType<number> },
49-
controls: { type: Boolean as PropType<boolean>, default: true },
50-
readonly: { type: Boolean as PropType<boolean> },
51-
disabled: { type: Boolean as PropType<boolean> },
52-
autofocus: { type: Boolean as PropType<boolean> },
53-
keyboard: { type: Boolean as PropType<boolean>, default: true },
40+
stringMode: booleanType(),
41+
42+
defaultValue: someType<ValueType>([String, Number]),
43+
value: someType<ValueType>([String, Number]),
44+
45+
prefixCls: stringType<string>(),
46+
min: someType<ValueType>([String, Number]),
47+
max: someType<ValueType>([String, Number]),
48+
step: someType<ValueType>([String, Number], 1),
49+
tabindex: Number,
50+
controls: booleanType(true),
51+
readonly: booleanType(),
52+
disabled: booleanType(),
53+
autofocus: booleanType(),
54+
keyboard: booleanType(true),
5455

5556
/** Parse display value to validate number */
56-
parser: { type: Function as PropType<(displayValue: string | undefined) => ValueType> },
57+
parser: functionType<(displayValue: string | undefined) => ValueType>(),
5758
/** Transform `value` to display value show in input */
58-
formatter: {
59-
type: Function as PropType<
59+
formatter:
60+
functionType<
6061
(value: ValueType | undefined, info: { userTyping: boolean; input: string }) => string
61-
>,
62-
},
62+
>(),
6363
/** Syntactic sugar of `formatter`. Config precision of display. */
64-
precision: { type: Number as PropType<number> },
64+
precision: Number,
6565
/** Syntactic sugar of `formatter`. Config decimal separator of display. */
66-
decimalSeparator: { type: String as PropType<string> },
66+
decimalSeparator: String,
6767

68-
onInput: { type: Function as PropType<(text: string) => void> },
69-
onChange: { type: Function as PropType<(value: ValueType) => void> },
70-
onPressEnter: { type: Function as PropType<KeyboardEventHandler> },
68+
onInput: functionType<(text: string) => void>(),
69+
onChange: functionType<(value: ValueType) => void>(),
70+
onPressEnter: functionType<KeyboardEventHandler>(),
7171

72-
onStep: {
73-
type: Function as PropType<
74-
(value: ValueType, info: { offset: ValueType; type: 'up' | 'down' }) => void
75-
>,
76-
},
77-
onBlur: { type: Function as PropType<(e: FocusEvent) => void> },
78-
onFocus: { type: Function as PropType<(e: FocusEvent) => void> },
72+
onStep:
73+
functionType<(value: ValueType, info: { offset: ValueType; type: 'up' | 'down' }) => void>(),
74+
onBlur: functionType<(e: FocusEvent) => void>(),
75+
onFocus: functionType<(e: FocusEvent) => void>(),
7976
});
8077

8178
export default defineComponent({

components/input-number/src/StepHandler.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import isMobile from '../../vc-util/isMobile';
2-
import type { PropType } from 'vue';
32
import { onBeforeUnmount, ref, defineComponent } from 'vue';
43
import classNames from '../../_util/classNames';
4+
import { functionType } from '../../_util/type';
55

66
/**
77
* When click and hold on a button - the speed of auto changing the value.
@@ -21,7 +21,7 @@ export default defineComponent({
2121
prefixCls: String,
2222
upDisabled: Boolean,
2323
downDisabled: Boolean,
24-
onStep: { type: Function as PropType<(up: boolean) => void> },
24+
onStep: functionType<(up: boolean) => void>(),
2525
},
2626
slots: ['upNode', 'downNode'],
2727
setup(props, { slots, emit }) {

components/input-number/style/affix.less

-83
This file was deleted.

0 commit comments

Comments
 (0)