@hi-ui/input 4.0.0-alpha.8 → 4.0.0-beta.2

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.
@@ -0,0 +1,119 @@
1
+ /** @LICENSE
2
+ * @hi-ui/input
3
+ * https://github.com/XiaoMi/hiui/tree/master/packages/ui/input#readme
4
+ *
5
+ * Copyright (c) HIUI <mi-hiui@xiaomi.com>.
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */
10
+ import { useCallback, useState, useMemo } from 'react';
11
+ import { useUncontrolledState } from '@hi-ui/use-uncontrolled-state';
12
+ import { useLatestCallback } from '@hi-ui/use-latest';
13
+ import { setAttrStatus } from '@hi-ui/dom-utils';
14
+ import { pure, format, formatAmount } from './utils/index.js';
15
+
16
+ var useInput = function useInput(_ref) {
17
+ var name = _ref.name,
18
+ _ref$autoFocus = _ref.autoFocus,
19
+ autoFocus = _ref$autoFocus === void 0 ? false : _ref$autoFocus,
20
+ _ref$disabled = _ref.disabled,
21
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
22
+ _ref$readOnly = _ref.readOnly,
23
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
24
+ maxLength = _ref.maxLength,
25
+ placeholder = _ref.placeholder,
26
+ _ref$defaultValue = _ref.defaultValue,
27
+ defaultValue = _ref$defaultValue === void 0 ? '' : _ref$defaultValue,
28
+ valueProp = _ref.value,
29
+ onChange = _ref.onChange,
30
+ onFocus = _ref.onFocus,
31
+ onBlur = _ref.onBlur,
32
+ _ref$trimValueOnBlur = _ref.trimValueOnBlur,
33
+ trimValueOnBlur = _ref$trimValueOnBlur === void 0 ? false : _ref$trimValueOnBlur,
34
+ _ref$type = _ref.type,
35
+ type = _ref$type === void 0 ? 'text' : _ref$type,
36
+ clearElementRef = _ref.clearElementRef; // Object.is 避免 trimValueOnBlur 和 点击 clearIcon 触发 2 次相同的 onCHange
37
+
38
+ var _useUncontrolledState = useUncontrolledState(defaultValue, valueProp, onChange, Object.is),
39
+ value = _useUncontrolledState[0],
40
+ tryChangeValue = _useUncontrolledState[1];
41
+
42
+ var handleChange = useCallback(function (evt, trim) {
43
+ if (trim === void 0) {
44
+ trim = false;
45
+ }
46
+
47
+ evt.persist();
48
+ var nextValue = evt.target.value;
49
+ var valueTrue = pure(nextValue, type); // 防溢出,保证 onChange 拿到的是值是最新的 formatted value
50
+
51
+ var value = format(nextValue, type);
52
+
53
+ if (trim) {
54
+ valueTrue = valueTrue.trim();
55
+ value = value.trim();
56
+ }
57
+
58
+ var event = Object.create(evt);
59
+ event.target = Object.assign(Object.assign({}, evt.target), {
60
+ value: value
61
+ });
62
+ tryChangeValue(valueTrue, event);
63
+ }, [tryChangeValue, type]);
64
+
65
+ var _useState = useState(autoFocus),
66
+ focused = _useState[0],
67
+ setFocused = _useState[1];
68
+
69
+ var handleFocus = useLatestCallback(function (evt) {
70
+ setFocused(true);
71
+ onFocus === null || onFocus === void 0 ? void 0 : onFocus(evt);
72
+ });
73
+ var handleBlur = useLatestCallback(function (event) {
74
+ var relatedTarget = event.relatedTarget; // 拦截 clearIcon 点击清空,阻止其触发 input 失焦
75
+
76
+ if (clearElementRef && clearElementRef.current && clearElementRef.current === relatedTarget) {
77
+ return;
78
+ }
79
+
80
+ setFocused(false); // amount 自动添加小数
81
+
82
+ if (type === 'amount') {
83
+ event.target.value = formatAmount(value, true);
84
+ handleChange(event, trimValueOnBlur);
85
+ } else if (trimValueOnBlur) {
86
+ handleChange(event, true);
87
+ }
88
+
89
+ onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
90
+ });
91
+ var nativeInputProps = useMemo(function () {
92
+ return {
93
+ name: name,
94
+ disabled: disabled,
95
+ readOnly: readOnly,
96
+ autoFocus: autoFocus,
97
+ placeholder: placeholder,
98
+ maxLength: maxLength,
99
+ 'data-focused': setAttrStatus(focused)
100
+ };
101
+ }, [disabled, readOnly, autoFocus, placeholder, maxLength, name, focused]);
102
+ var getInputProps = useCallback(function () {
103
+ return Object.assign(Object.assign({}, nativeInputProps), {
104
+ value: format(value, type),
105
+ onChange: handleChange,
106
+ onFocus: handleFocus,
107
+ onBlur: handleBlur
108
+ });
109
+ }, [value, type, handleChange, handleFocus, handleBlur, nativeInputProps]);
110
+ return {
111
+ focused: focused,
112
+ value: value,
113
+ tryChangeValue: tryChangeValue,
114
+ getInputProps: getInputProps
115
+ };
116
+ };
117
+
118
+ export { useInput };
119
+ //# sourceMappingURL=use-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-input.js","sources":["../../src/use-input.ts"],"sourcesContent":[null],"names":["useInput","name","autoFocus","disabled","readOnly","maxLength","placeholder","defaultValue","valueProp","value","onChange","onFocus","onBlur","trimValueOnBlur","type","clearElementRef","useUncontrolledState","Object","is","tryChangeValue","handleChange","useCallback","evt","trim","persist","nextValue","target","valueTrue","pure","format","event","create","useState","focused","setFocused","handleFocus","useLatestCallback","handleBlur","relatedTarget","current","formatAmount","nativeInputProps","useMemo","setAttrStatus","getInputProps"],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ /** @LICENSE
2
+ * @hi-ui/input
3
+ * https://github.com/XiaoMi/hiui/tree/master/packages/ui/input#readme
4
+ *
5
+ * Copyright (c) HIUI <mi-hiui@xiaomi.com>.
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */
10
+
11
+ /**
12
+ * 格式化身份证
13
+ */
14
+ var formatId = function formatId(val) {
15
+ val = val.replace(/[^a-zA-Z0-9]/g, '');
16
+ var len = val.length;
17
+
18
+ if (val === '' || len < 7) {
19
+ return val;
20
+ }
21
+
22
+ if (len < 11) {
23
+ return val.slice(0, 6) + ' ' + val.slice(6, 10);
24
+ } else if (len < 15) {
25
+ return val.slice(0, 6) + ' ' + val.slice(6, 10) + ' ' + val.slice(10, 14);
26
+ } else {
27
+ return val.slice(0, 6) + ' ' + val.slice(6, 10) + ' ' + val.slice(10, 14) + ' ' + val.slice(14, 18);
28
+ }
29
+ };
30
+
31
+ var pureId = function pureId(val) {
32
+ var tmp = val.replace(/[^\d|.]/g, '');
33
+ return tmp.slice(0, 18);
34
+ };
35
+ /**
36
+ * 格式化手机号
37
+ */
38
+
39
+
40
+ var formatTel = function formatTel(val) {
41
+ val = val.replace(/\D/g, '');
42
+ var len = val.length;
43
+
44
+ if (val === '' || len < 4) {
45
+ return val;
46
+ }
47
+
48
+ if (len < 8) {
49
+ return val.slice(0, 3) + ' ' + val.slice(3, 7);
50
+ } else {
51
+ return val.slice(0, 3) + ' ' + val.slice(3, 7) + ' ' + val.slice(7, 11);
52
+ }
53
+ };
54
+
55
+ var pureTel = function pureTel(val) {
56
+ var tmp = val.replace(/[^\d|.]/g, '');
57
+ return tmp.slice(0, 11);
58
+ };
59
+ /**
60
+ * 格式化银行卡号
61
+ */
62
+
63
+
64
+ var formatCard = function formatCard(val) {
65
+ val = val.replace(/\D/g, '');
66
+ var len = val.length;
67
+
68
+ if (val === '' || val.length < 5) {
69
+ return val;
70
+ }
71
+
72
+ if (len < 9) {
73
+ return val.slice(0, 4) + ' ' + val.slice(4, 8);
74
+ } else if (len < 13) {
75
+ return val.slice(0, 4) + ' ' + val.slice(4, 8) + ' ' + val.slice(8, 12);
76
+ } else if (len < 17) {
77
+ return val.slice(0, 4) + ' ' + val.slice(4, 8) + ' ' + val.slice(8, 12) + ' ' + val.slice(12, 16);
78
+ } else {
79
+ return val.slice(0, 4) + ' ' + val.slice(4, 8) + ' ' + val.slice(8, 12) + ' ' + val.slice(12, 16) + ' ' + val.slice(16, 19);
80
+ }
81
+ };
82
+
83
+ var pureCard = function pureCard(val) {
84
+ var tmp = val.replace(/[^\d|.]/g, '');
85
+ return tmp.slice(0, 19);
86
+ };
87
+ /**
88
+ * 金额自动生成小数
89
+ * @param {string} val 需要处理的值
90
+ */
91
+
92
+
93
+ var formatAmount = function formatAmount(val, fill) {
94
+ if (fill === void 0) {
95
+ fill = false;
96
+ }
97
+
98
+ val = val.replace(/[^\d|.|,]/g, '').replace(/(\.\d*?)(\.|,).*/, function (_, $1) {
99
+ return $1;
100
+ });
101
+
102
+ if (fill) {
103
+ if (!val) return val;
104
+ return val.indexOf('.') > -1 ? val : val + '.00';
105
+ }
106
+
107
+ return val;
108
+ };
109
+
110
+ var pureAmount = function pureAmount(val) {
111
+ var tmp = val.replace(/[^\d|.]/g, '');
112
+ return tmp;
113
+ };
114
+
115
+ var formatEmail = function formatEmail(val) {
116
+ return val.replace(/\W/g, '');
117
+ };
118
+
119
+ var pureEmail = function pureEmail(val) {
120
+ return val;
121
+ };
122
+ /**
123
+ * 输入规则
124
+ */
125
+
126
+
127
+ var format = function format(val, type) {
128
+ switch (type) {
129
+ case 'id':
130
+ return formatId(val);
131
+
132
+ case 'tel':
133
+ return formatTel(val);
134
+
135
+ case 'card':
136
+ return formatCard(val);
137
+
138
+ case 'email':
139
+ return formatEmail(val);
140
+
141
+ case 'amount':
142
+ return formatAmount(val);
143
+
144
+ default:
145
+ return val;
146
+ }
147
+ };
148
+ /**
149
+ * 净化规则
150
+ */
151
+
152
+
153
+ var pure = function pure(val, type) {
154
+ switch (type) {
155
+ case 'id':
156
+ return pureId(val);
157
+
158
+ case 'tel':
159
+ return pureTel(val);
160
+
161
+ case 'card':
162
+ return pureCard(val);
163
+
164
+ case 'email':
165
+ return pureEmail(val);
166
+
167
+ case 'amount':
168
+ return pureAmount(val);
169
+
170
+ default:
171
+ return val;
172
+ }
173
+ };
174
+
175
+ export { format, formatAmount, formatCard, formatEmail, formatId, formatTel, pure, pureAmount, pureCard, pureEmail, pureId, pureTel };
176
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/utils/index.ts"],"sourcesContent":[null],"names":["formatId","val","replace","len","length","slice","pureId","tmp","formatTel","pureTel","formatCard","pureCard","formatAmount","fill","_","$1","indexOf","pureAmount","formatEmail","pureEmail","format","type","pure"],"mappings":"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"}
@@ -1,25 +1,17 @@
1
1
  import React from 'react';
2
+ import { HiBaseAppearanceEnum, HiBaseHTMLFieldProps } from '@hi-ui/core';
2
3
  /**
3
- * TODO: What is Input
4
+ * 输入框
5
+ *
6
+ * @TODO:
7
+ * 1. size api 确认
8
+ * 2. 修改类名结构
9
+ * 3. 支持带数字展示
10
+ * 4. InputGroup 模式支持
11
+ * 5. 手动聚焦支持额外配置
4
12
  */
5
13
  export declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement | null>>;
6
- export interface InputProps {
7
- /**
8
- * 组件默认的选择器类
9
- */
10
- prefixCls?: string;
11
- /**
12
- * 组件的语义化 Role 属性
13
- */
14
- role?: string;
15
- /**
16
- * 组件的注入选择器类
17
- */
18
- className?: string;
19
- /**
20
- * 组件的注入样式
21
- */
22
- style?: React.CSSProperties;
14
+ export interface InputProps extends HiBaseHTMLFieldProps<'input'> {
23
15
  /**
24
16
  * 开启输入框只读
25
17
  */
@@ -32,10 +24,6 @@ export interface InputProps {
32
24
  * 开启输入框自动聚焦
33
25
  */
34
26
  autoFocus?: boolean;
35
- /**
36
- * 输入框字段名称
37
- */
38
- name?: string;
39
27
  /**
40
28
  * 设置输入框的值
41
29
  */
@@ -47,17 +35,17 @@ export interface InputProps {
47
35
  /**
48
36
  * 设置输入框类型,支持原生 input 的 type 属性所有值
49
37
  */
50
- type?: 'text' | 'number';
38
+ type?: 'text' | 'id' | 'tel' | 'card' | 'amount' | 'email' | string;
51
39
  /**
52
40
  * 输入最大长度
53
41
  */
54
42
  maxLength?: number;
55
43
  /**
56
- * 输入框前置外部标签
44
+ * 输入框前置外部内容
57
45
  */
58
46
  prepend?: React.ReactNode;
59
47
  /**
60
- * 输入框后置外部标签
48
+ * 输入框后置外部内容
61
49
  */
62
50
  append?: React.ReactNode;
63
51
  /**
@@ -73,40 +61,33 @@ export interface InputProps {
73
61
  */
74
62
  clearable?: boolean;
75
63
  /**
76
- * 清除按钮展示的触发形态
64
+ * 开启失焦时触发对值的 trim,将触发 onChange 给用户
77
65
  */
78
- clearableTrigger?: 'always' | 'hover';
66
+ trimValueOnBlur?: boolean;
79
67
  /**
80
- * 开启动画浮动提示
68
+ * 清除按钮展示的触发形态
81
69
  */
82
- floatLabel?: React.ReactNode;
70
+ clearableTrigger?: 'always' | 'hover';
83
71
  /**
84
72
  * 输入框占位符
85
73
  */
86
74
  placeholder?: string;
87
75
  /**
88
76
  * 设置展现形式
77
+ * 其中 `underline` 内部使用,不对外提供支持(风格去线型化:由线性过渡到面性)
89
78
  */
90
- appearance?: 'outline' | 'unset' | 'filled' | 'underline';
79
+ appearance?: HiBaseAppearanceEnum | 'underline';
91
80
  /**
92
- * 设置输入框尺寸
81
+ * 设置尺寸
93
82
  */
94
83
  size?: 'sm' | 'md' | 'lg';
95
84
  /**
96
85
  * 值改变时的回调
97
86
  */
98
- onChange?: (evt: React.ChangeEvent<HTMLInputElement>) => void;
99
- /**
100
- * 获得焦点时的回调
101
- */
102
- onFocus?: (evt: React.FocusEvent<HTMLInputElement>) => void;
103
- /**
104
- * 失去焦点时的回调
105
- */
106
- onBlur?: (evt: React.FocusEvent<HTMLInputElement>) => void;
87
+ onChange?: (evt: React.ChangeEvent<HTMLInputElement>, value: string) => void;
107
88
  }
108
89
  /**
109
- * 伪造目标事件 target
90
+ * 模拟伪装目标事件 target
110
91
  *
111
92
  * @param target
112
93
  * @param evt
@@ -114,4 +95,4 @@ export interface InputProps {
114
95
  * @param targetValue
115
96
  * @returns
116
97
  */
117
- export declare function onChangeMock(onChange: (event: React.ChangeEvent<HTMLInputElement>) => void, evt: React.ChangeEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>, target: HTMLInputElement | null, targetValue: string): void;
98
+ export declare function onChangeMock(onChange: (event: React.ChangeEvent<HTMLInputElement>, value: string) => void, evt: React.ChangeEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>, target: HTMLInputElement | null, targetValue: string): void;
@@ -0,0 +1,134 @@
1
+ import React from 'react';
2
+ import type { HiBaseAppearanceEnum, HiBaseDataItem, HiBaseHTMLFieldProps } from '@hi-ui/core';
3
+ /**
4
+ * 支持自定义渲染输入框内容,暂时仅供内部 Picker 类组件使用,不对外提供
5
+ */
6
+ export declare const MockInput: React.ForwardRefExoticComponent<Omit<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>>, "disabled" | "readOnly" | "placeholder" | "defaultValue" | "value" | "onChange" | "type" | "focused" | "onSelect" | "title" | "size" | "prefix" | "data" | "onClick" | "appearance" | "suffix" | "clearableTrigger" | "clearable" | "displayRender"> & {
7
+ prefixCls?: string | undefined;
8
+ role?: string | undefined;
9
+ } & {
10
+ /**
11
+ * 设置当前多选值
12
+ */
13
+ value?: React.ReactText | undefined;
14
+ /**
15
+ * 设置当前多选值默认值
16
+ */
17
+ defaultValue?: React.ReactText | undefined;
18
+ /**
19
+ * 多选值改变时的回调
20
+ */
21
+ onChange?: ((value: React.ReactText, item: any) => void) | undefined;
22
+ /**
23
+ * 是否可清空
24
+ */
25
+ clearable?: boolean | undefined;
26
+ /**
27
+ * 清除按钮展示的触发形态
28
+ */
29
+ clearableTrigger?: "always" | "hover" | undefined;
30
+ /**
31
+ * 是否禁止使用
32
+ */
33
+ disabled?: boolean | undefined;
34
+ /**
35
+ * 自定义选择后触发器所展示的内容
36
+ */
37
+ displayRender?: ((item: HiBaseDataItem) => React.ReactNode) | undefined;
38
+ /**
39
+ * 输入框占位符
40
+ */
41
+ placeholder?: string | undefined;
42
+ /**
43
+ * 输入框后置内容
44
+ */
45
+ suffix?: React.ReactNode;
46
+ /**
47
+ * 点击 Input 时触发回调
48
+ */
49
+ onClick?: ((event: React.MouseEvent<HTMLDivElement>) => void) | undefined;
50
+ /**
51
+ * 展示数据源
52
+ */
53
+ data?: HiBaseDataItem[] | undefined;
54
+ /**
55
+ * 是否聚焦
56
+ */
57
+ focused?: boolean | undefined;
58
+ /**
59
+ * 开启输入框只读
60
+ */
61
+ readOnly?: boolean | undefined;
62
+ /**
63
+ * 设置展现形式
64
+ */
65
+ appearance?: HiBaseAppearanceEnum | undefined;
66
+ /**
67
+ * 设置输入框尺寸
68
+ */
69
+ size?: "sm" | "md" | "lg" | undefined;
70
+ } & {
71
+ invalid?: boolean | undefined;
72
+ } & React.RefAttributes<HTMLDivElement | null>>;
73
+ export declare type MockInputProps = HiBaseHTMLFieldProps<'div', {
74
+ /**
75
+ * 设置当前多选值
76
+ */
77
+ value?: React.ReactText;
78
+ /**
79
+ * 设置当前多选值默认值
80
+ */
81
+ defaultValue?: React.ReactText;
82
+ /**
83
+ * 多选值改变时的回调
84
+ */
85
+ onChange?: (value: React.ReactText, item: any) => void;
86
+ /**
87
+ * 是否可清空
88
+ */
89
+ clearable?: boolean;
90
+ /**
91
+ * 清除按钮展示的触发形态
92
+ */
93
+ clearableTrigger?: 'always' | 'hover';
94
+ /**
95
+ * 是否禁止使用
96
+ */
97
+ disabled?: boolean;
98
+ /**
99
+ * 自定义选择后触发器所展示的内容
100
+ */
101
+ displayRender?: (item: HiBaseDataItem) => React.ReactNode;
102
+ /**
103
+ * 输入框占位符
104
+ */
105
+ placeholder?: string;
106
+ /**
107
+ * 输入框后置内容
108
+ */
109
+ suffix?: React.ReactNode;
110
+ /**
111
+ * 点击 Input 时触发回调
112
+ */
113
+ onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
114
+ /**
115
+ * 展示数据源
116
+ */
117
+ data?: HiBaseDataItem[];
118
+ /**
119
+ * 是否聚焦
120
+ */
121
+ focused?: boolean;
122
+ /**
123
+ * 开启输入框只读
124
+ */
125
+ readOnly?: boolean;
126
+ /**
127
+ * 设置展现形式
128
+ */
129
+ appearance?: HiBaseAppearanceEnum;
130
+ /**
131
+ * 设置输入框尺寸
132
+ */
133
+ size?: 'sm' | 'md' | 'lg';
134
+ }>;
@@ -1,3 +1,5 @@
1
1
  import './styles/index.scss';
2
2
  export * from './Input';
3
3
  export { Input as default } from './Input';
4
+ export * from './use-input';
5
+ export * from './MockInput';
@@ -0,0 +1,78 @@
1
+ import React from 'react';
2
+ export declare const useInput: ({ name, autoFocus, disabled, readOnly, maxLength, placeholder, defaultValue, value: valueProp, onChange, onFocus, onBlur, trimValueOnBlur, type, clearElementRef, }: UseInputProps) => {
3
+ focused: boolean;
4
+ value: string;
5
+ tryChangeValue: (stateOrFunction: React.SetStateAction<string>, ...args: any[]) => void;
6
+ getInputProps: () => {
7
+ value: string;
8
+ onChange: (evt: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>, trim?: any) => void;
9
+ onFocus: (evt: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
10
+ onBlur: (event: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
11
+ name: string | undefined;
12
+ disabled: boolean;
13
+ readOnly: boolean;
14
+ autoFocus: boolean;
15
+ placeholder: string | undefined;
16
+ maxLength: number | undefined;
17
+ 'data-focused': "" | undefined;
18
+ };
19
+ };
20
+ export interface UseInputProps {
21
+ /**
22
+ * 开启输入框只读
23
+ */
24
+ readOnly?: boolean;
25
+ /**
26
+ * 是否禁用
27
+ */
28
+ disabled?: boolean;
29
+ /**
30
+ * 开启输入框自动聚焦
31
+ */
32
+ autoFocus?: boolean;
33
+ /**
34
+ * 输入框字段名称
35
+ */
36
+ name?: string;
37
+ /**
38
+ * 设置输入框的值
39
+ */
40
+ value?: string;
41
+ /**
42
+ * 设置输入框的默认值
43
+ */
44
+ defaultValue?: string;
45
+ /**
46
+ * 输入最大长度
47
+ */
48
+ maxLength?: number;
49
+ /**
50
+ * 再失焦时触发对值的 trim onChange 给用户
51
+ */
52
+ trimValueOnBlur?: boolean;
53
+ /**
54
+ * 输入框占位符
55
+ */
56
+ placeholder?: string;
57
+ /**
58
+ * 值改变时的回调
59
+ */
60
+ onChange?: (value: string, evt: React.ChangeEvent<any>) => void;
61
+ /**
62
+ * 输入框聚焦时的回调
63
+ */
64
+ onFocus?: (evt: React.FocusEvent<any>) => void;
65
+ /**
66
+ * 输入框失焦时的回调
67
+ */
68
+ onBlur?: (evt: React.FocusEvent<any>) => void;
69
+ /**
70
+ * 设置输入框类型,支持原生 input 的 type 属性所有值
71
+ */
72
+ type?: 'text' | 'id' | 'tel' | 'card' | 'amount' | 'email' | string;
73
+ /** 。暂不对外暴露
74
+ * @private
75
+ */
76
+ clearElementRef?: any;
77
+ }
78
+ export declare type useInputReturn = ReturnType<typeof useInput>;
@@ -17,7 +17,15 @@ export declare const pureCard: (val: string) => string;
17
17
  * 金额自动生成小数
18
18
  * @param {string} val 需要处理的值
19
19
  */
20
- export declare const formatAmount: (val: string) => string;
20
+ export declare const formatAmount: (val: string, fill?: boolean) => string;
21
21
  export declare const pureAmount: (val: string) => string;
22
22
  export declare const formatEmail: (val: string) => string;
23
23
  export declare const pureEmail: (val: string) => string;
24
+ /**
25
+ * 输入规则
26
+ */
27
+ export declare const format: (val: string, type: string) => string;
28
+ /**
29
+ * 净化规则
30
+ */
31
+ export declare const pure: (val: string, type: string) => string;