@hi-ui/check-select 4.0.0-beta.7 → 4.0.0

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.
Files changed (38) hide show
  1. package/README.md +25 -25
  2. package/lib/cjs/CheckSelect.js +106 -93
  3. package/lib/cjs/context.js +1 -2
  4. package/lib/cjs/hooks/use-data.js +1 -2
  5. package/lib/cjs/hooks/use-flatten-data.js +1 -2
  6. package/lib/cjs/index.js +1 -2
  7. package/lib/cjs/styles/index.scss.js +3 -4
  8. package/lib/cjs/use-check-select.js +18 -17
  9. package/lib/cjs/utils/index.js +52 -0
  10. package/lib/esm/CheckSelect.js +91 -78
  11. package/lib/esm/context.js +1 -2
  12. package/lib/esm/hooks/use-data.js +1 -2
  13. package/lib/esm/hooks/use-flatten-data.js +1 -2
  14. package/lib/esm/index.js +1 -2
  15. package/lib/esm/styles/index.scss.js +4 -6
  16. package/lib/esm/use-check-select.js +19 -18
  17. package/lib/esm/utils/index.js +45 -0
  18. package/lib/types/CheckSelect.d.ts +8 -12
  19. package/lib/types/context.d.ts +4 -2
  20. package/lib/types/index.d.ts +1 -0
  21. package/lib/types/types.d.ts +9 -7
  22. package/lib/types/use-check-select.d.ts +7 -7
  23. package/lib/types/utils/index.d.ts +10 -0
  24. package/package.json +29 -29
  25. package/lib/cjs/CheckSelect.js.map +0 -1
  26. package/lib/cjs/context.js.map +0 -1
  27. package/lib/cjs/hooks/use-data.js.map +0 -1
  28. package/lib/cjs/hooks/use-flatten-data.js.map +0 -1
  29. package/lib/cjs/index.js.map +0 -1
  30. package/lib/cjs/styles/index.scss.js.map +0 -1
  31. package/lib/cjs/use-check-select.js.map +0 -1
  32. package/lib/esm/CheckSelect.js.map +0 -1
  33. package/lib/esm/context.js.map +0 -1
  34. package/lib/esm/hooks/use-data.js.map +0 -1
  35. package/lib/esm/hooks/use-flatten-data.js.map +0 -1
  36. package/lib/esm/index.js.map +0 -1
  37. package/lib/esm/styles/index.scss.js.map +0 -1
  38. package/lib/esm/use-check-select.js.map +0 -1
package/README.md CHANGED
@@ -16,30 +16,30 @@
16
16
 
17
17
  ## Props
18
18
 
19
- | 参数 | 说明 | 类型 | 可选值 | 默认值 |
20
- | ----------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | -------------------------------------------- | --------------------------------------------------------------------- |
21
- | data | 下拉框选项数据源 | DataItem[] \| groupDataItem[] | - | - |
22
- | fieldNames | 设置 data 中 id, title, disabled, children 对应的 key | object | - | { title: 'title', id: 'id',disabled:'disabled', children: 'children'} |
23
- | dataSource | 关键词搜索时,触发异步下拉框选项数据源 | DataSource (keyword: string) => (DataSource \| DataItem \| Promise) | - | - |
24
- | value | 被选中项的值 | ReactText[] | - | - |
25
- | defaultValue | 默认被选中项的值 | ReactText[] | - | - |
26
- | showCheckAll | 是否显示**全选**,只对多选生效 | boolean | true \| false | false |
27
- | showJustSelected | 是否显示**仅看已选**,只对多选生效 (3.0 新增) | boolean | true \| false | false |
28
- | searchable | 是否可以筛选 | boolean | true \| false | false |
29
- | filterOption | 第一个参数为输入的关键字,第二个为数据项,返回值为 true 时将出现在结果项。仅在 searchable 为 true 时有效 | (keyword: string, item: DataItem) => boolean | (keyword: string, item: DataItem) => boolean | - |
30
- | clearable | 是否可以清空 | boolean | true \| false | true |
31
- | disabled | 是否禁用 | boolean | true \| false | false |
32
- | placeholder | 输入框占位 | string | - | '请选择' |
33
- | searchPlaceholder | 搜索输入框占位 | string | - | '搜索' |
34
- | emptyContent | 设置选项为空时展示的内容 | ReactNode | - | '无匹配数据' |
35
- | loadingContent | 设置加载中时展示的内容 | ReactNode | - | '数据加载中...' |
36
- | optionWidth | 自定义下拉选项宽度 | number | - | |
37
- | renderExtraFooter | 自定义下拉菜单底部渲染 | () => ReactNode | - | 无内容 |
38
- | overlayClassName | 下拉根元素的类名称 | string | - | - |
39
- | onOverlayScroll | 下拉列表滚动时的回调 | function | - | - |
40
- | overlay | 自定义控制弹出层 popper 行为 | PopperOverlayProps | - | - |
41
- | render | 自定义渲染节点的 title 内容径 | (item: CheckSelectEventData, keyword: string) => React.ReactNode | - |
42
- | displayRender | 自定义选择后展示的内容 | (selectedItems: DataItem[]) => string | - | - |
19
+ | 参数 | 说明 | 类型 | 可选值 | 默认值 |
20
+ | ----------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------- | --------------------------------------------------------------------- |
21
+ | data | 下拉框选项数据源 | DataItem[] \| groupDataItem[] | - | - |
22
+ | fieldNames | 设置 data 中 id, title, disabled, children 对应的 key | object | - | { title: 'title', id: 'id',disabled:'disabled', children: 'children'} |
23
+ | dataSource | 关键词搜索时,触发异步下拉框选项数据源 | DataSource (keyword: string) => (DataSource \| DataItem \| Promise) | - | - |
24
+ | value | 被选中项的值 | ReactText[] | - | - |
25
+ | defaultValue | 默认被选中项的值 | ReactText[] | - | - |
26
+ | showCheckAll | 是否显示**全选**,只对多选生效 | boolean | true \| false | false |
27
+ | showJustSelected | 是否显示**仅看已选**,只对多选生效 (3.0 新增) | boolean | true \| false | false |
28
+ | searchable | 是否可以筛选 | boolean | true \| false | false |
29
+ | filterOption | 第一个参数为输入的关键字,第二个为数据项,返回值为 true 时将出现在结果项。仅在 searchable 为 true 时有效 | (keyword: string, item: DataItem) => boolean | (keyword: string, item: DataItem) => boolean | - |
30
+ | clearable | 是否可以清空 | boolean | true \| false | true |
31
+ | disabled | 是否禁用 | boolean | true \| false | false |
32
+ | placeholder | 输入框占位 | string | - | '请选择' |
33
+ | searchPlaceholder | 搜索输入框占位 | string | - | '搜索' |
34
+ | emptyContent | 设置选项为空时展示的内容 | ReactNode | - | '无匹配数据' |
35
+ | loadingContent | 设置加载中时展示的内容 | ReactNode | - | '数据加载中...' |
36
+ | optionWidth | 自定义下拉选项宽度 | number | - | |
37
+ | renderExtraFooter | 自定义下拉菜单底部渲染 | () => ReactNode | - | 无内容 |
38
+ | overlayClassName | 下拉根元素的类名称 | string | - | - |
39
+ | onOverlayScroll | 下拉列表滚动时的回调 | function | - | - |
40
+ | overlay | 自定义控制弹出层 popper 行为 | PopperOverlayProps | - | - |
41
+ | render | 自定义渲染节点的 title 内容径 | (item: CheckSelectItemEventData, keyword: string) => React.ReactNode | - |
42
+ | displayRender | 自定义选择后展示的内容 | (selectedItems: DataItem[]) => string | - | - |
43
43
 
44
44
  > 注意,如果发现下拉菜单跟随页面滚动,或者需要在其他弹层中触发 CheckSelect,请尝试使用 `overlay={ container: triggerNode.parentElement }` 将下拉弹层渲染节点固定在触发器的父元素中。
45
45
 
@@ -67,7 +67,7 @@
67
67
  | title | 下拉选择项标题 | string | - | - |
68
68
  | disabled | 是否禁用 | boolean | true \| false | false |
69
69
 
70
- ### CheckSelectEventData
70
+ ### CheckSelectItemEventData
71
71
 
72
72
  | 参数 | 说明 | 类型 | 可选值 | 默认值 |
73
73
  | -------- | -------------------------------- | ------- | ------------- | ------ |
@@ -2,7 +2,7 @@
2
2
  * @hi-ui/check-select
3
3
  * https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-select#readme
4
4
  *
5
- * Copyright (c) HIUI <mi-hiui@xiaomi.com>.
5
+ * Copyright (c) HiUI <mi-hiui@xiaomi.com>.
6
6
  *
7
7
  * This source code is licensed under the MIT license found in the
8
8
  * LICENSE file in the root directory of this source tree.
@@ -37,7 +37,7 @@ var tagInput = require('@hi-ui/tag-input');
37
37
 
38
38
  var typeAssertion = require('@hi-ui/type-assertion');
39
39
 
40
- var VirtualList = require('rc-virtual-list');
40
+ var VirtualList = require('@hi-ui/virtual-list');
41
41
 
42
42
  var picker = require('@hi-ui/picker');
43
43
 
@@ -47,11 +47,9 @@ var highlighter = require('@hi-ui/highlighter');
47
47
 
48
48
  var useToggle = require('@hi-ui/use-toggle');
49
49
 
50
- var times = require('@hi-ui/times');
51
-
52
50
  var funcUtils = require('@hi-ui/func-utils');
53
51
 
54
- var localeContext = require('@hi-ui/locale-context');
52
+ var core = require('@hi-ui/core');
55
53
 
56
54
  var useSearchMode = require('@hi-ui/use-search-mode');
57
55
 
@@ -59,6 +57,8 @@ require('@hi-ui/use-children');
59
57
 
60
58
  var useFlattenData = require('./hooks/use-flatten-data.js');
61
59
 
60
+ var index = require('./utils/index.js');
61
+
62
62
  function _interopDefaultLegacy(e) {
63
63
  return e && _typeof(e) === 'object' && 'default' in e ? e : {
64
64
  'default': e
@@ -102,6 +102,9 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
102
102
  itemHeight = _a$itemHeight === void 0 ? 40 : _a$itemHeight,
103
103
  _a$virtual = _a.virtual,
104
104
  virtual = _a$virtual === void 0 ? true : _a$virtual,
105
+ visible = _a.visible,
106
+ onOpen = _a.onOpen,
107
+ onClose = _a.onClose,
105
108
  appearance = _a.appearance,
106
109
  invalid = _a.invalid,
107
110
  dataSource = _a.dataSource,
@@ -112,14 +115,19 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
112
115
  onSearchProp = _a.onSearch,
113
116
  _a$fieldNames = _a.fieldNames,
114
117
  fieldNames = _a$fieldNames === void 0 ? DEFAULT_FIELD_NAMES : _a$fieldNames,
115
- rest = tslib.__rest(_a, ["prefixCls", "role", "className", "children", "disabled", "clearable", "wrap", "showCheckAll", "showOnlyShowChecked", "placeholder", "displayRender", "onSelect", "height", "itemHeight", "virtual", "onOpen", "onClose", "appearance", "invalid", "dataSource", "filterOption", "searchable", "render", "renderExtraFooter", "onSearch", "fieldNames"]);
118
+ rest = tslib.__rest(_a, ["prefixCls", "role", "className", "children", "disabled", "clearable", "showCheckAll", "showOnlyShowChecked", "placeholder", "displayRender", "onSelect", "height", "itemHeight", "virtual", "visible", "onOpen", "onClose", "appearance", "invalid", "dataSource", "filterOption", "searchable", "render", "renderExtraFooter", "onSearch", "fieldNames"]);
116
119
 
117
- var i18n = localeContext.useLocaleContext();
120
+ var i18n = core.useLocaleContext();
118
121
  var placeholder = typeAssertion.isUndef(placeholderProp) ? i18n.get('checkSelect.placeholder') : placeholderProp; // ************************** Picker ************************* //
119
122
 
120
- var _useToggle = useToggle.useToggle(),
121
- menuVisible = _useToggle[0],
122
- menuVisibleAction = _useToggle[1];
123
+ var _useUncontrolledToggl = useToggle.useUncontrolledToggle({
124
+ visible: visible,
125
+ disabled: disabled,
126
+ onOpen: onOpen,
127
+ onClose: onClose
128
+ }),
129
+ menuVisible = _useUncontrolledToggl[0],
130
+ menuVisibleAction = _useUncontrolledToggl[1];
123
131
 
124
132
  var displayRender = React.useCallback(function (item) {
125
133
  if (typeAssertion.isFunction(displayRenderProp)) {
@@ -127,34 +135,20 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
127
135
  }
128
136
 
129
137
  return item.title;
130
- }, [displayRenderProp]); // 搜索时临时选中缓存数据
131
-
132
- var _useState = React.useState([]),
133
- selectedItems = _useState[0],
134
- setSelectedItems = _useState[1];
135
-
136
- var onSelect = useLatest.useLatestCallback(function (value, item, shouldChecked) {
137
- onSelectProp === null || onSelectProp === void 0 ? void 0 : onSelectProp(value, item, shouldChecked);
138
-
139
- if (shouldChecked) {
140
- // TODO:as useCheckList
141
- setSelectedItems(function (prev) {
142
- return [].concat(prev, [item]);
143
- });
144
- }
145
- });
138
+ }, [displayRenderProp]);
146
139
 
147
140
  var _b = useCheckSelect.useCheckSelect(Object.assign(Object.assign({}, rest), {
148
141
  children: children,
149
142
  fieldNames: fieldNames,
150
- onSelect: onSelect
143
+ onSelect: onSelectProp
151
144
  })),
152
145
  rootProps = _b.rootProps,
153
146
  context$1 = tslib.__rest(_b, ["rootProps"]);
154
147
 
155
148
  var value = context$1.value,
156
149
  tryChangeValue = context$1.tryChangeValue,
157
- flattedData = context$1.flattedData; // ************************** 搜索 ************************* //
150
+ flattedData = context$1.flattedData,
151
+ checkedItems = context$1.checkedItems; // ************************** 搜索 ************************* //
158
152
 
159
153
  var _c = useSearchMode.useAsyncSearch({
160
154
  dataSource: dataSource,
@@ -199,10 +193,10 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
199
193
 
200
194
 
201
195
  var highlight = !!searchValue && searchMode === 'filter';
202
- var ret = highlight ? /*#__PURE__*/React__default['default'].createElement(Checkbox__default['default'], {
196
+ var ret = highlight ? /*#__PURE__*/React__default["default"].createElement(Checkbox__default["default"], {
203
197
  checked: node.checked,
204
198
  disabled: node.disabled
205
- }, /*#__PURE__*/React__default['default'].createElement(highlighter.Highlighter, {
199
+ }, /*#__PURE__*/React__default["default"].createElement(highlighter.Highlighter, {
206
200
  keyword: searchValue
207
201
  }, node.title)) : true;
208
202
  return ret;
@@ -210,67 +204,79 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
210
204
  var shouldUseSearch = !!searchValue && !hasError;
211
205
  var showData = React.useMemo(function () {
212
206
  return shouldUseSearch ? stateInSearch.data : flattedData;
213
- }, [shouldUseSearch, flattedData, stateInSearch.data]); // 下拉菜单不能合并(因为树形数据,不知道是第几级)
207
+ }, [shouldUseSearch, flattedData, stateInSearch.data]); // 根据 id 进行合并,注意必须是扁平数据
214
208
 
215
209
  var mergedData = React.useMemo(function () {
216
- var nextData = selectedItems.concat(flattedData);
210
+ var nextData = checkedItems.concat(flattedData);
217
211
  return arrayUtils.uniqBy(nextData, 'id');
218
- }, [selectedItems, flattedData]);
212
+ }, [checkedItems, flattedData]);
219
213
 
220
- var _useState2 = React.useState(null),
221
- filterItems = _useState2[0],
222
- setFilterItems = _useState2[1];
214
+ var _useState = React.useState(null),
215
+ filterItems = _useState[0],
216
+ setFilterItems = _useState[1];
223
217
 
224
218
  var dropdownItems = filterItems || showData;
219
+ var activeExpandable = showOnlyShowChecked && !!filterItems && menuVisible;
225
220
 
226
221
  var _useMemo = React.useMemo(function () {
227
- var dropdownIds = dropdownItems.filter(function (item) {
228
- return !('groupTitle' in item);
229
- }).map(function (_ref) {
230
- var id = _ref.id;
231
- return id;
232
- });
233
- var dropdownIdsSet = new Set(dropdownIds);
234
- var hasValue = false;
235
- value.forEach(function (id) {
236
- if (dropdownIdsSet.has(id)) {
237
- hasValue = true;
238
- dropdownIdsSet["delete"](id);
239
- }
240
- });
241
- return [hasValue && dropdownIdsSet.size === 0, hasValue && dropdownIdsSet.size > 0];
222
+ return index.getAllCheckedStatus(dropdownItems, value, index.isOption);
242
223
  }, [dropdownItems, value]),
243
- allChecked = _useMemo[0],
244
- indeterminate = _useMemo[1];
224
+ showAllChecked = _useMemo[0],
225
+ showIndeterminate = _useMemo[1];
245
226
 
246
- var toggleCheckAll = React.useCallback(function (showChecked) {
247
- var checkedItems = mergedData.filter(function (item) {
248
- return value.includes(item.id);
249
- });
250
- var items = dropdownItems.filter(function (item) {
251
- return !('groupTitle' in item);
227
+ var valueLatestRef = useLatest.useLatestRef(value);
228
+ var toggleCheckAll = React.useCallback(function () {
229
+ var value = valueLatestRef.current;
230
+
231
+ var _getAllCheckedStatus = index.getAllCheckedStatus(dropdownItems, value, index.isCheckableOption),
232
+ currentAllChecked = _getAllCheckedStatus[0];
233
+
234
+ var shouldChecked = !currentAllChecked; // 当前页的数据选项
235
+
236
+ var items = dropdownItems.filter(index.isCheckableOption);
237
+ var targetIds = items.map(function (_ref) {
238
+ var id = _ref.id;
239
+ return id;
252
240
  });
241
+ var allData = arrayUtils.uniqBy(items.concat(mergedData), 'id');
253
242
 
254
- if (showChecked) {
255
- tryChangeValue(items.map(function (_ref2) {
243
+ if (shouldChecked) {
244
+ var nextCheckedIds = Array.from(new Set(value.concat(targetIds)));
245
+ var changedIds = nextCheckedIds.filter(function (id) {
246
+ return !value.includes(id);
247
+ });
248
+ var changedItems = allData.filter(function (_ref2) {
256
249
  var id = _ref2.id;
257
- return id;
258
- }), checkedItems, showChecked);
250
+ return changedIds.includes(id);
251
+ });
252
+ tryChangeValue(nextCheckedIds, changedItems, shouldChecked);
259
253
  } else {
260
- tryChangeValue([], checkedItems, showChecked);
254
+ var _nextCheckedIds = value.filter(function (id) {
255
+ return !targetIds.includes(id);
256
+ });
257
+
258
+ var _changedIds = value.filter(function (id) {
259
+ return !_nextCheckedIds.includes(id);
260
+ });
261
+
262
+ var _changedItems = allData.filter(function (_ref3) {
263
+ var id = _ref3.id;
264
+ return _changedIds.includes(id);
265
+ }); // items
266
+
267
+
268
+ tryChangeValue(_nextCheckedIds, _changedItems, shouldChecked);
261
269
  }
262
- }, [dropdownItems, mergedData, value, tryChangeValue]);
270
+ }, [dropdownItems, mergedData, valueLatestRef, tryChangeValue]);
263
271
 
264
272
  var renderDefaultFooter = function renderDefaultFooter() {
265
273
  var extra = renderExtraFooter ? renderExtraFooter() : null;
266
274
 
267
275
  if (showCheckAll) {
268
- return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, /*#__PURE__*/React__default['default'].createElement(Checkbox__default['default'], {
269
- indeterminate: indeterminate,
270
- checked: allChecked,
271
- onChange: function onChange(evt) {
272
- toggleCheckAll(evt.target.checked);
273
- }
276
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement(Checkbox__default["default"], {
277
+ indeterminate: showIndeterminate,
278
+ checked: showAllChecked,
279
+ onChange: toggleCheckAll
274
280
  }, i18n.get('checkSelect.checkAll')), extra);
275
281
  }
276
282
 
@@ -278,10 +284,20 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
278
284
  };
279
285
 
280
286
  var expandedViewRef = React.useRef('normal');
287
+ var virtualListProps = {
288
+ height: height,
289
+ itemHeight: itemHeight,
290
+ virtual: virtual,
291
+ data: dropdownItems
292
+ };
293
+
294
+ var _useCheckInVirtual = VirtualList.useCheckInVirtual(virtualListProps),
295
+ inVirtual = _useCheckInVirtual.inVirtual;
296
+
281
297
  var cls = classname.cx(prefixCls, className, prefixCls + "--" + (menuVisible ? 'open' : 'closed'));
282
- return /*#__PURE__*/React__default['default'].createElement(context.CheckSelectProvider, {
298
+ return /*#__PURE__*/React__default["default"].createElement(context.CheckSelectProvider, {
283
299
  value: context$1
284
- }, /*#__PURE__*/React__default['default'].createElement(picker.Picker, Object.assign({
300
+ }, /*#__PURE__*/React__default["default"].createElement(picker.Picker, Object.assign({
285
301
  ref: ref,
286
302
  className: cls
287
303
  }, rootProps, {
@@ -290,15 +306,16 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
290
306
  onOpen: menuVisibleAction.on,
291
307
  onClose: menuVisibleAction.off,
292
308
  searchable: searchable,
309
+ scrollable: !inVirtual,
293
310
  onSearch: funcUtils.callAllFuncs(onSearchProp, onSearch),
294
311
  loading: loading,
295
312
  footer: renderDefaultFooter(),
296
- trigger: /*#__PURE__*/React__default['default'].createElement(tagInput.TagInputMock, {
313
+ trigger: /*#__PURE__*/React__default["default"].createElement(tagInput.TagInputMock, {
297
314
  clearable: clearable,
298
315
  placeholder: placeholder,
299
316
  // @ts-ignore
300
317
  displayRender: displayRender,
301
- suffix: menuVisible ? /*#__PURE__*/React__default['default'].createElement(icons.UpOutlined, null) : /*#__PURE__*/React__default['default'].createElement(icons.DownOutlined, null),
318
+ suffix: menuVisible ? /*#__PURE__*/React__default["default"].createElement(icons.UpOutlined, null) : /*#__PURE__*/React__default["default"].createElement(icons.DownOutlined, null),
302
319
  focused: menuVisible,
303
320
  appearance: appearance,
304
321
  value: value,
@@ -327,6 +344,7 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
327
344
  expandedViewRef.current = 'normal';
328
345
  },
329
346
  expandable: showOnlyShowChecked,
347
+ activeExpandable: activeExpandable,
330
348
  onExpand: function onExpand(evt) {
331
349
  if (!showOnlyShowChecked) return;
332
350
  if (disabled) return; // 阻止冒泡触发外层 onClick
@@ -350,18 +368,14 @@ var CheckSelect = /*#__PURE__*/React.forwardRef(function (_a, ref) {
350
368
  expandedViewRef.current = 'onlyChecked';
351
369
  }
352
370
  })
353
- }), typeAssertion.isArrayNonEmpty(dropdownItems) ? /*#__PURE__*/React__default['default'].createElement(VirtualList__default['default'], {
371
+ }), typeAssertion.isArrayNonEmpty(dropdownItems) ? /*#__PURE__*/React__default["default"].createElement(VirtualList__default["default"], Object.assign({
354
372
  itemKey: "id",
355
- fullHeight: false,
356
- height: height,
357
- itemHeight: itemHeight,
358
- virtual: virtual,
359
- data: dropdownItems
360
- }, function (node) {
373
+ fullHeight: false
374
+ }, virtualListProps), function (node) {
361
375
  /* 反向 map,搜索删选数据时会对数据进行处理 */
362
- return 'groupTitle' in node ? /*#__PURE__*/React__default['default'].createElement(CheckSelectOptionGroup, {
376
+ return 'groupTitle' in node ? /*#__PURE__*/React__default["default"].createElement(CheckSelectOptionGroup, {
363
377
  label: node.groupTitle
364
- }) : /*#__PURE__*/React__default['default'].createElement(CheckSelectOption, {
378
+ }) : /*#__PURE__*/React__default["default"].createElement(CheckSelectOption, {
365
379
  option: node,
366
380
  depth: node.depth,
367
381
  titleRender: proxyTitleRender
@@ -411,14 +425,14 @@ var CheckSelectOption = /*#__PURE__*/React.forwardRef(function (_a, ref) {
411
425
  var renderTitle = React.useCallback(function (node, titleRender) {
412
426
  // 如果 titleRender 返回 `true`,则使用默认 title
413
427
  var title = titleRender ? titleRender(node) : true;
414
- return /*#__PURE__*/React__default['default'].createElement("div", {
428
+ return /*#__PURE__*/React__default["default"].createElement("div", {
415
429
  className: prefixCls + "__title"
416
- }, title === true ? /*#__PURE__*/React__default['default'].createElement(Checkbox__default['default'], {
430
+ }, title === true ? /*#__PURE__*/React__default["default"].createElement(Checkbox__default["default"], {
417
431
  checked: node.checked,
418
432
  disabled: node.disabled
419
433
  }, node.title) : title);
420
434
  }, [prefixCls]);
421
- return /*#__PURE__*/React__default['default'].createElement("div", Object.assign({
435
+ return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
422
436
  ref: ref,
423
437
  className: cls
424
438
  }, rest, {
@@ -445,10 +459,10 @@ var CheckSelectOptionGroup = /*#__PURE__*/React.forwardRef(function (_a, ref) {
445
459
  rest = tslib.__rest(_a, ["prefixCls", "className", "label"]);
446
460
 
447
461
  var cls = classname.cx(prefixCls, className);
448
- return /*#__PURE__*/React__default['default'].createElement("div", Object.assign({
462
+ return /*#__PURE__*/React__default["default"].createElement("div", Object.assign({
449
463
  ref: ref,
450
464
  className: cls
451
- }, rest), /*#__PURE__*/React__default['default'].createElement("span", null, label));
465
+ }, rest), /*#__PURE__*/React__default["default"].createElement("span", null, label));
452
466
  }); // @ts-ignore
453
467
 
454
468
  CheckSelectOptionGroup.HiName = 'CheckSelectOptionGroup';
@@ -462,13 +476,13 @@ if (env.__DEV__) {
462
476
 
463
477
 
464
478
  var renderIndent = function renderIndent(prefixCls, depth) {
465
- return times.times(depth, function (index) {
466
- return /*#__PURE__*/React__default['default'].createElement("span", {
479
+ return arrayUtils.times(depth, function (index) {
480
+ return /*#__PURE__*/React__default["default"].createElement("span", {
467
481
  key: index,
468
482
  style: {
469
483
  alignSelf: 'stretch'
470
484
  }
471
- }, /*#__PURE__*/React__default['default'].createElement("span", {
485
+ }, /*#__PURE__*/React__default["default"].createElement("span", {
472
486
  className: classname.cx(prefixCls + "__indent")
473
487
  }));
474
488
  });
@@ -477,4 +491,3 @@ var renderIndent = function renderIndent(prefixCls, depth) {
477
491
  exports.CheckSelect = CheckSelect;
478
492
  exports.CheckSelectOption = CheckSelectOption;
479
493
  exports.CheckSelectOptionGroup = CheckSelectOptionGroup;
480
- //# sourceMappingURL=CheckSelect.js.map
@@ -2,7 +2,7 @@
2
2
  * @hi-ui/check-select
3
3
  * https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-select#readme
4
4
  *
5
- * Copyright (c) HIUI <mi-hiui@xiaomi.com>.
5
+ * Copyright (c) HiUI <mi-hiui@xiaomi.com>.
6
6
  *
7
7
  * This source code is licensed under the MIT license found in the
8
8
  * LICENSE file in the root directory of this source tree.
@@ -30,4 +30,3 @@ var useCheckSelectContext = function useCheckSelectContext() {
30
30
 
31
31
  exports.CheckSelectProvider = CheckSelectProvider;
32
32
  exports.useCheckSelectContext = useCheckSelectContext;
33
- //# sourceMappingURL=context.js.map
@@ -2,7 +2,7 @@
2
2
  * @hi-ui/check-select
3
3
  * https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-select#readme
4
4
  *
5
- * Copyright (c) HIUI <mi-hiui@xiaomi.com>.
5
+ * Copyright (c) HiUI <mi-hiui@xiaomi.com>.
6
6
  *
7
7
  * This source code is licensed under the MIT license found in the
8
8
  * LICENSE file in the root directory of this source tree.
@@ -101,4 +101,3 @@ var parseOptionGroup = function parseOptionGroup(node) {
101
101
 
102
102
  exports.parseChildren = parseChildren;
103
103
  exports.useData = useData;
104
- //# sourceMappingURL=use-data.js.map
@@ -2,7 +2,7 @@
2
2
  * @hi-ui/check-select
3
3
  * https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-select#readme
4
4
  *
5
- * Copyright (c) HIUI <mi-hiui@xiaomi.com>.
5
+ * Copyright (c) HiUI <mi-hiui@xiaomi.com>.
6
6
  *
7
7
  * This source code is licensed under the MIT license found in the
8
8
  * LICENSE file in the root directory of this source tree.
@@ -75,4 +75,3 @@ var flattenData = function flattenData(_ref2) {
75
75
 
76
76
  exports.flattenData = flattenData;
77
77
  exports.useFlattenData = useFlattenData;
78
- //# sourceMappingURL=use-flatten-data.js.map
package/lib/cjs/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * @hi-ui/check-select
3
3
  * https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-select#readme
4
4
  *
5
- * Copyright (c) HIUI <mi-hiui@xiaomi.com>.
5
+ * Copyright (c) HiUI <mi-hiui@xiaomi.com>.
6
6
  *
7
7
  * This source code is licensed under the MIT license found in the
8
8
  * LICENSE file in the root directory of this source tree.
@@ -21,4 +21,3 @@ exports.CheckSelect = CheckSelect.CheckSelect;
21
21
  exports.CheckSelectOption = CheckSelect.CheckSelectOption;
22
22
  exports.CheckSelectOptionGroup = CheckSelect.CheckSelectOptionGroup;
23
23
  exports["default"] = CheckSelect.CheckSelect;
24
- //# sourceMappingURL=index.js.map
@@ -2,7 +2,7 @@
2
2
  * @hi-ui/check-select
3
3
  * https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-select#readme
4
4
  *
5
- * Copyright (c) HIUI <mi-hiui@xiaomi.com>.
5
+ * Copyright (c) HiUI <mi-hiui@xiaomi.com>.
6
6
  *
7
7
  * This source code is licensed under the MIT license found in the
8
8
  * LICENSE file in the root directory of this source tree.
@@ -12,11 +12,10 @@
12
12
  Object.defineProperty(exports, '__esModule', {
13
13
  value: true
14
14
  });
15
- var css_248z = "@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n@use 'sass:map';\n.hi-v4-check-select-option {\n margin-top: var(--hi-v4-spacing-2, 4px);\n margin-bottom: var(--hi-v4-spacing-2, 4px);\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n width: 100%;\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n position: relative;\n border-radius: var(--hi-v4-border-radius-normal, 4px);\n cursor: pointer;\n font-size: var(--hi-v4-text-size-normal, 0.875rem);\n font-weight: var(--hi-v4-text-weight-normal, 400);\n color: var(--hi-v4-color-gray-700, #1f2733);\n line-height: var(--hi-v4-text-lineheight-sm, 1.25rem); }\n.hi-v4-check-select-option__indent {\n display: inline-block;\n width: 16px;\n height: 100%; }\n.hi-v4-check-select-option__title {\n display: inline-block;\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n width: 100%;\n padding: var(--hi-v4-spacing-3, 6px);\n font-size: inherit;\n font-weight: inherit;\n color: inherit;\n line-height: inherit; }\n.hi-v4-check-select-option:hover {\n background-color: var(--hi-v4-color-gray-100, #f2f4f7); }\n.hi-v4-check-select-option--focused {\n background-color: var(--hi-v4-color-gray-100, #f2f4f7); }\n.hi-v4-check-select-option--disabled {\n cursor: not-allowed;\n color: var(--hi-v4-color-gray-500, #929aa6); }\n.hi-v4-check-select-option-group {\n display: inline-block;\n margin-top: var(--hi-v4-spacing-6, 12px);\n margin-bottom: var(--hi-v4-spacing-2, 4px);\n padding: var(--hi-v4-spacing-3, 6px) 0 var(--hi-v4-spacing-3, 6px) var(--hi-v4-spacing-3, 6px);\n font-size: var(--hi-v4-text-size-normal, 0.875rem);\n font-weight: var(--hi-v4-text-weight-normal, 400);\n color: var(--hi-v4-color-gray-500, #929aa6);\n line-height: var(--hi-v4-text-lineheight-sm, 1.25rem); }\n.hi-v4-check-select-option-group:first-child {\n margin-top: var(--hi-v4-spacing-2, 4px); }\n";
15
+ var css_248z = ".hi-v4-check-select-option {margin-top: var(--hi-v4-spacing-2, 4px);margin-bottom: var(--hi-v4-spacing-2, 4px);-webkit-box-sizing: border-box;box-sizing: border-box;width: 100%;display: -webkit-box;display: -ms-flexbox;display: flex;-webkit-box-align: center;-ms-flex-align: center;align-items: center;position: relative;border-radius: var(--hi-v4-border-radius-md, 4px);cursor: pointer;font-size: var(--hi-v4-text-size-md, 0.875rem);font-weight: var(--hi-v4-text-weight-normal, 400);color: var(--hi-v4-color-gray-700, #1f2733);line-height: var(--hi-v4-text-lineheight-sm, 1.25rem); }.hi-v4-check-select-option__indent {display: inline-block;width: 16px;height: 100%; }.hi-v4-check-select-option__title {display: inline-block;-webkit-box-sizing: border-box;box-sizing: border-box;width: 100%;padding: var(--hi-v4-spacing-3, 6px);font-size: inherit;font-weight: inherit;color: inherit;line-height: inherit; }.hi-v4-check-select-option:hover {background-color: var(--hi-v4-color-gray-100, #f2f4f7); }.hi-v4-check-select-option--focused {background-color: var(--hi-v4-color-gray-100, #f2f4f7); }.hi-v4-check-select-option--disabled {cursor: not-allowed;color: var(--hi-v4-color-gray-500, #929aa6); }.hi-v4-check-select-option-group {display: inline-block;margin-top: var(--hi-v4-spacing-6, 12px);margin-bottom: var(--hi-v4-spacing-2, 4px);padding: var(--hi-v4-spacing-3, 6px) 0 var(--hi-v4-spacing-3, 6px) var(--hi-v4-spacing-3, 6px);font-size: var(--hi-v4-text-size-md, 0.875rem);font-weight: var(--hi-v4-text-weight-normal, 400);color: var(--hi-v4-color-gray-500, #929aa6);line-height: var(--hi-v4-text-lineheight-sm, 1.25rem); }.hi-v4-check-select-option-group:first-child {margin-top: var(--hi-v4-spacing-2, 4px); }";
16
16
 
17
- var __styleInject__ = require('style-inject/dist/style-inject.es.js')["default"];
17
+ var __styleInject__ = require('inject-head-style')["default"];
18
18
 
19
19
  __styleInject__(css_248z);
20
20
 
21
21
  exports["default"] = css_248z;
22
- //# sourceMappingURL=index.scss.js.map
@@ -2,7 +2,7 @@
2
2
  * @hi-ui/check-select
3
3
  * https://github.com/XiaoMi/hiui/tree/master/packages/ui/check-select#readme
4
4
  *
5
- * Copyright (c) HIUI <mi-hiui@xiaomi.com>.
5
+ * Copyright (c) HiUI <mi-hiui@xiaomi.com>.
6
6
  *
7
7
  * This source code is licensed under the MIT license found in the
8
8
  * LICENSE file in the root directory of this source tree.
@@ -65,33 +65,34 @@ var useCheckSelect = function useCheckSelect(_a) {
65
65
  tryChangeValue = _useUncontrolledState[1];
66
66
 
67
67
  var onSelectLatest = useLatest.useLatestCallback(onSelect);
68
- var selectedItemsRef = React.useRef([]);
68
+ var usedItemsRef = React.useRef([]); // 扁平化的选中数据,可能包括异步临时选中缓存数据
69
+
70
+ var _useState = React.useState([]),
71
+ checkedItems = _useState[0],
72
+ setCheckedItems = _useState[1];
73
+
69
74
  var proxyTryChangeValue = React.useCallback(function (value, item, shouldChecked) {
70
75
  var changedItems = item;
71
76
 
72
77
  if (!Array.isArray(item)) {
73
78
  changedItems = [item];
74
-
75
- if (shouldChecked) {
76
- selectedItemsRef.current.push(item);
77
- }
78
-
79
79
  onSelectLatest(value, item, shouldChecked);
80
80
  }
81
81
 
82
- var selectedItems = arrayUtils.uniqBy([].concat(changedItems, selectedItemsRef.current, flattedDataRef.current), 'id'); // 调用用户的select
82
+ var usedItems = arrayUtils.uniqBy([].concat(changedItems, usedItemsRef.current, flattedDataRef.current), 'id');
83
+ usedItemsRef.current = usedItems; // 使用最新的value
83
84
 
84
- var checkedItems = selectedItems // 使用最新的value
85
- .filter(function (item) {
85
+ var nextCheckedItems = usedItems.filter(function (item) {
86
86
  return value.includes(item.id);
87
- }).map(function (item) {
88
- return 'raw' in item ? item.raw : item;
89
87
  });
90
- tryChangeValue(value, // TODO: 处理脏数据
88
+ setCheckedItems(nextCheckedItems);
89
+ tryChangeValue(value, // 处理脏数据
91
90
  changedItems.map(function (item) {
92
91
  return 'raw' in item ? item.raw : item;
93
- }), checkedItems);
94
- }, [tryChangeValue, onSelectLatest, flattedDataRef, selectedItemsRef]);
92
+ }), nextCheckedItems.map(function (item) {
93
+ return 'raw' in item ? item.raw : item;
94
+ }));
95
+ }, [tryChangeValue, onSelectLatest, flattedDataRef, usedItemsRef]);
95
96
 
96
97
  var _useCheckDefault = useCheck.useCheck({
97
98
  disabled: disabled,
@@ -109,7 +110,8 @@ var useCheckSelect = function useCheckSelect(_a) {
109
110
  value: value,
110
111
  tryChangeValue: proxyTryChangeValue,
111
112
  onSelect: onOptionCheck,
112
- isCheckedId: isCheckedId
113
+ isCheckedId: isCheckedId,
114
+ checkedItems: checkedItems
113
115
  };
114
116
  };
115
117
 
@@ -118,4 +120,3 @@ var allowCheck = function allowCheck(option) {
118
120
  };
119
121
 
120
122
  exports.useCheckSelect = useCheckSelect;
121
- //# sourceMappingURL=use-check-select.js.map