@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 CHANGED
@@ -1,11 +1,83 @@
1
- # `@hi-ui/input`
1
+ # Input 输入框
2
2
 
3
- > TODO: description
3
+ 用来接收文本型内容的组件
4
4
 
5
- ## Usage
5
+ ## 何时使用
6
6
 
7
- ```
8
- const Input = require('@hi-ui/input');
7
+ 用户需要通过键盘输入内容时
9
8
 
10
- // TODO: DEMONSTRATE API
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 _role = 'input';
41
-
42
- var _prefix = classname.getPrefixCls(_role);
40
+ var _prefix = classname.getPrefixCls('input');
43
41
  /**
44
- * TODO: What is Input
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 ? _role : _a$role,
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 ? 'sm' : _a$size,
61
+ size = _a$size === void 0 ? 'md' : _a$size,
67
62
  _a$appearance = _a.appearance,
68
- appearance = _a$appearance === void 0 ? 'outline' : _a$appearance,
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
- rest = tslib.__rest(_a, ["prefixCls", "role", "className", "style", "autoFocus", "disabled", "readOnly", "name", "maxLength", "type", "size", "appearance", "floatLabel", "placeholder", "prepend", "append", "prefix", "suffix", "defaultValue", "value", "onChange", "onFocus", "onBlur", "clearableTrigger", "clearable"]);
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
- var inputRef = React.useRef(null);
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, inputRef.current, value);
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 = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
142
+ (_a = inputElementRef.current) === null || _a === void 0 ? void 0 : _a.focus();
117
143
  }, []);
118
- var handleReset = React.useCallback(function (evt) {
119
- tryChangeValue('', evt);
120
- focus();
121
- }, [tryChangeValue, focus]);
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 cls = classname.cx(className, prefixCls + "__outer", prepend && prefixCls + "__outer--prepend", append && prefixCls + "__outer--append", prefixCls + "--appearance-" + appearance, prefixCls + "--size-" + size);
140
- return /*#__PURE__*/React__default['default'].createElement("div", {
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
- }, prepend ? /*#__PURE__*/React__default['default'].createElement("div", {
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['default'].createElement("div", {
147
- className: classname.cx(prefixCls + "__inner", prefix && prefixCls + "__inner--prefix", suffix && prefixCls + "__inner--suffix", focused && "focused", disabled && 'disabled', readOnly && 'readonly'),
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['default'].createElement("span", {
171
+ }, prefix ? /*#__PURE__*/React__default["default"].createElement("span", {
155
172
  className: prefixCls + "__prefix"
156
- }, prefix) : null, /*#__PURE__*/React__default['default'].createElement("input", Object.assign({
157
- ref: useMergeRefs.useMergeRefs(ref, inputRef),
158
- className: classname.cx(prefixCls, focused && "focused", disabled && 'disabled', readOnly && 'readonly'),
159
- type: type,
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['default'].createElement("span", {
167
- className: classname.cx(prefixCls + "__clear", (clearableTrigger === 'always' || hover) && 'active'),
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: handleReset
171
- }, /*#__PURE__*/React__default['default'].createElement(icons.CloseCircleFilled, null)) : null, suffix) : null), append ? /*#__PURE__*/React__default['default'].createElement("div", {
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
- * 伪造目标事件 target
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 时,代理 onChange 的事件对象 target 指向 input.target
208
+ var event = evt; // 点击 clearIcon 或者 失焦 trim 时,都会代理 onChange 的事件对象 target 指向 input.target
192
209
 
193
- if (evt.type === 'click') {
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
- //# sourceMappingURL=index.js.map
27
+ exports.useInput = useInput.useInput;
28
+ exports.MockInput = MockInput.MockInput;