@hi-ui/input 4.0.0-alpha.8 → 4.0.0-beta.10
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/README.md +79 -7
- package/lib/cjs/Input.js +112 -96
- package/lib/cjs/MockInput.js +153 -0
- package/lib/cjs/index.js +6 -1
- package/lib/cjs/styles/index.scss.js +1 -2
- package/lib/cjs/use-input.js +128 -0
- package/lib/cjs/utils/index.js +191 -0
- package/lib/esm/Input.js +105 -88
- package/lib/esm/MockInput.js +131 -0
- package/lib/esm/index.js +2 -1
- package/lib/esm/styles/index.scss.js +2 -3
- package/lib/esm/use-input.js +118 -0
- package/lib/esm/utils/index.js +175 -0
- package/lib/types/Input.d.ts +29 -38
- package/lib/types/MockInput.d.ts +134 -0
- package/lib/types/index.d.ts +2 -0
- package/lib/types/use-input.d.ts +78 -0
- package/lib/types/utils/index.d.ts +9 -1
- package/package.json +14 -11
- package/lib/cjs/Input.js.map +0 -1
- package/lib/cjs/index.js.map +0 -1
- package/lib/cjs/styles/index.scss.js.map +0 -1
- package/lib/esm/Input.js.map +0 -1
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/styles/index.scss.js.map +0 -1
package/README.md
CHANGED
@@ -1,11 +1,83 @@
|
|
1
|
-
#
|
1
|
+
# Input 输入框
|
2
2
|
|
3
|
-
|
3
|
+
用来接收文本型内容的组件
|
4
4
|
|
5
|
-
##
|
5
|
+
## 何时使用
|
6
6
|
|
7
|
-
|
8
|
-
const Input = require('@hi-ui/input');
|
7
|
+
用户需要通过键盘输入内容时
|
9
8
|
|
10
|
-
|
11
|
-
|
9
|
+
常见于表单,作为表单的组件类型之一
|
10
|
+
|
11
|
+
## 使用示例
|
12
|
+
|
13
|
+
<!-- Inject Stories -->
|
14
|
+
|
15
|
+
## Input Props
|
16
|
+
|
17
|
+
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
|
18
|
+
| ---------------- | ------------------------------------------------- | ----------------------------- | ---------------------------------------------------------------------- | ------- |
|
19
|
+
| value | 设置输入框的值 | string | - | - |
|
20
|
+
| defaultValue | 设置输入框的默认值 | string | - | - |
|
21
|
+
| type | 设置输入框类型 | string | 'text' \| 'textarea' \| 'id' \| 'tel' \| 'card' \| 'amount' \| 'email' | 'text' |
|
22
|
+
| prepend | 输入框前置外部内容 | ReactNode | - | - |
|
23
|
+
| append | 输入框后置外部内容 | ReactNode | - | - |
|
24
|
+
| disabled | 是否禁用 | boolean | true \| false | false |
|
25
|
+
| clearable | 是否可清空 | boolean | true \| false | false |
|
26
|
+
| placeholder | 输入框占位符 | string | - | - |
|
27
|
+
| readOnly | 开启输入框只读 | boolean | true \| false | false |
|
28
|
+
| autoFocus | 开启输入框自动聚焦 | boolean | true \| false | false |
|
29
|
+
| maxLength | 输入最大长度 | number | - | - |
|
30
|
+
| prefix | 输入框内置内容 | ReactNode | - | - |
|
31
|
+
| suffix | 输入框后置内容 | ReactNode | - | - |
|
32
|
+
| trimValueOnBlur | 开启失焦时触发对值的 trim,将触发 onChange 给用户 | boolean | true \| false | false |
|
33
|
+
| clearableTrigger | 清除按钮展示的触发形态 | string | 'always' | 'hover' | 'hover' |
|
34
|
+
| appearance | 设置展现形式 | 'line' \| 'unset' \| 'filled' | 'line' |
|
35
|
+
| size | 设置尺寸 | string | 'sm' \| 'md' \| 'lg' | 'md' |
|
36
|
+
|
37
|
+
## Input Events
|
38
|
+
|
39
|
+
| 名称 | 说明 | 类型 | 参数 |
|
40
|
+
| -------- | -------------- | ------------------------------------------------------- | --------------------- |
|
41
|
+
| onChange | 值改变时的回调 | (event: React.ChangeEvent<HTMLTextAreaElement>) => void | event: input 事件对象 |
|
42
|
+
|
43
|
+
## TextArea Props
|
44
|
+
|
45
|
+
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
|
46
|
+
| --------------- | ------------------------------------------------- | ----------------------------- | -------------------- | ------ |
|
47
|
+
| value | 设置输入框的值 | string | - | - |
|
48
|
+
| defaultValue | 设置输入框的默认值 | string | - | - |
|
49
|
+
| appearance | 设置展现形式 | 'line' \| 'unset' \| 'filled' | 'line' |
|
50
|
+
| size | 设置尺寸 | string | 'sm' \| 'md' \| 'lg' | 'md' |
|
51
|
+
| disabled | 是否禁用 | boolean | true \| false | false |
|
52
|
+
| placeholder | 输入框占位符 | string | - | - |
|
53
|
+
| readOnly | 开启输入框只读 | boolean | true \| false | false |
|
54
|
+
| autoFocus | 开启输入框自动聚焦 | boolean | true \| false | false |
|
55
|
+
| maxLength | 输入最大长度 | number | - | - |
|
56
|
+
| trimValueOnBlur | 开启失焦时触发对值的 trim,将触发 onChange 给用户 | boolean | true \| false | false |
|
57
|
+
| rows | 设置文本域行数,超出触发滚动 | number | - | - |
|
58
|
+
|
59
|
+
## TextArea Events
|
60
|
+
|
61
|
+
| 名称 | 说明 | 类型 | 参数 |
|
62
|
+
| -------- | -------------- | ------------------------------------------------------- | ------------------------ |
|
63
|
+
| onChange | 值改变时的回调 | (event: React.ChangeEvent<HTMLTextAreaElement>) => void | event: textarea 事件对象 |
|
64
|
+
|
65
|
+
## CHANGELOG
|
66
|
+
|
67
|
+
| 参数 | 变更类型 | 变更内容 | 解决的问题 |
|
68
|
+
| ---------------- | ------------------------------- | --------------------------------- | ---------------------------------------------------------------------- |
|
69
|
+
| propName | feature \| deprecated \| update | 变更了什么 | 之前是什么样子,解决什么问题 |
|
70
|
+
| ---- | ---- | ---- | ---- |
|
71
|
+
| bordered | deprecated | 字段 `bordered` => `appearance` | 对于 Picker 类型的组件,统一使用 appearance 设置外形(线\面\无边框)值 |
|
72
|
+
| appearance | feature | - | 统一支持适配 UI:线性\面性\无边框 |
|
73
|
+
| prepend | update | 字段:prepend -> prepend + prefix | 强化支持 Input 内置外置元素组合 |
|
74
|
+
| append | update | 字段 -> append + suffix | 强化支持 Input 内置外置元素组合 |
|
75
|
+
| prefix | feature | 字段:prepend -> prepend + prefix | 强化支持 Input 内置元素 |
|
76
|
+
| suffix | feature | 字段 -> append + suffix | 强化支持 Input 内置元素 |
|
77
|
+
| readOnly | feature | - | 强化支持 Input 功能 |
|
78
|
+
| autoFocus | feature | - | 强化支持 Input 功能 |
|
79
|
+
| maxLength | feature | - | 强化支持 Input 功能 |
|
80
|
+
| trimValueOnBlur | feature | - | 强化支持 Input 功能 |
|
81
|
+
| clearableTrigger | feature | - | 强化支持 Input 清空内容功能 |
|
82
|
+
| size | feature | - | UI 适配不同 Size |
|
83
|
+
| TextArea | feature | 组件拆分 | 1. 拆解 api 功能及类型,职责分明 2. 减少用户使用困惑; |
|
package/lib/cjs/Input.js
CHANGED
@@ -23,12 +23,12 @@ var classname = require('@hi-ui/classname');
|
|
23
23
|
|
24
24
|
var env = require('@hi-ui/env');
|
25
25
|
|
26
|
-
var useUncontrolledState = require('@hi-ui/use-uncontrolled-state');
|
27
|
-
|
28
26
|
var useMergeRefs = require('@hi-ui/use-merge-refs');
|
29
27
|
|
30
28
|
var icons = require('@hi-ui/icons');
|
31
29
|
|
30
|
+
var useInput = require('./use-input.js');
|
31
|
+
|
32
32
|
function _interopDefaultLegacy(e) {
|
33
33
|
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
34
34
|
'default': e
|
@@ -37,11 +37,16 @@ function _interopDefaultLegacy(e) {
|
|
37
37
|
|
38
38
|
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
39
39
|
|
40
|
-
var
|
41
|
-
|
42
|
-
var _prefix = classname.getPrefixCls(_role);
|
40
|
+
var _prefix = classname.getPrefixCls('input');
|
43
41
|
/**
|
44
|
-
*
|
42
|
+
* 输入框
|
43
|
+
*
|
44
|
+
* @TODO:
|
45
|
+
* 1. size api 确认
|
46
|
+
* 2. 修改类名结构
|
47
|
+
* 3. 支持带数字展示
|
48
|
+
* 4. InputGroup 模式支持
|
49
|
+
* 5. 手动聚焦支持额外配置
|
45
50
|
*/
|
46
51
|
|
47
52
|
|
@@ -49,135 +54,147 @@ var Input = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
|
49
54
|
var _a$prefixCls = _a.prefixCls,
|
50
55
|
prefixCls = _a$prefixCls === void 0 ? _prefix : _a$prefixCls,
|
51
56
|
_a$role = _a.role,
|
52
|
-
role = _a$role === void 0 ?
|
57
|
+
role = _a$role === void 0 ? 'input' : _a$role,
|
53
58
|
className = _a.className,
|
54
59
|
style = _a.style,
|
55
|
-
_a$autoFocus = _a.autoFocus,
|
56
|
-
autoFocus = _a$autoFocus === void 0 ? false : _a$autoFocus,
|
57
|
-
_a$disabled = _a.disabled,
|
58
|
-
disabled = _a$disabled === void 0 ? false : _a$disabled,
|
59
|
-
_a$readOnly = _a.readOnly,
|
60
|
-
readOnly = _a$readOnly === void 0 ? false : _a$readOnly,
|
61
|
-
name = _a.name,
|
62
|
-
maxLength = _a.maxLength,
|
63
|
-
_a$type = _a.type,
|
64
|
-
type = _a$type === void 0 ? 'text' : _a$type,
|
65
60
|
_a$size = _a.size,
|
66
|
-
size = _a$size === void 0 ? '
|
61
|
+
size = _a$size === void 0 ? 'md' : _a$size,
|
67
62
|
_a$appearance = _a.appearance,
|
68
|
-
appearance = _a$appearance === void 0 ? '
|
69
|
-
placeholder = _a.placeholder,
|
63
|
+
appearance = _a$appearance === void 0 ? 'line' : _a$appearance,
|
70
64
|
prepend = _a.prepend,
|
71
65
|
append = _a.append,
|
72
66
|
prefix = _a.prefix,
|
73
67
|
suffix = _a.suffix,
|
74
|
-
_a$defaultValue = _a.defaultValue,
|
75
|
-
defaultValue = _a$defaultValue === void 0 ? '' : _a$defaultValue,
|
76
|
-
valueProp = _a.value,
|
77
|
-
onChange = _a.onChange,
|
78
|
-
onFocus = _a.onFocus,
|
79
|
-
onBlur = _a.onBlur,
|
80
68
|
_a$clearableTrigger = _a.clearableTrigger,
|
81
69
|
clearableTrigger = _a$clearableTrigger === void 0 ? 'hover' : _a$clearableTrigger,
|
82
70
|
_a$clearable = _a.clearable,
|
83
71
|
clearable = _a$clearable === void 0 ? false : _a$clearable,
|
84
|
-
|
72
|
+
_a$invalid = _a.invalid,
|
73
|
+
invalid = _a$invalid === void 0 ? false : _a$invalid,
|
74
|
+
name = _a.name,
|
75
|
+
autoFocus = _a.autoFocus,
|
76
|
+
disabled = _a.disabled,
|
77
|
+
readOnly = _a.readOnly,
|
78
|
+
maxLength = _a.maxLength,
|
79
|
+
placeholder = _a.placeholder,
|
80
|
+
defaultValue = _a.defaultValue,
|
81
|
+
valueProp = _a.value,
|
82
|
+
onChange = _a.onChange,
|
83
|
+
onFocus = _a.onFocus,
|
84
|
+
onBlur = _a.onBlur,
|
85
|
+
trimValueOnBlur = _a.trimValueOnBlur,
|
86
|
+
onClear = _a.onClear,
|
87
|
+
type = _a.type,
|
88
|
+
containerRef = _a.containerRef,
|
89
|
+
rest = tslib.__rest(_a, ["prefixCls", "role", "className", "style", "size", "appearance", "prepend", "append", "prefix", "suffix", "clearableTrigger", "clearable", "invalid", "name", "autoFocus", "disabled", "readOnly", "maxLength", "placeholder", "defaultValue", "value", "onChange", "onFocus", "onBlur", "trimValueOnBlur", "onClear", "type", "containerRef"]); // @TODO: 临时方案,后面迁移至 InputGroup
|
90
|
+
|
91
|
+
|
92
|
+
var _useMemo = React.useMemo(function () {
|
93
|
+
var shouldUnset = [false, false]; // @ts-ignore
|
94
|
+
// @ts-ignore
|
95
|
+
|
96
|
+
if ( /*#__PURE__*/React.isValidElement(prepend) && ['Select', 'Button'].includes(prepend.type.HiName)) {
|
97
|
+
shouldUnset[0] = true;
|
98
|
+
} // @ts-ignore
|
99
|
+
// @ts-ignore
|
85
100
|
|
86
|
-
|
101
|
+
|
102
|
+
if ( /*#__PURE__*/React.isValidElement(append) && ['Select', 'Button'].includes(append.type.HiName)) {
|
103
|
+
shouldUnset[1] = true;
|
104
|
+
}
|
105
|
+
|
106
|
+
return shouldUnset;
|
107
|
+
}, [prepend, append]),
|
108
|
+
unsetPrepend = _useMemo[0],
|
109
|
+
unsetAppend = _useMemo[1];
|
110
|
+
|
111
|
+
var inputElementRef = React.useRef(null);
|
87
112
|
var proxyOnChange = React.useCallback(function (value, evt) {
|
88
113
|
if (!onChange) return;
|
89
|
-
onChangeMock(onChange, evt,
|
114
|
+
onChangeMock(onChange, evt, inputElementRef.current, value);
|
90
115
|
}, [onChange]);
|
116
|
+
var clearElementRef = React.useRef(null);
|
117
|
+
|
118
|
+
var _useInput = useInput.useInput({
|
119
|
+
clearElementRef: clearElementRef,
|
120
|
+
name: name,
|
121
|
+
autoFocus: autoFocus,
|
122
|
+
disabled: disabled,
|
123
|
+
readOnly: readOnly,
|
124
|
+
maxLength: maxLength,
|
125
|
+
placeholder: placeholder,
|
126
|
+
defaultValue: defaultValue,
|
127
|
+
value: valueProp,
|
128
|
+
onChange: proxyOnChange,
|
129
|
+
onFocus: onFocus,
|
130
|
+
onBlur: onBlur,
|
131
|
+
trimValueOnBlur: trimValueOnBlur,
|
132
|
+
type: type
|
133
|
+
}),
|
134
|
+
tryChangeValue = _useInput.tryChangeValue,
|
135
|
+
focused = _useInput.focused,
|
136
|
+
value = _useInput.value,
|
137
|
+
getInputProps = _useInput.getInputProps;
|
91
138
|
|
92
|
-
var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultValue, valueProp, proxyOnChange),
|
93
|
-
value = _useUncontrolledState[0],
|
94
|
-
tryChangeValue = _useUncontrolledState[1];
|
95
|
-
|
96
|
-
var handleChange = React.useCallback(function (evt) {
|
97
|
-
var nextValue = evt.target.value;
|
98
|
-
tryChangeValue(nextValue, evt);
|
99
|
-
}, [tryChangeValue]);
|
100
|
-
|
101
|
-
var _useState = React.useState(autoFocus),
|
102
|
-
focused = _useState[0],
|
103
|
-
setFocused = _useState[1];
|
104
|
-
|
105
|
-
var handleFocus = React.useCallback(function (evt) {
|
106
|
-
setFocused(true);
|
107
|
-
onFocus === null || onFocus === void 0 ? void 0 : onFocus(evt);
|
108
|
-
}, [onFocus]);
|
109
|
-
var handleBlur = React.useCallback(function (event) {
|
110
|
-
setFocused(false);
|
111
|
-
onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
|
112
|
-
}, [onBlur]);
|
113
139
|
var focus = React.useCallback(function () {
|
114
140
|
var _a;
|
115
141
|
|
116
|
-
(_a =
|
142
|
+
(_a = inputElementRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
117
143
|
}, []);
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
var nativeInputProps = React.useMemo(function () {
|
123
|
-
return {
|
124
|
-
name: name,
|
125
|
-
disabled: disabled,
|
126
|
-
readOnly: readOnly,
|
127
|
-
autoFocus: autoFocus,
|
128
|
-
placeholder: placeholder,
|
129
|
-
maxLength: maxLength
|
130
|
-
};
|
131
|
-
}, [disabled, readOnly, autoFocus, placeholder, maxLength, name]);
|
132
|
-
|
133
|
-
var _useState2 = React.useState(false),
|
134
|
-
hover = _useState2[0],
|
135
|
-
setHover = _useState2[1]; // 在开启 clearable 下展示 清除内容按钮,可点击进行内容清楚
|
144
|
+
|
145
|
+
var _useState = React.useState(false),
|
146
|
+
hover = _useState[0],
|
147
|
+
setHover = _useState[1]; // 在开启 clearable 下展示 清除内容按钮,可点击进行内容清楚
|
136
148
|
|
137
149
|
|
138
150
|
var showClearableIcon = clearable && !!value && !disabled;
|
139
|
-
var
|
140
|
-
|
151
|
+
var mergedRef = useMergeRefs.useMergeRefs(ref, inputElementRef);
|
152
|
+
var cls = classname.cx(prefixCls, className, prefixCls + "--size-" + size, prefixCls + "--appearance-" + appearance);
|
153
|
+
var outerCls = classname.cx(prefixCls + "__outer", prepend && prefixCls + "__outer--prepend", prepend && unsetPrepend && prefixCls + "__outer--prepend-unset", append && prefixCls + "__outer--append", append && unsetAppend && prefixCls + "__outer--append-unset");
|
154
|
+
return /*#__PURE__*/React__default["default"].createElement("div", {
|
141
155
|
role: role,
|
142
156
|
className: cls,
|
143
|
-
style: style
|
144
|
-
|
157
|
+
style: style,
|
158
|
+
ref: containerRef
|
159
|
+
}, /*#__PURE__*/React__default["default"].createElement("div", {
|
160
|
+
className: outerCls
|
161
|
+
}, prepend ? /*#__PURE__*/React__default["default"].createElement("div", {
|
145
162
|
className: prefixCls + "__prepend"
|
146
|
-
}, prepend) : null, /*#__PURE__*/React__default[
|
147
|
-
className: classname.cx(prefixCls + "__inner", prefix && prefixCls + "__inner--prefix", suffix && prefixCls + "__inner--suffix", focused && "focused", disabled &&
|
163
|
+
}, prepend) : null, /*#__PURE__*/React__default["default"].createElement("div", {
|
164
|
+
className: classname.cx(prefixCls + "__inner", prefix && prefixCls + "__inner--prefix", suffix && prefixCls + "__inner--suffix", focused && prefixCls + "__inner--focused", disabled && prefixCls + "__inner--disabled", readOnly && prefixCls + "__inner--readonly", invalid && prefixCls + "__inner--invalid"),
|
148
165
|
onMouseOver: function onMouseOver(e) {
|
149
166
|
setHover(true);
|
150
167
|
},
|
151
168
|
onMouseLeave: function onMouseLeave(e) {
|
152
169
|
setHover(false);
|
153
170
|
}
|
154
|
-
}, prefix ? /*#__PURE__*/React__default[
|
171
|
+
}, prefix ? /*#__PURE__*/React__default["default"].createElement("span", {
|
155
172
|
className: prefixCls + "__prefix"
|
156
|
-
}, prefix) : null, /*#__PURE__*/React__default[
|
157
|
-
ref:
|
158
|
-
className:
|
159
|
-
|
160
|
-
value: value,
|
161
|
-
onChange: handleChange,
|
162
|
-
onFocus: handleFocus,
|
163
|
-
onBlur: handleBlur
|
164
|
-
}, rest, nativeInputProps)), suffix || showClearableIcon ? /*#__PURE__*/React__default['default'].createElement("span", {
|
173
|
+
}, prefix) : null, /*#__PURE__*/React__default["default"].createElement("input", Object.assign({
|
174
|
+
ref: mergedRef,
|
175
|
+
className: prefixCls + "__text"
|
176
|
+
}, getInputProps(), rest)), suffix || showClearableIcon ? /*#__PURE__*/React__default["default"].createElement("span", {
|
165
177
|
className: prefixCls + "__suffix"
|
166
|
-
}, showClearableIcon ? /*#__PURE__*/React__default[
|
167
|
-
|
178
|
+
}, showClearableIcon ? /*#__PURE__*/React__default["default"].createElement("span", {
|
179
|
+
ref: clearElementRef,
|
180
|
+
className: classname.cx(prefixCls + "__clear", (clearableTrigger === 'always' || hover) && prefixCls + "__clear--active"),
|
168
181
|
role: "button",
|
169
182
|
tabIndex: -1,
|
170
|
-
onClick:
|
171
|
-
|
183
|
+
onClick: function onClick(evt) {
|
184
|
+
tryChangeValue('', evt);
|
185
|
+
onClear === null || onClear === void 0 ? void 0 : onClear();
|
186
|
+
focus();
|
187
|
+
}
|
188
|
+
}, /*#__PURE__*/React__default["default"].createElement(icons.CloseCircleFilled, null)) : null, suffix) : null), append ? /*#__PURE__*/React__default["default"].createElement("div", {
|
172
189
|
className: prefixCls + "__append"
|
173
|
-
}, append) : null);
|
190
|
+
}, append) : null));
|
174
191
|
});
|
175
192
|
|
176
193
|
if (env.__DEV__) {
|
177
194
|
Input.displayName = 'Input';
|
178
195
|
}
|
179
196
|
/**
|
180
|
-
*
|
197
|
+
* 模拟伪装目标事件 target
|
181
198
|
*
|
182
199
|
* @param target
|
183
200
|
* @param evt
|
@@ -188,24 +205,23 @@ if (env.__DEV__) {
|
|
188
205
|
|
189
206
|
|
190
207
|
function onChangeMock(onChange, evt, target, targetValue) {
|
191
|
-
var event = evt; // 点击 clearIcon
|
208
|
+
var event = evt; // 点击 clearIcon 或者 失焦 trim 时,都会代理 onChange 的事件对象 target 指向 input.target
|
192
209
|
|
193
|
-
if (evt.type
|
210
|
+
if (evt.type !== 'change') {
|
194
211
|
if (!target) return;
|
195
212
|
var originalTargetValue = target.value;
|
196
213
|
event = Object.create(evt);
|
197
214
|
event.target = target;
|
198
215
|
event.currentTarget = target;
|
199
216
|
target.value = targetValue;
|
200
|
-
onChange(event); // 重置为之前值
|
217
|
+
onChange(event, targetValue); // 重置为之前值
|
201
218
|
|
202
219
|
target.value = originalTargetValue;
|
203
220
|
return;
|
204
221
|
}
|
205
222
|
|
206
|
-
onChange(event);
|
223
|
+
onChange(event, targetValue);
|
207
224
|
}
|
208
225
|
|
209
226
|
exports.Input = Input;
|
210
227
|
exports.onChangeMock = onChangeMock;
|
211
|
-
//# sourceMappingURL=Input.js.map
|
@@ -0,0 +1,153 @@
|
|
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
|
+
'use strict';
|
11
|
+
|
12
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
13
|
+
|
14
|
+
Object.defineProperty(exports, '__esModule', {
|
15
|
+
value: true
|
16
|
+
});
|
17
|
+
|
18
|
+
var tslib = require('tslib');
|
19
|
+
|
20
|
+
var React = require('react');
|
21
|
+
|
22
|
+
var classname = require('@hi-ui/classname');
|
23
|
+
|
24
|
+
var env = require('@hi-ui/env');
|
25
|
+
|
26
|
+
var useUncontrolledState = require('@hi-ui/use-uncontrolled-state');
|
27
|
+
|
28
|
+
var icons = require('@hi-ui/icons');
|
29
|
+
|
30
|
+
function _interopDefaultLegacy(e) {
|
31
|
+
return e && _typeof(e) === 'object' && 'default' in e ? e : {
|
32
|
+
'default': e
|
33
|
+
};
|
34
|
+
}
|
35
|
+
|
36
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
37
|
+
|
38
|
+
var _role = 'mock-input';
|
39
|
+
|
40
|
+
var _prefix = classname.getPrefixCls(_role);
|
41
|
+
|
42
|
+
var NOOP_VALUE = '';
|
43
|
+
var NOOP_ARRAY = [];
|
44
|
+
/**
|
45
|
+
* 支持自定义渲染输入框内容,暂时仅供内部 Picker 类组件使用,不对外提供
|
46
|
+
*/
|
47
|
+
|
48
|
+
var MockInput = /*#__PURE__*/React.forwardRef(function (_a, ref) {
|
49
|
+
var _a$prefixCls = _a.prefixCls,
|
50
|
+
prefixCls = _a$prefixCls === void 0 ? _prefix : _a$prefixCls,
|
51
|
+
_a$role = _a.role,
|
52
|
+
role = _a$role === void 0 ? _role : _a$role,
|
53
|
+
className = _a.className,
|
54
|
+
_a$data = _a.data,
|
55
|
+
data = _a$data === void 0 ? NOOP_ARRAY : _a$data,
|
56
|
+
_a$defaultValue = _a.defaultValue,
|
57
|
+
defaultValue = _a$defaultValue === void 0 ? NOOP_VALUE : _a$defaultValue,
|
58
|
+
valueProp = _a.value,
|
59
|
+
onChange = _a.onChange,
|
60
|
+
placeholder = _a.placeholder,
|
61
|
+
_a$disabled = _a.disabled,
|
62
|
+
disabled = _a$disabled === void 0 ? false : _a$disabled,
|
63
|
+
_a$clearable = _a.clearable,
|
64
|
+
clearable = _a$clearable === void 0 ? false : _a$clearable,
|
65
|
+
_a$focused = _a.focused,
|
66
|
+
focused = _a$focused === void 0 ? false : _a$focused,
|
67
|
+
_a$invalid = _a.invalid,
|
68
|
+
invalid = _a$invalid === void 0 ? false : _a$invalid,
|
69
|
+
_a$readOnly = _a.readOnly,
|
70
|
+
readOnly = _a$readOnly === void 0 ? false : _a$readOnly,
|
71
|
+
_a$size = _a.size,
|
72
|
+
size = _a$size === void 0 ? 'md' : _a$size,
|
73
|
+
_a$appearance = _a.appearance,
|
74
|
+
appearance = _a$appearance === void 0 ? 'line' : _a$appearance,
|
75
|
+
_a$clearableTrigger = _a.clearableTrigger,
|
76
|
+
clearableTrigger = _a$clearableTrigger === void 0 ? 'hover' : _a$clearableTrigger,
|
77
|
+
displayRender = _a.displayRender,
|
78
|
+
suffix = _a.suffix,
|
79
|
+
_onMouseOver = _a.onMouseOver,
|
80
|
+
_onMouseLeave = _a.onMouseLeave,
|
81
|
+
rest = tslib.__rest(_a, ["prefixCls", "role", "className", "data", "defaultValue", "value", "onChange", "placeholder", "disabled", "clearable", "focused", "invalid", "readOnly", "size", "appearance", "clearableTrigger", "displayRender", "suffix", "onMouseOver", "onMouseLeave"]);
|
82
|
+
|
83
|
+
var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultValue, valueProp, onChange),
|
84
|
+
value = _useUncontrolledState[0],
|
85
|
+
tryChangeValue = _useUncontrolledState[1];
|
86
|
+
|
87
|
+
var displayItem = React.useMemo(function () {
|
88
|
+
if (value === '') return null;
|
89
|
+
var displayItem = data.find(function (item) {
|
90
|
+
return item.id === value;
|
91
|
+
});
|
92
|
+
return displayItem || null;
|
93
|
+
}, [value, data]);
|
94
|
+
var displayValue = React.useMemo(function () {
|
95
|
+
if (!displayItem) return '';
|
96
|
+
|
97
|
+
if (displayRender) {
|
98
|
+
return displayRender(displayItem);
|
99
|
+
}
|
100
|
+
|
101
|
+
return displayItem.title;
|
102
|
+
}, [displayItem, displayRender]);
|
103
|
+
var handleClear = React.useCallback(function (evt) {
|
104
|
+
if (disabled) return;
|
105
|
+
evt.stopPropagation();
|
106
|
+
tryChangeValue(NOOP_VALUE, displayItem);
|
107
|
+
}, [tryChangeValue, disabled, displayItem]);
|
108
|
+
|
109
|
+
var _useState = React.useState(false),
|
110
|
+
hover = _useState[0],
|
111
|
+
setHover = _useState[1];
|
112
|
+
|
113
|
+
var trySetHover = React.useCallback(function (hovered) {
|
114
|
+
if (disabled) return;
|
115
|
+
setHover(hovered);
|
116
|
+
}, [disabled]);
|
117
|
+
var hasValue = !!displayValue; // 在开启 clearable 下展示 清除内容按钮,可点击进行内容清除
|
118
|
+
|
119
|
+
var showClearableIcon = React.useMemo(function () {
|
120
|
+
return clearable && hasValue && !disabled && (clearableTrigger === 'always' || hover);
|
121
|
+
}, [clearable, hasValue, disabled, clearableTrigger, hover]);
|
122
|
+
var cls = classname.cx(prefixCls, className, prefixCls + "--appearance-" + appearance, prefixCls + "--size-" + size, focused && "focused", disabled && 'disabled', readOnly && 'readonly', invalid && 'invalid');
|
123
|
+
return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
|
124
|
+
ref: ref,
|
125
|
+
role: role,
|
126
|
+
className: cls,
|
127
|
+
onMouseOver: function onMouseOver(evt) {
|
128
|
+
trySetHover(true);
|
129
|
+
_onMouseOver === null || _onMouseOver === void 0 ? void 0 : _onMouseOver(evt);
|
130
|
+
},
|
131
|
+
onMouseLeave: function onMouseLeave(evt) {
|
132
|
+
trySetHover(false);
|
133
|
+
_onMouseLeave === null || _onMouseLeave === void 0 ? void 0 : _onMouseLeave(evt);
|
134
|
+
}
|
135
|
+
}, rest), hasValue ? /*#__PURE__*/React__default["default"].createElement("span", {
|
136
|
+
className: prefixCls + "__value"
|
137
|
+
}, displayValue) : /*#__PURE__*/React__default["default"].createElement("span", {
|
138
|
+
className: prefixCls + "__placeholder"
|
139
|
+
}, placeholder), suffix || showClearableIcon ? /*#__PURE__*/React__default["default"].createElement("span", {
|
140
|
+
className: prefixCls + "__suffix"
|
141
|
+
}, showClearableIcon ? /*#__PURE__*/React__default["default"].createElement("span", {
|
142
|
+
role: "button",
|
143
|
+
tabIndex: -1,
|
144
|
+
className: classname.cx(prefixCls + "__clear", 'active'),
|
145
|
+
onClick: handleClear
|
146
|
+
}, /*#__PURE__*/React__default["default"].createElement(icons.CloseCircleFilled, null)) : suffix) : null);
|
147
|
+
});
|
148
|
+
|
149
|
+
if (env.__DEV__) {
|
150
|
+
MockInput.displayName = 'MockInput';
|
151
|
+
}
|
152
|
+
|
153
|
+
exports.MockInput = MockInput;
|
package/lib/cjs/index.js
CHANGED
@@ -17,7 +17,12 @@ require('./styles/index.scss.js');
|
|
17
17
|
|
18
18
|
var Input = require('./Input.js');
|
19
19
|
|
20
|
+
var useInput = require('./use-input.js');
|
21
|
+
|
22
|
+
var MockInput = require('./MockInput.js');
|
23
|
+
|
20
24
|
exports.Input = Input.Input;
|
21
25
|
exports["default"] = Input.Input;
|
22
26
|
exports.onChangeMock = Input.onChangeMock;
|
23
|
-
|
27
|
+
exports.useInput = useInput.useInput;
|
28
|
+
exports.MockInput = MockInput.MockInput;
|