@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rainbow-oh/yee-c",
3
- "version": "0.15.0",
3
+ "version": "0.15.1",
4
4
  "description": "yee basic components",
5
5
  "keywords": [
6
6
  "react",
@@ -8,7 +8,7 @@ import React from 'react';
8
8
  export default () => {
9
9
  return (
10
10
  <InputNumber
11
- defaultValue={0}
11
+ defaultValue={123}
12
12
  placeholder="Enter a number"
13
13
  onChange={(value) => console.log('value:', value)}
14
14
  />
@@ -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
- if (val === null || val === undefined || isNaN(val)) return '';
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
- (mergedValue !== null && mergedValue >= max),
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
- (mergedValue !== null && mergedValue <= min),
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
  */
package/src/version.ts CHANGED
@@ -4,7 +4,7 @@ declare global {
4
4
  }
5
5
  }
6
6
 
7
- export const version = "0.15.0";
7
+ export const version = "0.15.1";
8
8
 
9
9
  if (typeof window !== 'undefined') {
10
10
  window.__yee_c_version__ = version;