@rainbow-oh/yee-c 0.15.0 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/InputNumber/demo/basic.js +1 -1
- package/dist/cjs/InputNumber/input-number.js +17 -4
- package/dist/cjs/InputNumber/interface.d.ts +3 -3
- package/dist/cjs/style/themes.css +1 -1
- package/dist/cjs/style/variables.css +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/InputNumber/demo/basic.js +1 -1
- package/dist/esm/InputNumber/input-number.js +20 -4
- package/dist/esm/InputNumber/interface.d.ts +3 -3
- package/dist/esm/style/themes.css +1 -1
- package/dist/esm/style/variables.css +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/umd/yee-c.min.js +1 -1
- package/package.json +1 -1
- package/src/InputNumber/demo/basic.tsx +1 -1
- package/src/InputNumber/index.en-US.md +2 -2
- package/src/InputNumber/index.zh-CN.md +2 -2
- package/src/InputNumber/input-number.tsx +27 -6
- package/src/InputNumber/interface.ts +3 -3
- package/src/version.ts +1 -1
package/package.json
CHANGED
|
@@ -63,8 +63,8 @@ Enter a number within certain range with the mouse or keyboard.
|
|
|
63
63
|
| Property | Type | Description | Default |
|
|
64
64
|
| --- | --- | --- | --- |
|
|
65
65
|
| prefixCls | `string` | Custom class name prefix | - |
|
|
66
|
-
| value | `number \| null` | Current value | - |
|
|
67
|
-
| defaultValue | `number \| null` | Default value | - |
|
|
66
|
+
| value | `number \| string \| null` | Current value (`''` is treated as empty and never renders as 0 with a formatter) | - |
|
|
67
|
+
| defaultValue | `number \| string \| null` | Default value | - |
|
|
68
68
|
| min | `number` | Minimum value | -Infinity |
|
|
69
69
|
| max | `number` | Maximum value | Infinity |
|
|
70
70
|
| step | `number` | Step value | `1` |
|
|
@@ -67,8 +67,8 @@ toc: 'content'
|
|
|
67
67
|
| 属性名 | 类型 | 描述 | 默认值 |
|
|
68
68
|
| --- | --- | --- | --- |
|
|
69
69
|
| prefixCls | `string` | 自定义类名前缀 | - |
|
|
70
|
-
| value | `number \| null` |
|
|
71
|
-
| defaultValue | `number \| null` | 默认值 | - |
|
|
70
|
+
| value | `number \| string \| null` | 受控的值(`''` 视为空值,配 formatter 也不会渲染成 0) | - |
|
|
71
|
+
| defaultValue | `number \| string \| null` | 默认值 | - |
|
|
72
72
|
| min | `number` | 最小值 | -Infinity |
|
|
73
73
|
| max | `number` | 最大值 | Infinity |
|
|
74
74
|
| step | `number` | 步长 | `1` |
|
|
@@ -49,7 +49,7 @@ const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>(
|
|
|
49
49
|
...rest
|
|
50
50
|
} = props;
|
|
51
51
|
|
|
52
|
-
const [mergedValue, setMergedValue] = useMergedState<number | null>(null, {
|
|
52
|
+
const [mergedValue, setMergedValue] = useMergedState<number | string | null>(null, {
|
|
53
53
|
value,
|
|
54
54
|
defaultValue,
|
|
55
55
|
});
|
|
@@ -57,9 +57,24 @@ const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>(
|
|
|
57
57
|
const [focused, setFocused] = useState(false);
|
|
58
58
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
59
59
|
|
|
60
|
+
/** 字符串值(表单 store 常见)参与算术/比较前转数字;不可解析返回 null */
|
|
61
|
+
function toNumber(val: number | string | null | undefined): number | null {
|
|
62
|
+
if (val === null || val === undefined || val === '') return null;
|
|
63
|
+
const n = Number(val);
|
|
64
|
+
return Number.isNaN(n) ? null : n;
|
|
65
|
+
}
|
|
66
|
+
|
|
60
67
|
// Format value
|
|
61
|
-
function formatValue(val: number | null | undefined): string {
|
|
62
|
-
|
|
68
|
+
function formatValue(val: number | string | null | undefined): string {
|
|
69
|
+
// '' 与 null/undefined 同为空值:Number('') === 0,若不拦截会被
|
|
70
|
+
// formatter/precision 格式化成 '0'(如全局千分位 formatter 场景)
|
|
71
|
+
if (
|
|
72
|
+
val === null ||
|
|
73
|
+
val === undefined ||
|
|
74
|
+
val === '' ||
|
|
75
|
+
isNaN(val as number)
|
|
76
|
+
)
|
|
77
|
+
return '';
|
|
63
78
|
|
|
64
79
|
let formattedVal =
|
|
65
80
|
precision !== undefined ? Number(val).toFixed(precision) : val;
|
|
@@ -149,7 +164,7 @@ const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>(
|
|
|
149
164
|
if (disabled || readOnly) return;
|
|
150
165
|
|
|
151
166
|
const offset = type === 'up' ? step : -step;
|
|
152
|
-
const currentValue = mergedValue ?? 0;
|
|
167
|
+
const currentValue = toNumber(mergedValue) ?? 0;
|
|
153
168
|
const newValue = currentValue + offset;
|
|
154
169
|
|
|
155
170
|
updateValue(newValue);
|
|
@@ -259,7 +274,10 @@ const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>(
|
|
|
259
274
|
{
|
|
260
275
|
[`${prefixCls}-handler-disabled`]:
|
|
261
276
|
disabled ||
|
|
262
|
-
(
|
|
277
|
+
(() => {
|
|
278
|
+
const n = toNumber(mergedValue);
|
|
279
|
+
return n !== null && n >= max;
|
|
280
|
+
})(),
|
|
263
281
|
},
|
|
264
282
|
)}
|
|
265
283
|
onClick={() => handleStep('up')}
|
|
@@ -273,7 +291,10 @@ const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>(
|
|
|
273
291
|
{
|
|
274
292
|
[`${prefixCls}-handler-disabled`]:
|
|
275
293
|
disabled ||
|
|
276
|
-
(
|
|
294
|
+
(() => {
|
|
295
|
+
const n = toNumber(mergedValue);
|
|
296
|
+
return n !== null && n <= min;
|
|
297
|
+
})(),
|
|
277
298
|
},
|
|
278
299
|
)}
|
|
279
300
|
onClick={() => handleStep('down')}
|
|
@@ -34,13 +34,13 @@ export interface InputNumberProps extends Omit<
|
|
|
34
34
|
*/
|
|
35
35
|
size?: 'small' | 'default' | 'large';
|
|
36
36
|
/**
|
|
37
|
-
* Controlled value
|
|
37
|
+
* Controlled value('' 视为空值,配合 formatter 不会渲染成 0)
|
|
38
38
|
*/
|
|
39
|
-
value?: number | null;
|
|
39
|
+
value?: number | string | null;
|
|
40
40
|
/**
|
|
41
41
|
* Default value
|
|
42
42
|
*/
|
|
43
|
-
defaultValue?: number | null;
|
|
43
|
+
defaultValue?: number | string | null;
|
|
44
44
|
/**
|
|
45
45
|
* Minimum value
|
|
46
46
|
*/
|